【opencv】示例-videocapture_starter.cpp 从视频文件、图像序列或连接到计算机的摄像头中捕获帧...

devtools/2024/12/22 4:46:35/

c19762bcb2d82439e460f2c45cfe81ad.png

/**
* @file videocapture_starter.cpp
* @brief 一个使用OpenCV的VideoCapture与捕获设备,视频文件或图像序列的入门示例
* 就像CV_PI一样简单,对吧?
*
*  创建于: 2010年11月23日
*      作者: Ethan Rublee
*
*  修改于: 2013年4月17日
*      作者: Kevin Hughes
*/#include <opencv2/imgcodecs.hpp>  // 包含处理图像编解码的功能
#include <opencv2/videoio.hpp>    // 包含处理视频读写的功能
#include <opencv2/highgui.hpp>    // 包含GUI函数以及视频读写功能#include <iostream>   // 包含基本输入输出功能
#include <stdio.h>    // 包含C语言标准输入输出库using namespace cv;  // 使用命名空间cv,避免每次调用OpenCV功能时都要加cv::前缀
using namespace std; // 使用标准命名空间std,避免每次都要加std::前缀// 在匿名命名空间中隐藏局部函数
namespace {void help(char** av) {  // help函数提供了使用说明cout << "The program captures frames from a video file, image sequence (01.jpg, 02.jpg ... 10.jpg) or camera connected to your computer." << endl<< "Usage:\n" << av[0] << " <video file, image sequence or device number>" << endl<< "q,Q,esc -- quit" << endl  // 按q、Q或esc键退出程序<< "space   -- save frame" << endl << endl  // 按空格键保存帧(图片)<< "\tTo capture from a camera pass the device number. To find the device number, try ls /dev/video*" << endl<< "\texample: " << av[0] << " 0" << endl  // 提供了如何使用摄像头设备进行捕获的示例<< "\tYou may also pass a video file instead of a device number" << endl<< "\texample: " << av[0] << " video.avi" << endl  // 提供了如何打开视频文件的示例<< "\tYou can also pass the path to an image sequence and OpenCV will treat the sequence just like a video." << endl<< "\texample: " << av[0] << " right%%02d.jpg" << endl;  // 提供了如何打开图像序列的示例}int process(VideoCapture& capture) {  // process函数用于处理视频捕获的过程int n = 0;char filename[200];  // 用于存储文件名的字符数组string window_name = "video | q or esc to quit";  // 显示窗口的名称cout << "press space to save a picture. q or esc to quit" << endl; // 提示用户按空格保存图片,按q或esc退出namedWindow(window_name, WINDOW_KEEPRATIO); // 创建一个可调整大小的窗口Mat frame; // 创建一个Mat对象,用于存储每一帧图像数据for (;;) {capture >> frame; // 从VideoCapture对象中获取一帧图像到frame中if (frame.empty()) // 如果帧为空,则退出循环break;imshow(window_name, frame); // 显示当前帧char key = (char)waitKey(30); // 等待30毫秒,如果有按键则返回按键值switch (key) {case 'q':case 'Q':case 27: // 按esc键return 0;  // 退出程序case ' ': // 按空格键,保存一幅图像snprintf(filename,sizeof(filename),"filename%.3d.jpg",n++);imwrite(filename,frame);  // 将当前帧保存为文件cout << "Saved " << filename << endl;break;default:break;}}return 0;}
}int main(int ac, char** av) {CommandLineParser parser(ac, av, "{help h||}{@input||}"); // 命令行解析器,用于解析命令行参数if (parser.has("help"))  // 如果指定了help参数,则显示帮助信息{help(av);  // 调用help函数return 0;}string arg = parser.get<string>("@input"); // 获取输入参数,可能是视频文件名、图像序列或设备号if (arg.empty()) {  // 如果没有输入参数,则显示帮助信息并退出help(av);return 1;}VideoCapture capture(arg); // 尝试以视频文件名或图像序列的形式打开输入if (!capture.isOpened()) // 如果打开失败,则尝试将输入当作视频设备号来打开capture.open(atoi(arg.c_str()));if (!capture.isOpened()) { // 如果还是打开失败,显示错误信息并显示帮助信息后退出cerr << "Failed to open the video device, video file or image sequence!\n" << endl;help(av);return 1;}return process(capture); // 调用process函数处理视频捕获过程
}

这段代码是一个使用OpenCV库进行视频捕获的C++程序例子。程序可以从视频文件、图像序列(如01.jpg, 02.jpg等)或连接到计算机的摄像头中捕获帧。用户可以通过命令行参数指定输入源,并且通过按键操作来保存帧或退出程序。程序首先定义了两个函数:help函数用于显示使用方法,process函数用于捕获视频并处理按键操作。在main函数中,程序会根据命令行参数尝试打开视频拍摄设备、视频文件或图像序列文件,并在成功打开后调用process函数来捕获和处理视频帧。如果无法打开指定的输入源,则会提示错误信息并显示帮助信息。


http://www.ppmy.cn/devtools/2022.html

相关文章

从iPhone恢复已删除照片的最佳软件

本文分享了从iPhone恢复已删除照片的最佳软件。如果您正在寻找如何从iPhone恢复已删除的照片&#xff0c;请查看这篇文章。 为什么您需要软件从iPhone恢复已删除的照片&#xff1f; 没有什么比丢失iPhone上的重要数据更痛苦的了&#xff0c;尤其是一些具有珍贵回忆的照片。有时…

Avi Wigderson:重塑计算随机性的理论巨匠

Avi Wigderson&#xff1a;重塑计算随机性的理论巨匠 在计算科学领域&#xff0c;Avi Wigderson教授是一个响亮的名字&#xff0c;他的贡献不仅在于推动了理论的边界&#xff0c;更在于其实用性和对后续研究的深远影响。近日&#xff0c;Wigderson荣获了图灵奖&#xff0c;这无…

综合项目-博客

1. 运行环境&#xff1a; 主机主机名系统服务192.168.32.168 Server-Web Linux Web 192.168.32.169 Server-NFS- DNS Linux NFS/DNS 2. 基础配置 配置主机名&#xff0c;静态 IP 地址 开启防火墙并配置 部分开启 SElinux 并配置 服务器之间使用同 ntp.aliyun.com 进行…

uniapp微信小程序蓝牙连接与设备数据对接

uniapp微信小程序蓝牙连接与设备数据对接 蓝牙连接并通信方法封装大致步骤。 初始化蓝牙并搜索&#xff1b;获取并启用service服务&#xff1b;数据读取和监听设备返回数据 需要使用uniapp官方提供api&#xff1a; // 关闭蓝牙 uni.closeBluetoothAdapter({}) // 打开蓝牙 …

【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一

目录 引言 1 -> C语言传统的处理错误的方式 2 -> C异常概念 3 -> 异常的使用 3.1 -> 异常的抛出和捕获 3.2 -> 异常的重新抛出 3.3 -> 异常规范 4 -> 自定义异常体系 5 -> C标准库的异常体系 6 -> 异常的优缺点 引言 在C编程中&#xff…

学习疑惑:Axure9中该如何进行交互设置

我们知道&#xff0c;Axure RP 9从2019年4月面世&#xff0c;至今已经接近一年的时间了。但是仍然有很多同学不清楚、不习惯它的使用。 使用什么版本的软件&#xff0c;取决于个人&#xff0c;你的使用习惯、你的工作习惯、你的团队使用情况、你的公司要求等等。所以现在的情况…

bugku-web-decrypt

这里的提示解密后没有什么意义 这里下载文件包 得到一个index.php文件 得到代码 <?php function encrypt($data,$key) {$key md5(ISCC);$x 0;$len strlen($data);$klen strlen($key);for ($i0; $i < $len; $i) { if ($x $klen){$x 0;}$char . $key[$x];$x1;}for…

【LeetCode热题100】【二分查找】搜索二维矩阵

题目链接&#xff1a;74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; 在一个有序二维数组里面查找元素&#xff0c;同【LeetCode热题100】【矩阵】搜索二维矩阵 II-CSDN博客 如果用二分查找&#xff0c;时间复杂度是log(mn)&#xff0c;但是可以实现时间复杂度为O…