OpenCV 4.11.0
开源计算机视觉库
|
通常,我们需要用摄像头捕获实时视频流。OpenCV提供了一个非常简单的接口来实现这一点。让我们从摄像头(我使用的是笔记本电脑内置的网络摄像头)捕获视频,将其转换为灰度视频并显示它。只是一个简单的入门任务。
要捕获视频,你需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引只是一个数字,用于指定哪个摄像头。通常会连接一个摄像头(像我的情况一样)。所以我只需传入0(或-1)。你可以通过传入1等来选择第二个摄像头。之后,你可以逐帧捕获。但在最后,不要忘记释放捕获。
cap.read()
返回一个布尔值(True
/False
)。如果帧读取正确,则为True
。因此,你可以通过检查此返回值来检查视频的结尾。
有时,cap可能没有初始化捕获。在这种情况下,此代码会显示错误。你可以通过cap.isOpened()方法检查它是否已初始化。如果为True
,则表示已初始化。否则,使用cap.open()打开它。
你还可以使用cap.get(propId)方法访问此视频的一些功能,其中propId是从0到18的数字。每个数字都表示视频的一个属性(如果适用于该视频)。完整的详细信息可以在这里查看:cv::VideoCapture::get()。其中一些值可以使用cap.set(propId, value)修改。Value是你想要的新值。
例如,我可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)
和cap.get(cv.CAP_PROP_FRAME_HEIGHT)
检查帧的宽度和高度。默认情况下它给我640x480。但是我想将其修改为320x240。只需使用ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320)
和ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)
。
从文件中播放视频与从摄像头捕获视频相同,只需将摄像头索引更改为视频文件名即可。此外,在显示帧时,请为cv.waitKey()
使用适当的时间。如果时间太短,视频播放速度很快;如果时间太长,视频播放速度很慢(嗯,这就是你可以慢动作显示视频的方式)。在正常情况下,25毫秒就可以了。
因此,我们捕获视频并逐帧处理它,并且我们想要保存该视频。对于图像,这非常简单:只需使用cv.imwrite()
。在这里,需要做更多的工作。
这次我们创建一个VideoWriter对象。我们应该指定输出文件名(例如:output.avi)。然后我们应该指定FourCC代码(下一段详细介绍)。然后应该传递每秒帧数 (fps) 和帧大小。最后一个是isColor标志。如果为True
,则编码器期望彩色帧,否则它使用灰度帧。
FourCC是一个4字节代码,用于指定视频编解码器。可在fourcc.org找到可用代码的列表。它是平台相关的。以下编解码器对我来说运行良好。
FourCC代码作为’cv.VideoWriter_fourcc('M','J','P','G')`或`cv.VideoWriter_fourcc(*'MJPG')`传递给MJPG。
以下代码捕获摄像头画面,垂直翻转每一帧,并保存视频。