OpenCV(基于python)学习笔记之视频I/O

OpenCV(基于python)学习笔记之视频I/O

视频文件的读/写

我们可以使用OpenCV中的Vediocapture和VedioWriter来读取和写入视频的帧,VedioCapture类中的read()方法可以获取图像的帧(BGR图像),而VedioWriter中的write()方法则可以将帧组装成视频输出。
下面为一个读取视频帧,实现视频的复制的小实例:

import cv2
import numpy as np

cap = cv2.VideoCapture('myVedio.avi')
fps = cap.get(cv2.CAP_PROP_FPS)
#get用于获取关于视频的各种信息,参数为cv2.CAP_PROP_FPS表示获取视频的帧数
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
#cv2.CAP_PROP_FRAME_WIDTH和cv2.CAP_PROP_FRAME_HEIGHT分别代表计算当前视频的宽和高
writer = cv2.VideoWriter('vedioCopy.avi',cv2.VideoWriter_fourcc('X','V','I','D'),
                                fps,size)
#第一项为输出的视频名称,第二项为视频的编解码器,第三项为输出视频的帧数,第四项为尺寸

success,frame = cap.read()
#read()会返回两个值,第一个值为bool值,若读取成功则为True,第二个值为读取的帧
while success:#循环直到视频结束
    writer.write(frame)
    success,frame = cap.read()
    #读取下一帧

捕获摄像头的帧

Vediocapture也可以用来获取电脑摄像头的帧流,但是Vediocapture中的参数不是视频的地址而是摄像头的设备索引(0)。下面是一个捕获摄像头的10秒的帧然后输出为视频:

import cv2
import numpy as np
cameraCapture = cv2.VideoCapture(0)
#0为摄像头的设备索引
fps = 30
#帧的速率
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('outPutVedio.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)

success,frame = cameraCapture.read()
numFramesRemaining = 10*fps - 1
while success and numFramesRemaining > 0:
    videoWriter.write(frame)
    numFramesRemaining -= 1
    success, frame = cameraCapture.read()
    print(numFramesRemaining)
cameraCapture.release()

这里需要注意的是使用get方法不能获取摄像头帧数的准确值,而是返回0,所以我们只能自定义一个帧的速率。

在窗口显示摄像头的帧

我们可以使用namedWindow()、imshow()和DestroyWindow()方法来创建、显示、销毁自定义窗口,另外可以使用waitKey()函数来获取键盘的输入,使用setMouseCallback()方法来获取鼠标的输入,我们可以使用以上方法来写一个在窗口显示摄像头图像的小程序:

import cv2

clicked = False
def onMouse(event,x,y,flags,param):
    """
    给自定义窗口设置一个鼠标事件,当鼠标左键点击窗口时改变clicked的值
    """
    global clicked
    if event == cv2.EVENT_LBUTTONUP:
        clicked = True

cap = cv2.VideoCapture(0)
cv2.namedWindow('MyCamera')
#创建一个自定义窗口
cv2.setMouseCallback('MyCamera',onMouse)
#将该事件绑定到自定义的窗口上
success,frames = cap.read()
while success and cv2.waitKey(1) == -1 and not clicked:
    #waitKey(1)中的数字1代表每1毫秒判断一次期间有没有键被按下,若没有则返回-1
    cv2.imshow('MyCamera',frames)
    #显示从摄像头捕获到的帧
    success,frames = cap.read()

cv2.destroyWindow('MyCamera')
cap.release()

下面是从网上找到的各类鼠标事件:
参考自:setMouseCallback
cv2_EVENT_MOUSEMOVE 0 滑动
cv2_EVENT_LBUTTONDOWN 1 左键点击
cv2_EVENT_RBUTTONDOWN 2 右键点击
cv2_EVENT_MBUTTONDOWN 3 中间点击
cv2_EVENT_LBUTTONUP 4 左键释放
cv2_EVENT_RBUTTONUP 5 右键释放
cv2_EVENT_MBUTTONUP 6 中间释放
cv2_EVENT_LBUTTONDBLCLK 7 左键双击
cv2_EVENT_RBUTTONDBLCLK 8 右键双击
cv2_EVENT_MBUTTONDBLCLK 9 中间释放
cv2_EVENT_FLAG_LBUTTON 1 左键拖拽
cv2_EVENT_FLAG_RBUTTON 2 右键拖拽
cv2_EVENT_FLAG_MBUTTON 4 中间拖拽
cv2_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
cv2_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
cv2_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件(后面8-39还有待研究)

发布了14 篇原创文章 · 获赞 0 · 访问量 241

猜你喜欢

转载自blog.csdn.net/pnd237/article/details/103928346