飞道的博客

OpenCV 车辆检测/人脸识别+图像拼接+文字识别

258人阅读  评论(0)

一、开发环境搭建

命令行安装方式 - mac        


  
  1. brew install python@3.9
  2. pip3 install numpy matplotlib opencv_python
  3.  // numpy          - 矩阵操作
  4.              // matplotlib      - 显示
  5. // 测试是否安装成功(import 无报错信息 表示安装成功)
  6. MacintoshdeMacBook-Pro:~ Jartin$ python3
  7. Python 3.9.1 (default, Jan  8 2021, 17:15:36) 
  8. [Clang 11.0.0 (clang-1100.0.33.17)] on darwin
  9. Type "help", "copyright", "credits" or "license" for more information.
  10. >>> import numpy
  11. >>> import matplotlib
  12. >>> import cv2


二、图像 视频加载与展示

  • API介绍
  1. namedWindow()             窗口标号
  2. imshow()                 窗口展示
  3. destroyAllWindows()     销毁所有窗口
  4. resizeWindow             窗口大小

  
  1. import cv2;
  2. # 创建窗口
  3. cv2.namedWindow( 'new', cv2.WINDOW_NORMAL);
  4. # WINDOW_AUTOSIZE 不可以resize
  5. # WINDOW_NORMAL   可以resize
  6. # 设定窗口大小
  7. cv2.resizeWindow( 'new', 1920, 1080)
  8. # 展示窗口
  9. cv2.imshow( 'new', 0);
  10. # 键盘和鼠标的监听 实现
  11. key = cv2.waitKey( 0)
  12. if(key == 'q'):
  13. exit()
  14. # 销毁所有窗口
  15. cv2.destroyAllWindows();

  
  1. import cv2;
  2. # 图片加载
  3. cv2.namedWindow( 'img', cv2.WINDOW_NORMAL);
  4. img = cv2.imread( './jobs.jpeg');
  5. cv2.imshow( 'img', img)
  6. key = cv2.waitKey( 0)
  7. if (key & 0xFF == ord( 'q')):
  8. cv2.destroyAllWindows();
  • 视频采集
  1. VideoCapure()            虚拟采集器
  2. cap.read()                将视频帧处理
  3. cap.release()            释放资源

  
  1. import cv2;
  2. # 使用opencv 的 videocapture采集视频数据
  3. # 创建窗口
  4. cv2.namedWindow( 'video', cv2.WINDOW_NORMAL);
  5. cv2.resizeWindow( 'video', 640, 480);
  6. # 获取视频设备
  7. cap = cv2.VideoCapture( 0);
  8. while True:
  9. # 从摄像头读取视频帧
  10. ret, frame = cap.read();
  11. # 将视频帧在窗口中显示
  12. cv2.imshow( 'video', frame);
  13. # 等待键盘事件,如果q,退出 waitKey(1)帧率越小 视频越流畅
  14. key = cv2.waitKey( 1);
  15. if (key & 0xFF == ord( 'q')):
  16. break;
  17.                     
  18. # 释放VideoCapture
  19. cap.release();
  20. cv2.destroyAllWindows();

  
  1. import cv2;
  2. # 读取视频文件
  3. # 创建窗口
  4. cv2.namedWindow( 'video', cv2.WINDOW_NORMAL);
  5. cv2.resizeWindow( 'video', 640, 480);
  6. # 获取视频设备 / 从视频文件中读取视频帧
  7. cap = cv2.VideoCapture( 0);
  8. cap = cv2.VideoCapture( '/Users/Jartin/Desktop/opencv/zl.mp4');
  9. while True:
  10. # 从摄像头读取视频帧
  11. ret, frame = cap.read();
  12. # 将视频帧在窗口中显示
  13. cv2.imshow( 'video', frame);
  14. # 等待键盘事件 如果q退出
  15. key = cv2.waitKey( 1);
  16. if (key & 0xFF == ord( 'q')):
  17. break;
  18. # 释放rediocap
  19. cap.release();
  20. cv2.destroyAllWindows();

  
  1. import cv2;
  2. # 视频录制
  3. # 创建videowrite为写多媒体文件
  4. fourcc = cv2.VideoWriter_fourcc(* 'MJPG');
  5. # 路径、 forcc、帧率、分辨率
  6. vw = cv2.VideoWriter( './out.mp4', fourcc, 25, ( 1280, 720))
  7. # 创建窗口
  8. cv2.namedWindow( 'video', cv2.WINDOW_NORMAL);
  9. cv2.resizeWindow( 'video', 640, 360);
  10. # 获取视频设备
  11. cap = cv2.VideoCapture( 0);
  12. while True:
  13. # 从摄像头读取数据
  14. ret, frame = cap.read();
  15. # 将视频帧在窗口显示
  16. cv2.imshow( 'video', frame);
  17. # 写数据到多媒体文件
  18. vw.write(frame);
  19.                     
  20. # 等待键盘事件 如果为q退出
  21. key = cv2.waitKey( 1);
  22. if (key & 0xFF == ord( 'q')):
  23. break;
  24.                         
  25. # 释放videocapture
  26. cap.release();
  27. # 释放videowrite资源
  28. vw.release();
  29. cv2.destroyAllWindows();

  
  1. import cv2;
  2. import numpy as np;
  3. # 控制鼠标 鼠标回调函数
  4. def mouse_callback(event, x, y, flags, userdata):
  5. print(event, x, y, flags, userdata);
  6. # 创建窗口
  7. cv2.namedWindow( 'mouse', cv2.WINDOW_NORMAL);
  8. cv2.resizeWindow( 'mouse', 640, 360);
  9. # 设置鼠标回调
  10. cv2.setMouseCallback( 'mouse', mouse_callback, '123');
  11. # 显示窗口和背景 
  12. # numpy图片组件、np.zeros显示图片、(高, 宽, bgr3种数组)、np.uint8像素类型
  13. img = np.zeros(( 360, 640, 3), np.uint8);
  14. while True:
  15. cv2.imshow( 'mouse', img);
  16. key = cv2.waitKey( 1);
  17. if key & 0xFF == ord( 'q'):
  18. break;
  19.                 
  20. cv2.destroyAllWindows();
  •  TrackBar 控件
  1. createTrackbar     创建TrackBar
  2. getTrackPos        获取TrackBar

  
  1. import cv2;
  2. import numpy as np;
  3. def callback():
  4. pass;
  5. # 创建窗口
  6. cv2.namedWindow( 'trackbar', cv2.WINDOW_NORMAL);
  7. # 创建trackbar     名字、窗口名字、默认当前值、最大值、回调方法
  8. cv2.createTrackbar( 'R', 'trackbar', 0, 255, callback);
  9. cv2.createTrackbar( 'G', 'trackbar', 0, 255, callback);
  10. cv2.createTrackbar( 'B', 'trackbar', 0, 255, callback);
  11. # 创建图片
  12. img = np.zeros(( 480, 640, 3), np.uint8);
  13. while True:
  14. # 读取值
  15. r = cv2.getTrackbarPos( 'R', 'trackbar');
  16. g = cv2.getTrackbarPos( 'G', 'trackbar');
  17. b = cv2.getTrackbarPos( 'B', 'trackbar');
  18. img[:] = [b, g, r];
  19. cv2.imshow( 'trackbar', img);
  20. key = cv2.waitKey( 10);
  21. if key & 0xFF == ord( 'q'):
  22. break;
  23. cv2.destroyAllWindows();
  •   色彩空间
  1. RGB与BGR
  2. RGB 人眼色彩空间
  3. OpenCV 默认使用BGR
  4. HSV/HSB/HSL 色相、饱和度、明亮度
  5. YUV 视频存储

  
  1. import cv2;
  2. import numpy as np;
  3. def callback():
  4. pass;
  5. # 创建窗口
  6. cv2.namedWindow( 'trackbar', cv2.WINDOW_NORMAL);
  7. # 创建trackbar     名字、窗口名字、默认当前值、最大值、回调方法
  8. cv2.createTrackbar( 'R', 'trackbar', 0, 255, callback);
  9. cv2.createTrackbar( 'G', 'trackbar', 0, 255, callback);
  10. cv2.createTrackbar( 'B', 'trackbar', 0, 255, callback);
  11. # 创建图片
  12. img = np.zeros(( 480, 640, 3), np.uint8);
  13. while True:
  14. # 读取值
  15. r = cv2.getTrackbarPos( 'R', 'trackbar');
  16. g = cv2.getTrackbarPos( 'G', 'trackbar');
  17. b = cv2.getTrackbarPos( 'B', 'trackbar');
  18. img[:] = [b, g, r];
  19. cv2.imshow( 'trackbar', img);
  20. key = cv2.waitKey( 10);
  21. if key & 0xFF == ord( 'q'):
  22. break;
  23. cv2.destroyAllWindows();

        HSV     Hue:色相、红色、蓝色、绿色
                Saturation:饱和度,颜色的纯度
                Value:明度

        YUV     视频中常用
                对像素的描述 Y数据 UV彩色信息

  • 色彩空间转换

  
  1. import cv2;
  2. def callback():
  3. pass;
  4. cv2.namedWindow( 'color', cv2.WINDOW_NORMAL);
  5. img = cv2.imread( './jobs.jpeg');
  6. colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV, cv2.COLOR_BGR2YUV];
  7. cv2.createTrackbar( 'curcolor', 'color', 0, 4, callback);
  8. while True:
  9. index = cv2.getTrackbarPos( 'curcolor', 'color');
  10. # 颜色空间转换API
  11. cvt_img = cv2.cvtColor(img, colorspaces[index]);
  12. cv2.imshow( 'color', img)
  13. key = cv2.waitKey( 10);
  14. if key & 0xFF == ord( 'q'):
  15. break;
  16. cv2.destroyAllWindows();
  • Numpy 图像基础操作
  1. opencv中用到的矩阵都要转换成Numpy数组
  2. Numpy是一个经高度优化的Python数值库
  • 基本操作
  1. 创建数组        array()
  2. 创建全0数组     zeros() / ones
  3. 创建全值数组     full()
  4. 创建单元数组     identity / eye()

  
  1. import numpy as np
  2. # np.zeros((行的个数, 列的个数, 通道数/层数), 矩阵中的数据类型);
  3. c = np.zeros(( 480, 640, 3), np.uint8);
  4. print(c)

矩阵的检索与赋值
             ROI   [y1:y2,x1:x2]

Mat是什么
             是矩阵,可以理解为一张图 有head 与 body组成

  • Mat的深拷贝与浅拷贝

  
  1. import cv2
  2. import numpy as np
  3. img = cv2.imread( './1.jpeg');
  4. # 浅拷贝
  5. img2 = img;
  6. # 深拷贝
  7. img3 = img.copy();
  8. img[ 10: 100, 10: 100] = [ 0, 0, 255]
  9. cv2.imshow( 'img', img)
  10. cv2.imshow( 'img2', img2)
  11. cv2.imshow( 'img3', img3)
  12. cv2.waitKey( 0);
  • 图像的多种属性

  
  1. import cv2;
  2. import numpy as numpy
  3. img = cv2.imread( './1.jpeg')
  4. # (1200, 1920, 3)  高度、长度、通道数
  5. print(img.shape)
  6. # 6912000  高度 * 长度 * 3
  7. print(img.size)
  8. # uint8 图像中每个元素的位深
  9. print(img.dtype)
  • 通道的分离与合并

  
  1. import cv2;
  2. import numpy as np
  3. # 通道的分离与合并
  4. img = np.zeros(( 480, 640, 3), np.uint8)
  5. b,g,r = cv2.split(img);
  6. b[ 10: 100, 10: 100] = 255;
  7. g[ 10: 100, 10: 100] = 255;
  8. img2 = cv2.merge((b, g, r))
  9. cv2.imshow( 'img', img);
  10. cv2.imshow( 'b', b);
  11. cv2.imshow( 'g', g);
  12. cv2.imshow( 'img2', img2);
  13. cv2.waitKey( 0);

三、绘制基本图形

  • 线、矩形、圆
  • 椭圆、多边形、绘制字体

  
  1. import cv2;
  2. import numpy as np;
  3. # 绘制直线
  4. img = cv2.imread( './1.jpeg')
  5. cv2.line(img, ( 10, 20), ( 10, 900), ( 0, 0, 255), 20, 4);
  6. cv2.line(img, ( 100, 12), ( 400, 100), ( 0, 0, 255), 20, 14);
  7. cv2.imshow( 'img', img);
  8. key = cv2.waitKey( 0);

  
  1. import cv2;
  2. import numpy as np;
  3. img = cv2.imread( './1.jpeg');
  4. # cv2.ellipse(img, (500, 500), )
  5. # 画圆
  6. cv2.circle(img, ( 520, 440), 100, ( 0, 0, 255), 10)
  7. cv2.circle(img, ( 520, 440), 5, ( 0, 0, 255), 10)
  8. # 画椭圆 
  9. # 度是按顺时针计算的
  10. cv2.ellipse(img, ( 520, 440), ( 100, 50), 15, 0, 360, ( 0, 0, 255), -1)
  11. # 画多边形
  12. pts = np.array((( 320, 10), ( 150, 100), ( 450, 100)), np.int32)
  13. cv2.polylines(img, [pts], True, ( 0, 0, 255))
  14. # 填充
  15. cv2.fillPoly(img, [pts], ( 255, 255, 0))
  16. # 绘制文本
  17. cv2.putText(img, 'Yulanlan', ( 800, 400), cv2.FONT_HERSHEY_PLAIN, 9, ( 255, 0, 0))
  18. cv2.imshow( 'draw', img);
  19. cv2.waitKey( 0)

 

四、车辆识别    

  • 基本图像运算处理
  • 形态学
  • 轮廓查找
  • 图像运算

            
            待续

        

        


 


转载:https://blog.csdn.net/jartins/article/details/116666426
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场