• 【opencv图像处理】--1. 图像,视频,鼠标,trackbar控件简单使用


    所有代码,复制粘贴即可运行。
    希望有能力的朋友还是拿C++运行一下,python对opencv再封装的时候,少了一些C库中的对象和方法。

    笔者采用jupyter-notebook,python和opencv视觉处理库实现本专栏的功能
    本节讨论对图像、视频的基本使用,以及trackbar的简单使用

    1. 图像处理

    1.1 打开和销毁图像显示窗口

    • 使用可自定义窗口大小
    • ord是计算ASCII的函数,读取键盘q值退出
    • waitKey(0),等待用户读取按键,非0的时候,表示等待图像显示时长,单位毫秒
    • 0xff是C++的习惯,在这里可以不写
    import cv2
    cv2.namedWindow('window', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('window',800,600)
    cv2.imshow('window', 0)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 保存和加载图片

    • cv2.imread默认读取彩色图像
    • cv2.imwrite保存图片至同目录下
    • opencv读进来通道顺序是BGR
    • 故用opencv的展示方法较为方便
    import cv2
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('img', 640, 480)
    # 默认读彩图
    img = cv2.imread('cat.jpeg')
    # numpy 的 ndarray
    while True:
        cv2.imshow('img', img)
        key = cv2.waitKey(0)
        if key & 0xff == ord('q'):
            break
        elif key & 0xff == ord('s'):
            cv2.imwrite('cat_cp.png', img)
        else:
            print(key)
    cv2.destroyAllWindows()
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2. 视频

    2.1 打开摄像头/加载视频

    • 打开的是没有音频的视频,速度全靠waitKey的参数设置
    import cv2
    
    cv2.namedWindow('video', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video', 640, 480)
    
    
    cap0 = cv2.VideoCapture(0)
    # 查看视频,其余以下不变,无声且加速
    # cap0 = cv2.VideoCapture('1.mp4')
    while cap0.isOpened():
        #读一帧数据,返回标记和一帧数据,TRUE表示读到了
        ret, frame = cap0.read()
        
        #根据ret做判断,没读到数据,直接退出
        if not ret:
            break
            
        cv2.imshow('video', frame)
    #     假如一个视频是30帧,那么视频间隔可以自己计算
        key = cv2.waitKey(10)
        
        if key & 0xff == ord('q'):
            break
    
    #释放资源
    cap0.release()
    cv2.destroyAllWindows()
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.2 录制视频和保存视频

    import cv2
    
    cap = cv2.VideoCapture(0)
    
    # *'mp4v'就是解包操作,等同于'm','p','4','v', 在opencv中mp4的完整叫法是mp4v
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    # avi的格式压缩视频内存较大
    ##fourcc = cv2.VideoWriter_fourcc(*'XVID')
    
    
    # 保存函数对象      输出文件, 多媒体格式文件VideoWriter_fourcc, 帧率, 分辨率
    # 主要是这个分辨率
    ##vw = cv2.VideoWriter('output.avi', fourcc, 20, (640, 480))
    vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            print("can not recive frame, Exiting")
            break
        #写一帧数据(写入缓存)
        vw.write(frame)
        cv2.imshow('frame', frame)
        
        if cv2.waitKey(1) == ord('q'):
            break
            
    #释放videoWriter,在release后才会把缓存的数据写到磁盘
    cap.release()
    vw.release() 
    cv2.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3 鼠标

    鼠标在选定的窗口上移动时也可以触发事件响应。
    鼠标事件:

    • 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 鼠标左右滑动

    组合事件:

    • 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键
    import cv2
    import numpy as np
    
    # 五个参数缺一不可
    # event 鼠标事件
    # x,y为鼠标的坐标
    # flags为组合时间 比如shift+左键
    # userdata为用户数据
    
    def mouse_callback(event, x, y, flags, userdata):
        print(event, x, y, flags, userdata)
        if event == 1:  #按下左键退出,但是未退出循环
            cv2.destroyAllWindows()
    
    cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mouse', 640, 360)
    
    #为某窗口绑定鼠标回调事件,里边对应的userdata为123
    cv2.setMouseCallback('mouse', mouse_callback, '123')
    
    #生成全黑的图片
    img = np.zeros((360, 640), np.uint8)
    while True:
        cv2.imshow('mouse', img)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break
            
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4. Trackbar控件

    进度条 可拖动 例子:制作一个调色板

    import cv2
    import numpy as np
    
    cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('trackbar', 640, 480)
    
    def callback(value):
        #print(value)
        pass
    #有改变就进入callback函数中一次
    cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
    cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
    cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
    
    img = np.zeros((480, 640, 3), np.uint8)
    
    while True:
        #获取当前trackbar的值
        r = cv2.getTrackbarPos('R', 'trackbar')
        g = cv2.getTrackbarPos('G', 'trackbar')
        b = cv2.getTrackbarPos('B', 'trackbar')
        #用获取到的三个值 修改背景图片
        img[:] = [b, g, r]
        cv2.imshow('trackbar', img)
        key = cv2.waitKey(1)
        
        if key & 0xff == ord('q'):
            break
            
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    5. 改进

    • 可以将cv_show此类常用函数封装到其他文件中,以后直接调用
    • 例如 form utils import cv_show
    • 但是必须执行外部文件 %run utils.py
    • 如果有indentation错误,是tab和空格缩进混用 用notepad++打开符号显示可以看到

    好好努力

  • 相关阅读:
    第十二天Tensorflow基础和简单的线性回归实现
    雅思口语的具体步骤和时间安排是什么样的?
    【数据库】将excel数据导入mysql数据库
    JAVA:实现Node节点类算法(附完整源码)
    AcWing 93. 递归实现组合型枚举
    低代码源代码交付的平台有哪些?
    驱动开发:内核测试模式过DSE签名
    Redis数据库的安装及简单使用(含安装包)
    使用OpenVINO实现人体动作识别
    【电路笔记】-欧姆定律
  • 原文地址:https://blog.csdn.net/Eric_Sober/article/details/125993461