当前位置: 首页 > 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

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

http://www.xdnf.cn/news/356437.html

相关文章:

  • LeetCode 热题 100_编辑距离(94_72_中等_C++)(动态规划)
  • Rust 官方文档:人话版翻译指南
  • 高拟人化客服机器人显著提升用户接受度
  • zst-2001 历年真题 UML
  • 首版次软件测试的内容有哪些?首版次软件质量影响因素是什么?
  • IAR无法显示文件列表(即workspace)
  • RabbitMQ-高级特性1
  • WebRTC流媒体传输协议RTP点到点传输协议介绍,WebRTC为什么使用RTP协议传输音视频流?
  • 第十六节:图像形态学操作-顶帽与黑帽变换
  • java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。
  • 【网络入侵检测】基于源码分析Suricata的IP分片重组
  • 深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)
  • OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
  • Spring,SpringMVC,SpringBoot,SpringCloud的区别
  • Modbus RTU 详解 + FreeMODBUS移植(附项目源码)
  • 『Python学习笔记』ubuntu解决matplotlit中文乱码的问题!
  • Node.js数据抓取技术实战示例
  • 2025.05.08-得物春招算法岗-第三题
  • BLURRR剪辑软件免费版:创意剪辑,轻松上手,打造个性视频
  • 高效管理钉钉收款单数据集成到MySQL的技术方案
  • 用Python监控金价并实现自动提醒!附完整源码
  • TCP/IP协议的体系结构
  • Faiss 索引深度解析:从基础到实战
  • 驱动-互斥锁
  • 窗口函数row_number() OVER()对每个组内的行按照特定条件进行编号
  • 40. 组合总和 II
  • c++:迭代器(Iterator)
  • 【软件测试】测试用例的设计方法
  • Kafka集群加入新Broker节点会发生什么
  • 在Cline上调用MCP服务之MCP实践篇