『OpenCV3』处理视频&摄像头

在opencv中,摄像头和视频文件并没有很大不同,都是一个可以read的数据源,使用cv2.VideoCapture(path).read()可以获取(flag,当前帧),对于每一帧,使用图片处理函数即可。

调用摄像头并记录为文件:

# 摄像头读取并写入文件
cameraCapture = cv2.VideoCapture(0)           # 获取摄像头对象
fps = 30
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), 
        int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print(size)
videoWriter = cv2.VideoWriter('OutputVid.flv', cv2.VideoWriter_fourcc('F', 'L', 'V', '1'), fps, size)  # 生成书写器对象
# 成功与否flag, 下一帧图像
success, frame = cameraCapture.read()         # 摄像头对象读取数据
# 10s * 30fps
numFrameRamaining = 10 * fps - 1
print(success)
while success and numFrameRamaining > 0:
    videoWriter.write(frame)                  # 书写器对象记录帧
    success, frame = cameraCapture.read()     # 摄像头对象
    numFrameRamaining -= 1                    # 利用帧数计时:10s * 30fps
cameraCapture.release()

 读取本地视频文件并另存为:

和上面的流程几乎完全一样,只是对象由摄像头设备代号0改为视频文件路径

import cv2
# 读取本地视频并另存为
videoCapture = cv2.VideoCapture('OutputVid.flv')
fps = videoCapture.get(cv2.CAP_PROP_FPS)
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), 
        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('OutputVid2.flv', cv2.VideoWriter_fourcc('F', 'L', 'V', '1'), fps, size)
success, frame = videoCapture.read()
while success:
    videoWriter.write(frame)
    success, frame = videoCapture.read()
videoCapture.release()
print('finalish')

 显示图片:

import cv2

img = cv2.imread('img2.jpg')
cv2.namedWindow("Image")    # 可加可不加,加上的话一般和imshow之间会定义一些窗口事件处理用函数
cv2.imshow('Image', img)    # 显示图片
cv2.waitKey()
cv2.destroyAllWindows()     # 释放所有窗口

 

窗口事件相应函数&视频播放:

0表示主摄像头,1表示前置摄像头。

本程序调用摄像头,并实时输出,键盘输入ESC或点击窗口时会退出窗口。

import cv2  

clicked = False
def onMouse(event, x, y, flags, param):
    global clicked
    if event == cv2.EVENT_LBUTTONUP:                      # 更多鼠标事件详见书26页
        clicked = True
cv2.namedWindow('video')
cv2.setMouseCallback('video', onMouse)                    # 设置鼠标事件,对应窗口检测到的数据会传入接收函数中

print('摄像头已启动,键盘输入ESC或者鼠标左击窗口关闭摄像头')
cameraCapture = cv2.VideoCapture(0)  
if cameraCapture.isOpened():
    while True:
        success, frame = cameraCapture.read()
        if success:
            cv2.imshow('video', frame)  
        else:
            break
        if cv2.waitKey(20) == 27 or clicked:              # cv2.waitKey()中20表示每次等待20毫秒,默认返回-1,接收ESC时返回27(就是返回ASCII实际)
            break  
cv2.destroyAllWindows()

 。

原文地址:https://www.cnblogs.com/hellcat/p/7054511.html