《OpenCV 4计算机视觉项目实战 》 —2.8 读取视频和摄像头
2.8 读取视频和摄像头
本节将用这个简单示例向你介绍视频和摄像头的读取。在解释如何读取视频或摄像头的输入之前,我们想介绍一个非常有用的新类,它可以帮助我们管理输入命令行参数。这个新类是在OpenCV 3.0版中引入的,它就是CommandLineParser类:
我们必须为CommandLineParser做的第一件事是在常量char向量中定义我们需要或允许的参数,每一行都采用以下模式:
name_param可以以@开头,这会将此参数定义为默认输入。我们可以使用多个name_param:
构造函数将获取main函数的输入和先前定义的key常量:
.has类方法检查参数是否存在。在示例中,我们检查用户是否添加参数help或?,然后使用类函数printMessage显示所有描述参数:
使用.get<typename>(parameterName)函数可以访问和读取任何输入参数:
获取所有必需的参数以后,即可检查这些参数是否被正确解析,并在其中一个参数未被解析时显示错误消息,例如,添加的是一个字符串而不是一个数字:
用于视频读取和摄像头读取的类是相同的VideoCapture类,与之前版本的OpenCV中一样,它属于videoio子模块而不是highgui子模块。创建对象后,我们检查输入命令行参数videoFile是否有路径文件名。如果它是空的,那么尝试打开网络摄像头;如果它有文件名,则打开视频文件。为此,可以使用open函数,将视频文件名或我们要打开的索引摄像头作为参数。如果我们有一个摄像头,可以用0作为参数。
要检查是否可以读取视频文件名或摄像头,可以使用isOpened函数:
最后,创建一个窗口,使用namedWindow函数和无限循环来显示帧,用>>操作抓取每个帧,如果正确地检索到帧,则使用imshow函数显示该帧。在这种情况下,我们不想让应用程序停止,但是会调用waitKey(30)等待30毫秒,以此检查用户是否使用任何键停止应用程序的执行。
使用摄像头访问等待下一帧所需的时间是根据摄像头的速度和我们花费的算法时间计算的。例如,如果摄像头工作在20 fps,而我们的算法花费10毫秒,则一个很好的等待值是30 =(1000/20)–10毫秒。该值是通过考虑等待足够长的时间来确保下一帧已经在缓冲区当中来计算的。如果摄像头需要40毫秒来拍摄每张图像,并且算法使用了10毫秒,那么只需要用waitKey 30毫秒来停止,因为30毫秒的等待时间加上我们算法的10毫秒与摄像头每个帧的访问时间是相同的。
当用户想结束应用程序时,他们所要做的就是按下任意键,然后我们必须使用释放函数释放所有的视频资源。
释放在计算机视觉应用程序中使用的所有资源是非常重要的。如果不这样做,就会消耗掉所有的RAM。我们可以使用release函数释放矩阵。
前面代码的结果是用一个新窗口显示BGR格式的视频或网络摄像头。
- 点赞
- 收藏
- 关注作者
评论(0)