zoukankan      html  css  js  c++  java
  • OpenCV基本操作

    本文主要介绍图像的读取、操作、转换、显示、保存,视频流的获取、显示和保存,以及如何绑定窗口和事件响应函数。

    1 图像的读取、操作、转换、显示、保存

    参考

    读入图像

    使用函数cv2.imread(filepath, intflags)读入一幅图片

    • filepath:要读入图片的完整路径
    • intflags:读入图片的标志
      • cv2.IMREAD_COLOR:1,默认参数,读入一副彩色图片,忽略alpha通道
      • cv2.IMREAD_GRAYSCALE:0,读入灰度图片
      • cv2.IMREAD_UNCHANGED:-1,读入完整图片,包括alpha通道

    显示图像

    cv2.waitKey(time_of_milliseconds)

    • 等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。参数为0或负值表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。
    • 当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止。

    色彩空间转换函数 cv2.cvtColor()

    注意

    • imutils这个库主要对cv2做了简单的封装,使函数用起来更加友好。
    • imutils.resize(img,height=xx,width=xxx)修改图像的大小。 这个函数会根据图片的比例进行重新绘制大小,如果你的图片是200:200的图片比例,那么如果你使用resize函数的时候,resize(img,height=50,width=20) 那么最后修改的图像是与最小的那个数字对齐,即width=20,所以最后出来的图片大小是20 * 20,而不是50 * 20,或者50 * 50.
    import cv2 
    import numpy as np
    #cv2并不是基于OpenCV 2.**开发的,而是为了区别于cv,cv2采用了面向对象的编程方式
    
    ## 1.1 图像的读取与保存 ##
    img1 = cv2.imread("fahai.png", cv2.IMREAD_GRAYSCALE)#读入后格式numpy.ndarray
    cv2.imwrite("fahai_g.png", img1)
    
    #创建array类型图像
    img2 = np.zeros((3,3), dtype=np.uint8)
    img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
    
    #查看array属性
    print(img2.shape, img2[0, 0].size, img2.dtype, type(img2))
    #查看颜色空间转换类型
    flag = [i for i in dir(cv2) if i.startswith("COLOR_")]
    #print(flag)
    
    
    ## 1.2 图像的显示 ##
    
    img3 = cv2.imread("fahai.jpg")  #默认以BGR格式
    img3[-30:, :30] = np.array([0, 0, 255]) #将左下角30像素方块内换成红色
    
    #显示方式1
    while(True): #持续循环显示,直至键入q后退出
        cv2.imshow("img3", img3)
        if cv2.waitKey(1) & 0xFF == ord('q'): 
            break
    #cv2.destroyWindow(windows_name) #销毁单个特定窗口,若不及时销毁窗口,则出现异常
    cv2.destroyAllWindows()  #销毁全部窗口
    
    #显示方式2
    cv2.imshow("img3", img3)
    if cv2.waitKey(0): #永久性阻塞,直至键入任意键
        cv2.destroyAllWindows()
    

    2 视频流的获取、显示和保存

    参考

    ## 2.1 视频的读取和显示 ##
    
    #创建一个视频读入流对象
    cap = cv2.VideoCapture('test.mp4') 
    assert(cap.isOpened) #检查是否正确打开视频
    
    #创建一个写入流对象,先获取待读取视频的帧率和尺寸
    fps = cap.get(cv2.CAP_PROP_FPS)
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    videoWriter = cv2.VideoWriter('my_video1.avi', 
                                  cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
    
    ret, frame = cap.read() #抽取一帧,read()函数返回第一个参数是bool
    while(ret and not cv2.waitKey(50)&0xFF==ord('q')):
        cv2.imshow("frame", frame)
        videoWriter.write(frame) #将这一帧保存下来
        ret, frame = cap.read()
        
    cap.release()  #及时释放资源
    videoWriter.release()
    cv2.destroyAllWindows()
    
    
    ## 2.2 摄像头的视频获取和保存 ##
    
    cap = cv2.VideoCapture(0)
    assert(cap.isOpened) 
    
    fps = 30
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    videoWriter = cv2.VideoWriter('my_video2.avi', 
                                  cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
    
    ret, frame = cap.read()
    tick = 10 * fps
    while(ret and tick > 0):
        videoWriter.write(frame)
        ret, frame = cap.read()
        tick -= 1
        
    cap.release()
    videoWriter.release() #若不释放资源,则后面会有一段无效帧
    cv2.destroyAllWindows()
    

    3 绑定窗口和事件响应函数

    参考

    ## 事件响应函数示例1 ##
    """
    功能:显示一张图片,若双击左键,则画圆;键入'q'则退出。
    """
    
    import cv2
    
    img4=cv2.imread('fahai.jpg') #读取图片作为背景
    
    #定义画圆事件,如果事件双击左键发生
    #则以此时双击的点为原点画一个半径为100px BGR为(255,255,0)粗细为3px的圆圈
    def draw_circle(event, x, y, flags, param): 
        if event == cv2.EVENT_LBUTTONDBLCLK:
            cv2.circle(img4, (x,y), 100, (255,255,0), 3)
    
    # 创建图像与窗口并将窗口与回调函数绑定
    cv2.namedWindow('image') 
    cv2.setMouseCallback('image', draw_circle)
    
    while(not cv2.waitKey(100) == ord('q')): #等待100毫秒 刷新一次显示图像
        cv2.imshow('image', img4)
            
    cv2.destroyAllWindows()
    
    
    ## 事件响应函数示例2 ##
    """
    功能:调用摄像头录制视频,当鼠标左击,或者键入某个值,则退出视频流的读取和保存
    """
    
    clicked = False
    def onMouse(event, x, y, flags, param): #定义事件函数
        global clicked
        if event == cv2.EVENT_LBUTTONUP:
            clicked = True
            
    cv2.namedWindow("myWindow") #创建一个窗口
    cv2.setMouseCallback("myWindow", onMouse) #将事件函数与窗口绑定
    
    cap = cv2.VideoCapture(0)
    fps = 30
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    videoWriter = cv2.VideoWriter('myvideo.avi', 
                                  cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
    
    ret, frame = cap.read()
    while(ret and not clicked and cv2.waitKey(1)==-1):
        cv2.imshow("myWindow", frame)
        videoWriter.write(frame)
        ret, frame = cap.read()
        
    cap.release()
    videoWriter.release()
    cv2.destroyAllWindows()
    
  • 相关阅读:
    Java总结篇系列:Java泛型
    视图、索引、存储过程优缺点
    SQL之case when then用法
    oracle数据库表的导入导出cmd命令大全
    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法
    如何查看一个数据文件是否是自动扩展
    ora-01652无法通过128(在表空间temp中)扩展temp段
    解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
    Java中的JDBC基础
    Java中的Property类
  • 原文地址:https://www.cnblogs.com/inchbyinch/p/12444316.html
Copyright © 2011-2022 走看看