OpenCV学习(1)——GUI特性

本文详细介绍了使用OpenCV进行图像读取、显示、保存,以及基本的GUI编程,包括创建窗口、显示图像、键盘控制和视频操作。涵盖了cv.imread()、cv.imshow()、VideoCapture对象的使用以及绘图功能如直线、矩形、圆形等。
摘要由CSDN通过智能技术生成

GUI特性

图像入门

读取图像
  • 使用 cv.imread() 函数读取图像。

    • 图像应该在工作目录或图像的完整路径应给出。
    • 使用一个标志指定读取图像的方式。
  • 函数格式

    cv.imread(src,flag)
    
  • 参数介绍

    参数描述
    src图像路径
    flagcv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
    cv.IMREAD_GRAYSCALE:以灰度模式加载图像
    cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
    • 如果缺少文件,权限不当,格式不受支持或无效,当 print(图片)时,将返回 None
    • 该函数通过内容而不是文件扩展名来决定图像类型;
    • 图像数据将以 B,G,R 的顺序存储;
    • 可以使用 1,0,-1 代替表示参数flags的三种图像读取方式。
  • 例子

    import numpy as np
    import cv2 as cv
    
    # 加载彩色灰度图像
    img = cv.imread('messi5.jpg'0)
    
显示图像
  • 使用函数 cv.imshow()在窗口中显示图像。窗口自动适合图像尺寸。

    • 函数格式

      cv.imread(window,img, flags)
      
    • 参数描述

      参数描述
      window窗口名称,它是一个字符串。
      可以根据需要创建任意多个窗口,但可以使用不同的窗口名称。
      img图像对象
  • 使用函数 cv.waitKey() 绑定键盘

    • 函数格式

      cv.waitKey(sec)
      
    • 参数介绍

      参数描述
      sec以毫秒为单位的时间,等待任何键盘事件指定的毫秒
    • 如果在这段时间内按下任何键,程序将继续运行。

    • 如果0被传递,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键

  • 使用函数摧毁窗口

    • cv.destroyAllWindows()只会破坏我们创建的所有窗口。
    • 如果要销毁任何特定的窗口,请使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。
  • 使用函数 cv.namedWindow() 创建窗口

    • 通过功能 cv.namedWindow() 创建一个空窗口,然后再将图像加载到该窗口。
    • 可以指定窗口是否可调整大小。
      • 默认情况下,该标志为 cv.WINDOW_AUTOSIZE
      • 如果将标志指定为 cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。
  • 例子

    cv.namedWindow('image',cv.WINDOW_NORMAL)
    cv.imshow('image',img)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
写入图像
  • 使用函数 cv.imwrite() 保存图像。

  • 函数格式

    cv.imwrite(filename,img,flags)
    
  • 参数介绍

    参数描述
    filename文件名
    img要保存的图像
    flags可选参数
    • flags参数
      • cv2.IMWRITE_JPEG_QUALITY:对于jpeg格式的图片使用该参数。其表示的是图像的质量,值用0-100的整数表示,默认为95;
      • cv2.IMWRITE_PNG_COMPRESSION:对于png格式的图片使用该参数,表示的是压缩级别,值从0到9,压缩级别越高,图像尺寸越小。默认级别为3;
      • cv2.CV_IMWRITE_WEBP_QUALITY:设置图片的格式为webp格式的图片质量,值为0-100。
  • 例子

    import numpy as np
    import cv2 as cv
    img = cv.imread('text.jpg',0)
    cv.imshow('image',img)
    k = cv.waitKey(0)
    if k == 27:         # 等待ESC退出
        cv.destroyAllWindows()
    elif k == ord('s'): # 等待关键字,保存和退出
        cv.imwrite('messigray.png',img)
        cv.destroyAllWindows()
    

视频入门

从相机中读取视频
  • 使用 VideoCapture 对象捕获视频

    • 函数格式

      cv.VideoCapture()
      
    • 参数介绍

      • 参数是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接。可以通过传递1来选择第二个相机,以此类推。
      • 可以通过传递1来选择第二个相机,以此类推。
    • isOpened() 方法检查 VideoCapture 是否已初始化。

      • 如果是True,那么确定。
      • 否则,使用 cap.open() 打开它。
    • 例子

      import numpy as np
      import cv2 as cv
      cap = cv.VideoCapture(0)
      if not cap.isOpened():
          print("Cannot open camera")
          exit()
      while True:
          # 逐帧捕获
          ret, frame = cap.read()
          # 如果正确读取帧,ret为True
          if not ret:
              print("Can't receive frame (stream end?). Exiting ...")
              break
          # 我们在框架上的操作到这里
          gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
          # 显示结果帧e
          cv.imshow('frame', gray)
          if cv.waitKey(1) == ord('q'):
              break
      # 完成所有操作后,释放捕获器
      cap.release()
      cv.destroyAllWindows()
      
  • 使用 VideoCapture 对象的 read() 捕获帧

    • 函数格式

      import cv2 as cv
      cap = cv.VideoCapture()
      ret, frame = cap.read()
      
    • 返回值介绍

      返回值描述
      ret布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。
      framerame就是每一帧的图像,是个三维矩阵,类型为 numpy.ndarray 类型。
  • 使用 VideoCapture 对象的get(propId)方法访问该视频的某些功能

    • 函数格式

      cv.VideoCapture.get(propId)
      
    • 参数介绍

      • propId 是 0 到 18 之间的一个数字。每个数字表示视频的属性(如果适用于该视频)
    • 函数功能

      paramdefine
      cv2.VideoCapture.get(0)视频文件的当前位置(播放)以毫秒为单位
      cv2.VideoCapture.get(1)基于以0开始的被捕获或解码的帧索引
      cv2.VideoCapture.get(2)视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
      cv2.VideoCapture.get(3)在视频流的帧的宽度
      cv2.VideoCapture.get(4)在视频流的帧的高度
      cv2.VideoCapture.get(5)帧速率
      cv2.VideoCapture.get(6)编解码的4字-字符代码
      cv2.VideoCapture.get(7)视频文件中的帧数
      cv2.VideoCapture.get(8)返回对象的格式
      cv2.VideoCapture.get(9)返回后端特定的值,该值指示当前捕获模式
      cv2.VideoCapture.get(10)图像的亮度(仅适用于照相机)
      cv2.VideoCapture.get(11)图像的对比度(仅适用于照相机)
      cv2.VideoCapture.get(12)图像的饱和度(仅适用于照相机)
      cv2.VideoCapture.get(13)色调图像(仅适用于照相机)
      cv2.VideoCapture.get(14)图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
      cv2.VideoCapture.get(15)曝光(仅适用于照相机)
      cv2.VideoCapture.get(16)指示是否应将图像转换为RGB布尔标志
      cv2.VideoCapture.get(17)× 暂时不支持
      cv2.VideoCapture.get(18)立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
从文件播放视频
  • 方法:只是用视频文件名更改摄像机索引。

  • 在显示框架时,请使用适当的时间cv.waitKey()。正常情况下25毫秒就可以了。

    • 如果太小,则视频将非常快,
    • 如果太大,则视频将变得很慢。
  • 例子

    import numpy as np
    import cv2 as cv
    cap = cv.VideoCapture('vtest.avi')
    while cap.isOpened():
        ret, frame = cap.read()
        # 如果正确读取帧,ret为True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        cv.imshow('frame', gray)
        if cv.waitKey(1) == ord('q'):
            break
    cap.release()
    cv.destroyAllWindows()
    
保存视频
  • 通过 cv2.VideoWriter_fourcc 指定编码格式和文件名后缀

    • cv2.VideoWriter_fourcc('I', '4', '2', '0')
      • 该参数是YUV编码类型,文件名后缀为.avi
    • cv2.VideoWriter_fourcc('P', 'I', 'M', 'I')
      • 该参数是MPEG-1编码类型,文件名后缀为.avi
    • cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
      • 该参数是MPEG-4编码类型,文件名后缀为.avi
    • cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')
      • 该参数是Ogg Vorbis,文件名后缀为.ogv
    • cv2.VideoWriter_fourcc('F', 'L', 'V', '1')
      • 该参数是Flash视频,文件名后缀为.flv
  • 通过 cv2.VideoWriter 保存视频

    • 函数格式

      cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
      
    • 参数介绍

      参数说明
      filename要保存的文件的路径
      fourcc指定编码器
      fps要保存的视频的帧率
      frameSize要保存的文件的画面尺寸
      isColor指示是黑白画面还是彩色的画面(默认是灰度)
  • cv2.VideoWriter 对象中的写入函数

    • 函数格式

      out.write(frame)
      
    • 参数介绍

      参数说明
      outcv2.VideoWriter赋值的变量名
      frame每一帧写入的图像画面
  • 释放资源并关闭窗口

    • object.release()
      • object是所占用资源的对象,例如:cv2.VideoCapture,cv2.VideoWriter
      • 用于释放占用的内存资源。
    • cv2.destroyAllWindows()
      • 来关闭窗口并取消分配任何相关的内存使用。
  • 例子

    import numpy as np
    import cv2 as cv
    cap = cv.VideoCapture(0)
    # 定义编解码器并创建VideoWriter对象
    fourcc = cv.VideoWriter_fourcc(*'XVID')
    out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        frame = cv.flip(frame, 0)
        # 写翻转的框架
        out.write(frame)
        cv.imshow('frame', frame)
        if cv.waitKey(1) == ord('q'):
            break
    # 完成工作后释放所有内容
    cap.release()
    out.release()
    cv.destroyAllWindows()
    

绘图功能

创建黑色图像
  • 函数原型

    img=np.zeros((width,height),void aux)
    
  • 绘制灰度图像

    img=np.zeros((width,height),dtype=np.uint8)
    
  • 函数彩色图像

    img=np.zeros((width,height),dtype=np.float32)
    
绘制直线
  • 函数格式

    cv2.line(img,pt1,pt2,color,thickness)
    
  • 参数介绍

    参数描述
    img图像
    pt1起始坐标
    pt2终止坐标
    color线条颜色
    thickness笔画宽度
绘制矩形
  • 函数格式

    cv2.rectangle(img,pt1,pt2,color,thickness)
    
  • 参数介绍

    参数描述
    img图像
    pt1起始坐标
    pt2终止坐标
    color线条颜色
    thickness笔画宽度(-1表示闭合图形)
绘制圆形
  • 函数格式

    cv2.circle(img,center,radius,color,thickness)
    
  • 参数介绍

    参数描述
    img图像
    center圆心坐标
    radius圆直径
    color线条颜色
    thickness笔画宽度 指定-1时,若为闭合图形,则填充整个图像
绘制椭圆
  • 函数格式

    cv2.ellipse()
    
  • 参数介绍

    参数描述
    img图像
    center椭圆中心坐标
    axes长轴和短轴长度
    angle椭圆沿逆时针方向旋转的角度(0)
    startAngle椭圆弧顺时针方向起始的角度(0)
    endAngle椭圆弧顺时针方向结束的角度(360)
    color线条颜色
    thickness笔画宽度 指定 -1 时,若为闭合图形,则填充整个图像
绘制多边形
  • 画多边形,需要指点每个顶点的坐标。用这些点的坐标构建一个大小等于行数。

  • 函数格式

    cv2.polylines()
    
  • 参数介绍

    参数描述
    img图像
    pts多边形曲线点的数组
    点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,并且其类型应为int32。
    isClosed指示绘制的多段线是否闭合的标志
    如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状
    color颜色
    thickness多段线边的厚度
    lineType线段的类型
    shift顶点坐标中的小数位数
绘制文字
  • 函数格式

    cv2.putText() 
    
  • 参数介绍

    参数描述
    img图像
    text文字内容
    org文字左下角起始坐标
    fontFace字体
    fontScale文字大小
    color颜色
    thickness多段线边的厚度
    lineType线段的类型
  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值