《OpenCV 4计算机视觉项目实战 》 —2.8 读取视频和摄像头

举报
华章计算机 发表于 2019/11/10 11:05:59 2019/11/10
【摘要】 本节书摘来自华章计算机《OpenCV 4计算机视觉项目实战》 一书中第二章,第2.8节,作者[西班牙]大卫·米兰·埃斯克里瓦(David Millán Escrivá)[西班牙]维尼休斯·G.门东萨(Vinícius G. Mendon。

2.8 读取视频和摄像头

本节将用这个简单示例向你介绍视频和摄像头的读取。在解释如何读取视频或摄像头的输入之前,我们想介绍一个非常有用的新类,它可以帮助我们管理输入命令行参数。这个新类是在OpenCV 3.0版中引入的,它就是CommandLineParser类:

 image.png

我们必须为CommandLineParser做的第一件事是在常量char向量中定义我们需要或允许的参数,每一行都采用以下模式:

 image.png

name_param可以以@开头,这会将此参数定义为默认输入。我们可以使用多个name_param:

 image.png

构造函数将获取main函数的输入和先前定义的key常量:

 image.png

.has类方法检查参数是否存在。在示例中,我们检查用户是否添加参数help或?,然后使用类函数printMessage显示所有描述参数:

 image.png

使用.get<typename>(parameterName)函数可以访问和读取任何输入参数:

 image.png

获取所有必需的参数以后,即可检查这些参数是否被正确解析,并在其中一个参数未被解析时显示错误消息,例如,添加的是一个字符串而不是一个数字:

 image.png

用于视频读取和摄像头读取的类是相同的VideoCapture类,与之前版本的OpenCV中一样,它属于videoio子模块而不是highgui子模块。创建对象后,我们检查输入命令行参数videoFile是否有路径文件名。如果它是空的,那么尝试打开网络摄像头;如果它有文件名,则打开视频文件。为此,可以使用open函数,将视频文件名或我们要打开的索引摄像头作为参数。如果我们有一个摄像头,可以用0作为参数。

要检查是否可以读取视频文件名或摄像头,可以使用isOpened函数:

 image.png

最后,创建一个窗口,使用namedWindow函数和无限循环来显示帧,用>>操作抓取每个帧,如果正确地检索到帧,则使用imshow函数显示该帧。在这种情况下,我们不想让应用程序停止,但是会调用waitKey(30)等待30毫秒,以此检查用户是否使用任何键停止应用程序的执行。

使用摄像头访问等待下一帧所需的时间是根据摄像头的速度和我们花费的算法时间计算的。例如,如果摄像头工作在20 fps,而我们的算法花费10毫秒,则一个很好的等待值是30 =(1000/20)–10毫秒。该值是通过考虑等待足够长的时间来确保下一帧已经在缓冲区当中来计算的。如果摄像头需要40毫秒来拍摄每张图像,并且算法使用了10毫秒,那么只需要用waitKey 30毫秒来停止,因为30毫秒的等待时间加上我们算法的10毫秒与摄像头每个帧的访问时间是相同的。

当用户想结束应用程序时,他们所要做的就是按下任意键,然后我们必须使用释放函数释放所有的视频资源。

释放在计算机视觉应用程序中使用的所有资源是非常重要的。如果不这样做,就会消耗掉所有的RAM。我们可以使用release函数释放矩阵。

前面代码的结果是用一个新窗口显示BGR格式的视频或网络摄像头。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200