OpenCV计算机视觉开发实践:基于Qt C++ - 商品搜索 - 京东
播放摄像头视频和播放视频文件类似,也是通过类VideoCapture来实现,只不过调用open的时候传入的是摄像头的索引号。如果计算机安装了一个摄像头,则open的第一个参数通常是0,比如:
VideoCapture capture;
capture.open(0);
或者直接用构造函数打开摄像头:
VideoCapture capture(0);
打开成功后,就可以一帧一帧地读取并一帧一帧地播放了,其实就是在一个循环里,间隔地显示一幅一幅视频帧图片,当间隔时间短了,图片动起来了,就感觉是在看视频了。
在编程之前,我们要确保操作系统能打开摄像头并播放摄像头视频,具体步骤如下:
把一个USB摄像头插入电脑主机。
设置虚拟机的USB控制器。打开VMware设置对话框,在硬件列表里选中“USB控制器”,在右侧的“USB兼容性”中选择USB 3.0,如图12-4所示。
图12-4
启动并连接USB摄像头。由于目前是在Linux虚拟机中,因此当我们在主机上插上USB摄像头后,需要先连接USB摄像头到虚拟机。启动Linux虚拟机后,依次单击VMware的菜单“虚拟机”→“可移动设备”→“Nintenda USB Camera”→“连接(断开与主机的连接)”,“连接(断开与主机的连接)”菜单上就会出现一个“√”,说明USB摄像头连接到Linux虚拟机中了。我们可以用命令查看一下:
# ll /dev/video*
crw-rw---- 1 root video 81, 0 8月 31 20:56 /dev/video0
crw-rw---- 1 root video 81, 1 8月 31 20:56 /dev/video1
如果显示/dev/video0,则说明摄像头已经连接到Linux虚拟机中了。现在在命令行中打开摄像头:
# cheese
此时就可以看到摄像头视频了,如图12-5所示。
图12-5
系统能打开摄像头了,那么使用程序方式打开也就简单了。这里先关闭这个摄像头窗口。
【例12.3】播放摄像头视频
新建一个控制台工程,工程名是test。
在工程配置文件test.pro的末尾添加头文件和库文件:
INCLUDEPATH += /usr/local/include/opencv4/
LIBS += -L /usr/local/lib -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lopencv_videoio
注意:配置文件test.pro一定要包含库opencv_videoio,这个库提供和摄像头相关的系统函数。
打开main.cpp,并输入如下代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0); // 创建一个捕获对象并打开它
if (!capture.isOpened()) // 判断打开一个捕获视频的设备(也就是摄像头)是否成功
{
puts("open failed");
return -1;
}
Mat frame;
while (capture.read(frame)) // 读取视频帧
{
imshow("video-demo", frame); // 显示视频帧
if (waitKey(30) >= 0) // 延时30毫秒,按下任何键就退出
break; // 跳出循环
}
return 0; // 结束程序
}
在上述代码中,首先创建一个捕获对象并打开它,然后判断打开是否成功。如果打开成功,则通过while循环逐帧读取并用imshow显示该帧图片,在while中每隔30毫秒循环读取帧并显示,这样看起来就像视频了。用户按下任何键就退出循环结束程序。waitKey(30)表示程序每30毫秒检测一次按键。
类VideoCapture既支持视频文件的读取,也支持摄像头视频的读取。如果要打开视频文件,则输入视频文件路径名;如果要打开摄像头,则输入摄像头的ID。
保存工程并运行,结果如图12-6所示。
图12-6
要退出程序,可以在键盘上按任何键,比如空格键。