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

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.mfbz.cn/a/557077.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql 查询实战3-解答

对mysql 查询实战3-题目&#xff0c;进行一个解答 11、查询每⽉产品交易与退款情况 目标&#xff1a;查询每⽉产品交易&#xff08;交易总额&#xff0c;交易数&#xff09;与退款情况&#xff08;退款总额&#xff0c;退款数&#xff09; 1&#xff0c;先把日期格式化 使用 E…

Savina Mx 高級的無塵擦拭布系列產品,吸水吸油性極強,不磨損原件

Savina Mx是日本KBSEIREN株式會社&#xff08;原KANEBO&#xff09;開發的目前*高級的無塵擦拭布系列產品&#xff0c;吸水吸油性極強&#xff0c;不磨損原件。廣氾用於光學鏡頭製造&#xff0c;辦公器材保養&#xff0c;10級以上的無塵車間淨化室&#xff0c;半導體生產線車間…

美易官方:以色列袭击伊朗!原油、黄金走势上涨?

以色列突然袭击伊朗的消息震惊了全球市场&#xff0c;引发了一场原油和黄金价格的飙升。这一事件不仅令投资者感到紧张&#xff0c;也引发了国际社会对于中东地区紧张局势的担忧。 以色列此次袭击的目标据说是伊朗的一处军事基地&#xff0c;据称该基地涉及到伊朗的核武器研发计…

Network: wirehark: 解包问题:乱序重组

如果一个大的TCP数据被分成几个segment&#xff0c;而每个segment如果走的路由途径不同的化&#xff0c;会导致下面这个解析上错误。从下面这个图里看&#xff0c;第一片和第二片的顺序的&#xff0c;但是第三片跑到了第二片的前面&#xff0c;wirehark就解析不出来了&#xff…

安卓apk文件签名

一、环境准备 链接: https://pan.baidu.com/s/1D3WxIL5M5ewyFNTqJzARPw 提取码: pd6w 上篇博文编译的apk文件 1、docker build -t android-build:v1.0.1 . 直接制作镜像 2、docker run -it android-build:v1.0.1 /bin/bash 运行进入容器 指定sdk的路径&#xff0c;然后直接…

华为欧拉系统(openEuler-22.03)安装深信服EasyConnect软件(图文详解)

欧拉镜像下载安装 iso镜像官网下载地址 选择最小化安装&#xff0c;标准模式 换华为镜像源 更换华为镜像站&#xff0c;加速下载&#xff1a; sed -i "s#http://repo.openeuler.org#https://mirrors.huaweicloud.com/openeuler#g" /etc/yum.repos.d/openEuler.r…

使用Termux在Android设备上编译运行SpecCPU2006

Spec CPU 2006 的使用说明&#xff08;曲线救国版&#xff09; 因本部分实验用到的Spec CPU2006依赖于多个编译工具包&#xff0c;因此对源码的编译要在配置好环境的Linux设备上运行&#xff0c;根据实验发现&#xff0c;现有的环境&#xff08;包括adb和termux&#xff09;都不…

通过实例学C#之FileStream类

简介 可以通过此类进行文件读取。 首先在项目所在文件夹的Bin文件中新建一个test.txt文件&#xff0c;里面输入内容“hello world!”。 构造函数 FileStream (string path, FileMode mode&#xff0c;FileAccess access) 通过路径文件path&#xff0c;打开文件模式mode以及读写…

Arcgis Pro2.5安装教程(内含安装文件)

​最近处理的数据量大&#xff0c;发现arcmap这种老产品属实是不行了&#xff0c;相比于下一代的Arcgis Pro,不但运行速度慢&#xff0c;也容易遇到突然关闭的问题&#xff0c;之前基于团队的选择也没办法&#xff0c;最近实在是被数据搞得无语了&#xff0c;一鼓作气装上了Arc…

Java序列流和打印流、对象序列化

目录 1、序列流 1.1 SequenceInputStream 1.2 案例:切割mp3并合并 2、 对象的序列化 2.1 ObjectOutputStream与ObjectInputStream 2.2 Serializable 3、Properties. 4、打印流 4.1 PrintStream 5、操作基本数据类型的流对象 5.1 DataInputStream以及DataOutputStrea…

书生·浦语大模型全链路开源体系-第6课

书生浦语大模型全链路开源体系-第6课 书生浦语大模型全链路开源体系-第6课相关资源Lagent & AgentLego 智能体应用搭建环境准备创建虚拟环境安装LMDeploy安装 Lagent安装 AgentLego Lagent 轻量级智能体框架使用 LMDeploy 部署启动并使用 Lagent Web Demo使用自定义工具获取…

呼叫系统的技术实现原理和运作流程,ai智能系统,呼叫中心外呼软交换部署

呼叫系统的技术实现原理和运作流程可以涉及多个组成部分&#xff0c;包括硬件设备、软件系统和通信协议。以下是一般情况下呼叫系统的技术实现原理和运作流程的概述&#xff1a; 硬件设备&#xff1a; 服务器&#xff1a;用于承载呼叫系统的核心软件和数据库。电话交换机&#…

学习-官方文档编辑方法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Linux常用命令英文全称与中文解释

Linux操作系统中有许多常用的命令&#xff0c;每个命令都有其英文全称&#xff08;Full Name&#xff09;和中文解释。以下是一些常见的Linux命令及其英文全称和中文解释的列表&#xff1a; 你猜猜这个是哪个软件的快捷键↑ man: Manual 意思是手册&#xff0c;可以用这个命…

如何让指定 Windows 程序崩溃

一、为何要把人家搞崩溃呢 看到这个标题&#xff0c;大家可能觉得奇怪&#xff0c;为什么要让指定程序崩溃呢&#xff0c;难道是想作恶吗&#xff1f;&#x1f613; 哈哈&#xff0c;绝对不是&#xff0c;真实原因是这样的。如果大家用过 Windows 电脑&#xff0c;可能见过类…

【个人博客搭建】(3)添加SqlSugar ORM 以及Json配置文件读取

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…

展会媒体邀约资源,媒体宣传服务执行

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 在组织展会时&#xff0c;媒体宣传服务的执行是提升展会知名度和影响力的关键环节。 确定目标媒体&#xff1a;根据展会的主题和目标受众&#xff0c;选择适合的媒体进行邀请。这可能包…

微软 SDL 安全研发生命周期详解

微软SDL&#xff08;Security Development Lifecycle&#xff09;是一种安全软件开发的方法论&#xff0c;它强调在整个产品开发过程中融入安全考虑因素。SDL 是一个动态的过程&#xff0c;包括多个阶段和活动&#xff0c;以确保产品的安全开发、测试、部署和运行。Microsoft 要…

2023天梯赛 L3_2 完美树 【树形DP、01最大/小价值】

完美树 思路 观察发现&#xff1a;如果一颗子树 u u u&#xff0c;它刚好有偶数个节点&#xff0c;那么 0 0 0 和 1 1 1 的染色数量一定相等&#xff0c;如果有奇数个节点&#xff0c;那么 0 0 0 和 1 1 1 的数量一定恰好相差 1 1 1&#xff08;可能是 0 0 0 多&#x…

OpenHarmony多媒体-mp4parser

简介 一个读取、写入操作音视频文件编辑的工具。 编译运行 1、通过IDE工具下载依赖SDK&#xff0c;Tools->SDK Manager->Openharmony SDK 把native选项勾上下载&#xff0c;API版本>10 2、开发板选择RK3568&#xff0c;ROM下载地址. 选择开发板类型是rk3568&#xf…