当前位置: 首页 > news >正文

OpenCV播放摄像头视频

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/video0crw-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

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

相关文章:

  • 2025年城市规划与互联网技术国际会议(ICUPIT 2025)
  • 生产安全管理系统标杆
  • 【高级IO】多路转接之单线程Reactor
  • Spring Cloud 以Gateway实现限流(自定义返回内容)
  • DVWA靶场保姆级通关教程--06不安全验证机制
  • 安全核查基线-1.LPD服务
  • 构筑芯片行业的“安全硅甲”
  • 教育+AI:个性化学习能否颠覆传统课堂?
  • 游戏引擎学习第266天:添加顶部时钟概览视图。
  • CSS实现图片垂直居中方法
  • 利用GPT实现油猴脚本—网页滚动(优化版)
  • CSS flex:1
  • C23 与 MISRA C:2025:嵌入式 C 语言的进化之路
  • 计算机视觉与深度学习 | 视觉+激光雷达+惯惯性SLAM算法汇总(原理,公式,代码)
  • JDK8 HashMap红黑树退化为链表的机制解析
  • 为人类文明建一座“永不遗忘”的数字博物馆:Funes 技术解析
  • 【计算机视觉】Car-Plate-Detection-OpenCV-TesseractOCR:车牌检测与识别
  • 在 MyBatis 中实现控制台输出 SQL 参数
  • java学习笔记
  • AI客服问答自动生成文章(基于deepseek实现)
  • 新疆维吾尔自治区乌鲁木齐市米东区政协原副主席朱文智被查
  • “爱鸟周”为何不能像FI和花展那样“市区联动”
  • 复旦大学文科杰出教授裘锡圭逝世,享年90岁
  • 调节负面情绪可以缓解慢性疼痛
  • 昆廷·斯金纳:作为“独立自主”的自由
  • 公积金利率降至历史最低!多项房地产利好政策落地,购房者置业成本又降了