背景:为了做一个滴水检测的demo,自己配置了滴水装置的实验环境,需要用摄像头实时拍摄滴水画面,进行检测,生成滴水位置的bbox,保存检测后的视频。opencv可以实时捕捉usb摄像头拍摄的画面,因此稍微学习了一下
用摄像机捕捉视频
通常,我们必须用摄像机捕捉直播。OpenCV提供了一个非常简单的接口来实现这一点。让我们从相机捕捉视频(我使用的是usb摄像头),将其转换成灰度视频并显示出来。
VideoCapture对象cap
要捕获视频,需要创建VideoCapture的对象cap。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个摄像头的数字。通常电脑内置摄像头的设备索引是0,外接的usb摄像头是1,以此类推。之后就可以逐帧捕获usb摄像头拍摄的视频。任务的最后,要release VideoCapture的对象cap。
VideoWriter对象out
要保存视频,我们需要创建一个VideoWriter对象out。传入的参数包括:输出文件名(例如:output.avi)、FourCC代码(详见下一段)。然后每秒帧数(fps)、帧大小。最后一个是isColor的flag,如果为True,表示输入视频编码器的是color frame,否则使用greyscale frame。
FourCC是一个4字节的代码,用来指定视频的编码解码器。对于XVID格式的编码解码器,传递cv.VideoWriter_fourcc('M','J','P','G')
或cv.VideoWriter_fourcc(*'MJPG')
。一般我们使用XVID格式的编码解码器,对应的视频后缀是.avi
代码流程
有时,cap可能没有初始化。我们可以通过cap.isOpened()方法检查它是否被初始化,如果是False,使用cap.open()打开它。
cap.get(propId)方法访问本视频的一些属性,比如fps和分辨率,其中propId可以是一个从0到18的数字,每个数字表示视频的一个属性,也可以直接是属性的名称,比如cv2.CAP_PROP_FPS表示帧速率。
cap.set(propId, value)可以修改视频的属性,比如帧速、分辨率,value是你想要的新值。
import cv2
import numpy as np
# 创建VideoCapture的对象cap。传入的参数可以是设备索引1,也可以是自己本地的视频
cap = cv2