• OpenCV 01(图像加载与显示)


    一、机器视觉

    现在说的机器视觉(Machine Vision)一般指计算机视觉(Computer Vision), 简单来说就是研究如何使机器看懂东西。就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。

    1.1 机器视觉的应用

    人脸识别, 车辆检测,识别图像中的文字(OCR),图像拼接, 修复, 背景替换

    二、OpenCV

    Gray Bradsky于1999年开发, 2000年发布
    C++, Python, Java, JS
    跨平台(Windows, Linux, Mac...)

    • core模块实现了最核心的数据结构及其基本运算,如绘图函数、数组操作相关函数等。
    • highgui模块实现了视频与图像的读取、显示、存储等接口。
    • imgproc模块实现了图像处理的基础方法,包括图像滤波、图像的几何变换、平滑、阈值分割、形态学处理、边缘检测、目标检测、运动分析和对象跟踪等。

    对于图像处理其他更高层次的方向及应用,OpenCV也有相关的模块实现

    • features2d模块用于提取图像特征以及特征匹配,nonfree模块实现了一些专利算法,如sift特征。
    • objdetect模块实现了一些目标检测的功能,经典的基于Haar、LBP特征的人脸检测,基于HOG的行人、汽车等目标检测,分类器使用Cascade Classification(级联分类)和Latent SVM等。
    • stitching模块实现了图像拼接功能。
    • FLANN模块(Fast Library for Approximate Nearest Neighbors),包含快速近似最近邻搜索FLANN 和聚类Clustering算法。
    • ml模块机器学习模块(SVM,决策树,Boosting等等)。
    • photo模块包含图像修复和图像去噪两部分。
    • video模块针对视频处理,如背景分离,前景检测、对象跟踪等。
    • calib3d模块即Calibration(校准)3D,这个模块主要是相机校准和三维重建相关的内容。包含了基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
    • G-API模块包含超高效的图像处理pipeline引擎

    学习opencv可以:

    • 了解OpenCV的运行机制
    • 可以使用OpenCV处理一些图像常见问题
    • 学会物体识别, 文字识别等问题的处理思路

    2.1 安装OpenCV 

    使用服务器虚拟环境安装:

    pip install opencv-python==4.7.0.72


    安装opencv扩展包(选装):

    pip install opencv-contrib-python==4.7.0.72

    如果装不了去:https://www.lfd.uci.edu/~gohlke/pythonlibs/下载相应的包手动安装.

    三、OpenCV读取与显示

    3.1 创建窗口

    namedWindow() 创建命名窗口
    
    # WINDOW_AUTOSIZE 窗口大小不允许修改
    cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE) 
    
    # WINDOW_NORMAL可以让窗口大小变得可以调节
    # cv2.namedWindow('new', cv2.WINDOW_NORMAL)
    
    # 修改窗口大小
    # cv2.resizeWindow('new', 1920, 1080)
    
    imshow('new', 显示内容) 显示窗口
    # 销毁图像窗口 cv2.destroyAllWindows()
    
    
    # waitKey方法表示等待按键, 0表示任何按键, 其他整数表示等待按键的时间,单位是毫秒, 超过时间没有发生按键操作窗口会自动关闭.
    waitKey() 等待用户输入
    
    
    
    # 会返回按键的ascii的值
    # key = cv2.waitKey(0)
    if key == ord('q'):
    cv2.destroyAllWindows()

    ord()获取ascii值


     

    3.2 图片读写

    使用imread可以读取图片, 默认读取的是彩色图片.
    imread(path, flag)
    imwrite(path, img): 使用imwrite保存图片

    1. cv2.imread('01_Picture/01_cat.jpg')
    2. cv2.imshow('cat',img)
    3. cv2.waitKey(0)

     使用matplotlib显示`plt.imshow(img)`

    1. import matplotlib.pyplot as plt
    2. img= cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\cat.jpeg')
    3. plt.imshow(img)
    4. plt.show()

    因为OpenCV读取的图片颜色通道是按照BGR(蓝绿红)排列的, 一般图片通道都是按照RGB来排列的.为了正常的显示猫的图片, 我们要用OpenCV的图像显示方法:

    3.3 视频播放和录制

    视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是30帧, 表示一秒显示30张图片

    cv2.VideoCapture可以捕获摄像头, 用数字来表示不同的设备, 比如0, 1
    vc = cv2.VideoCapture('./1.mp4')  # 打开视频文件
    vc = cv2.VideoCapture(0)  # 打开摄像头

    1. import cv2
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    5. cv2.resizeWindow('video', 640, 480)
    6. vc = cv2.VideoCapture(0) #打开摄像头
    7. while True:
    8. # vc.read() 返回两个值, 第一个为状态值, 读到帧为True, 第二个值为视频帧
    9. ret, frame = vc.read()
    10. if not ret:
    11. break
    12. cv2.imshow('video',frame) # 将视频帧放在窗口中显示
    13. key= cv2.waitKey(10)
    14. if key & 0xFF == ord('q'):
    15. break
    16. # 释放
    17. vc.release()
    18. cv2.destroyAllWindows()

    录制视频

    1. cap = cv2.VideoCapture(0)
    2. # *mp4v就是解包操作 等同于 'm', 'p', '4', 'v'
    3. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    4. # (640, 480)表示摄像头拍视频, 这个大小搞错了也不行.
    5. # 主要是这个分辨率.
    6. vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
    7. while cap.isOpened():
    8. ret, frame = cap.read()
    9. if not ret:
    10. print('can not recive frame, Exiting...')
    11. break
    12. vw.write(frame)
    13. cv2.imshow('frame', frame)
    14. if cv2.waitKey(1) == ord('q'):
    15. break
    16. cap.release()
    17. #释放VideoWriter
    18. vw.release()
    19. cv2.destroyAllWindows()

    - VideoWriter : 参数一为输出文件, 参数二为多媒体文件格式(VideoWriter_fourcc, 参数三为帧率, 参数四为分辨率.
    - write 编码并写入缓存
    - release 缓存内容写入磁盘, 并释放资源

    3.4 控制鼠标

    OpenCV允许我们对窗口上的鼠标动作做出响应.

    setMouseCallback(winname, callback, userdata) winname是窗口的名字, callback是回调函数, userdata是给回调函数的参数.

    callback(event, x, y, flags, userdata)回调函数必须包含这5个参数. event是事件(鼠标移动, 左键, 右键等), x,y是点鼠标的坐标点, flags主要用于组合键, userdata就是上面的setMouseCallback的userdata

      鼠标事件: 

      - EVENT_MOUSEMOVE   0     鼠标移动
      - EVENT_LBUTTONDOWN   1   按下鼠标左键
      - EVENT_RBUTTONDOWN   2  按下鼠标右键
      - EVENT_MBUTTONDOWN  3 按下鼠标中键
      - EVENT_LBUTTONUP    4      左键释放
      - EVENT_RBUTTONUP   5      右键释放
      - EVENT_MBUTTONUP   6     中键释放
      - EVENT_LBUTTONDBLCLK 7 左键双击
      - EVENT_RBUTTONDBLCLK  8 右键双击
      - EVENT_MBUTTONDBLCLK  9 中键双击
      - EVENT_MOUSEWHEEL  10 鼠标滚轮上下滚动
      - EVENT_MOUSEHWHEEL 11 鼠标左右滚动

      flags:

      - EVENT_FLAG_LBUTTON    1  按下左键
      - EVENT_FLAG_RBUTTON    2  按下右键
      - EVENT_FLAG_MBUTTON   4 按下中键
      - EVENT_FLAG_CRTLKEY    8   按下ctrl键
      - EVENT_FLAG_SHIFTKEY   16  按下shift键
      - EVENT_FLAG_ALTKEY       32  按下alt键

    1. import cv2
    2. import numpy as np
    3. def mouse_callback(event, x, y, flags, userdata):
    4. print(event, x, y, flags, userdata)
    5. cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
    6. cv2.resizeWindow('mouse', 640, 360)
    7. # 设置鼠标回调函数
    8. cv2.setMouseCallback('mouse', mouse_callback, '123')
    9. # 显示窗口和背景
    10. # 生成全黑的图片
    11. img = np.zeros((360, 640, 3), np.uint8)
    12. while True:
    13. cv2.imshow('mouse', img)
    14. key = cv2.waitKey(1)
    15. if key & 0xFF == ord('q'):
    16. break
    17. cv2.destroyAllWindows()

    3.5 TrackBar控件

    - createTrackbar(trackbarname, winname, value, count, onChange) 创建TrackBar控件, value为trackbar的默认值, count为bar的最大值, 最小为0
    - getTrackbarPos(trackbarname, winname) 获取TrackBar当前值

    1. import cv2
    2. import numpy as np
    3. # 创建窗口
    4. cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
    5. cv2.resizeWindow('mouse', 640, 480)
    6. # 定义回调函数
    7. def callback(value):
    8. print(value)
    9. # 创建trackbar
    10. cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
    11. cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
    12. cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
    13. # 创建一个背景图片
    14. img = np.zeros((480,640,3), np.uint8)
    15. while True:
    16. # 获取当前trackbar的值
    17. r = cv2.getTrackbarPos('R', 'trackbar')
    18. g = cv2.getTrackbarPos('G', 'trackbar')
    19. b = cv2.getTrackbarPos('B', 'trackbar')
    20. # 改变背景图颜色
    21. img[:] = [b, g, r]
    22. cv2.imshow('trackbar', img)
    23. key = cv2.waitKey(1)
    24. if key & 0xFF == ord('q'):
    25. break
    26. cv2.destroyAllWindows()

  • 相关阅读:
    C语言——计算数组长度
    Java中的UDP通信(网络编程 一)
    服务器租用机房机房的类型应该如何选择
    小目标检测:基于切图检测的yolov5小目标检测
    Python新手入门
    lsblk 硬盘属性查看
    锐捷OSPF基础实验配置
    【无标题】
    SpringBoot开发之SpringJDBC
    Stable Diffusion源码调试(一)
  • 原文地址:https://blog.csdn.net/peng_258/article/details/132761710