OpenCV播放摄像头视频

发布于:2025-05-10 ⋅ 阅读:(19) ⋅ 点赞:(0)
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

要退出程序,可以在键盘上按任何键,比如空格键。


网站公告

今日签到

点亮在社区的每一天
去签到