OpenCV中的GUI特性

图像入门

读取图像

使用cv.imread()函数读取图像,图像应在工作目录或者图像的完整路径应给出;第二个参数是一个标志,它指定了读取图像的方式,有以下三种:
cv.IMREAD_COLOR:加载彩色图像,任何图像的透明度都会被忽视,为默认标志,或传入整数1
cv.IMREAD_GRAYSCALE:以灰度模式加载图像,或传入0
cv.IMREAD_UNCHANGED:加载图像,包括alpha通道,或传入-1
读取图像时,若图像路径错误,不会引发错误,但print img会给出 None

显示图像

使用cv.imshow()函数在窗口中显示图像,窗口自动适合图像尺寸。第一个参数为字符串,表示窗口名称,可根据需要使用不同的窗口名称创建任意多个窗口;第二个参数为要显示的对象。

写入图像

使用 cv.imwrite()函数保存图像。第一个参数为文件名,第二个参数为要保存的图像。

示例

import cv2 as cv
from matplotlib import pyplot as plt

#加载彩色灰度图像
img0 = cv.imread('./test.jpg', 0)
#加载彩色图像
img1 = cv.imread('./test.jpg', 1)
#加载图像,包括alpha通道
img2 = cv.imread('./test.jpg', -1)
cv.namedWindow('Grayimage',cv.WINDOW_NORMAL) #指定窗口可调整大小
cv.imshow('Grayimage', img0)
cv.imshow('Colorimage', img1)
cv.imshow('Alpimage', img2)
plt.imshow(img0, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])  #隐藏x轴和y轴上的刻度值
plt.show()
plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
plt.show()
# cv.waitKey(1)
k = cv.waitKey(0) & 0xFF
if k == 27: #等待按ESC键直接退出
    cv.destroyAllWindows() #销毁创建的所有窗口
elif k == ord('s'): #等待按s保存和退出
    cv.imwrite('./0530/gray.jpg', img0)
    cv.imwrite('./0530/color.jpg', img1)
    cv.imwrite('./0530/alpha.jpg', img2)
    cv.destroyAllWindows()

cv.waitKey()是一个键盘绑定函数,其参数是以毫秒为单位的时间,等待任何键盘事件指定的毫秒。若在参数时间内按下任何键,程序将继续运行。若参数传递0,将无限期的等待一次敲击键。
可通过cv.namedWindow()实现创建一个空窗口,然后将图像加载到该窗口,其第二个参数为一个标志,默认为cv.WINDOW_AUTOSIZE,若将标志指定为cv.WINDOW_NORMAL,可调整窗口大小,当图像尺寸过大及向窗口添加跟踪栏时,很有用处。
可使用cv.destoryWindow()函数,传递窗口名称为参数,销毁特定的窗口。
Matplotlib是Python的绘图库,可用其显示、缩放、保存图像等。Matplotlib以RGB模式显示,而OpenCV加载的彩色图像处于BGR模式,若使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像。可使用cv.cvtColor(img1, cv.COLOR_BGR2RGB)进行转换

视频入门

从相机中读取视频

捕获视频,需创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称;设备索引是指定哪个摄像头的数字(从0开始),如传递1选择第二个相机。

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)
    #显示结果帧
    # cv.imshow('grayframe', gray) #灰度
    cv.imshow('capFrame', frame)
    if cv.waitKey(1) == ord('q'):
        break
#完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

cap有时可能尚未初始化捕获,可通过cap.isOpened()方法检查其是否已初始化,若为false,则使用cap.open()打开它。
可使用cap.get(propId)方法访问该视频的某些功能,propId是0到18之间的整数,每个整数表示视频的属性(如果适用于该视频);其中一些值可以使用cap.set(propId, value) 进行修改,value为修改后的新值。

从文件播放视频

与从相机捕获方法相同,用视频文件名(.avi格式文件)更改摄像机索引。在显示框架时,使用适当的值传入cv.waitKey() ,值太小,视频将非常快;值太大,视频很慢。正常情况25就可以。

import cv2 as cv

cap = cv.VideoCapture('./video/my.avi')
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame(stream end?).Exiting")
        break
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv.imshow('fileFrame', gray)
    if cv.waitKey(25) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

注意:确保安装了正确的 ffmpeg 或 gstreamer 版本。有时,使用视频捕获(Video Capture)是一件令人头疼的事情,主要原因是错误地安装了 ffmpeg / gstreamer

保存视频

创建一个VideoWriter 对象。指定输出文件名(如output.avi);接着指定FourCC代码;然后传递帧率的数量和帧大小;最后一个是颜色标志,若为True,编码器期望颜色帧,否则它与灰度帧一起工作。
FourCC:是用于指定视频编解码器的4字节代码。

import cv2 as cv

cap = cv.VideoCapture(0)
#定义编解码器并创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('./video/my.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) #0表示绕X轴(垂直)翻转
    frame = cv.flip(frame, 1)   #大于0表示绕Y轴(水平)翻转
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
out.release()
cv.destroyAllWindows()

摄像头捕获的帧,使用cv.flip(src: Mat, flipCode, dst: Mat = ...) 进行翻转,filpCode是控制翻转的标志,其小于0时,是同时绕两个轴进行翻转。上述代码可翻转每一帧并保存
学习来源:OpenCV中文文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值