opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例

1.VideoCapture可以打开多种来源的数据流,但常见的是相机、视频及图像序列三类数据流:

(1)打开相机数据流,需要指定相机在主机上的设备编号,若主机上只有一个相机则编号通常是0。

(2)打开视频数据流,需要指定视频的完整路径,如/root/data/vtest.avi。

(3)打开图像序列流,需要指定图像序列的完整路径,其中路径中的文件名的格式同C言语中prinf的格式,可参见《CV学习日志:C语言中文件IO使用要点》。如/root/data下有ima1.png、ima2.png、…、ima123.png,则给定的文件名为/root/data/ima%d.png;如/root/data下有ima001.png、ima002.png、…、ima123.png,则给定的名为/root/data/ima%03d.png,这里%03d表示图像名序列号是整数、占宽三位、不足三位的高位是零填充。

2.VideoCapture常用的函数是构造、read、set及get:

(1)构造函数:打开数据流。

(2)read函数:读一帧数据流。

(3)set函数:设置VideoCapture属性值,常用属性是CAP_PROP_FRAME_HEIGHT和CAP_PROP_FRAME_WIDTH。

(4)get函数:获取VideoCapture属性值,常用属性是CAP_PROP_FRAME_HEIGHT和CAP_PROP_FRAME_WIDTH。

3.类AboutVideoCAP是VideoCapture的使用样例,其功能如下:

(1)打开数据流功能:可打开相机、视频或图像序列,相机指定设备号、视频和图像序列指定完整路径。

(2)保存数据流功能:按空格保存图像到给定的目录或默认的workDir/data,图像名是时间戳,单位纳秒。

(3)帧显示时间设置功能:默认每帧显示30毫秒,可指定为期望显示的时间,其中设为零表示一直显示直到按下任意键。

(4)帧高度宽度设置功能:对于相机数据流,可指定相机支持的尺寸,否则为相机默认的输出尺寸。

可在https://github.com/opencv/opencv/tree/master/samples/data下载vtest.avi和left*.jpg测试视频流和图像序列。

也可参见关于VedioCapture和VideoWriter的综合使用样例《OpenCV-Utils学习日志:VideoWriter使用要点》。

以下是详细代码,依赖于C++14、OpenCV4.x和Spdlog。

1 #include

2 #include

3 #include

4 using namespacestd;5 using namespacecv;6

7 #ifndef StrPairKey8 #define StrPairKey(key) make_pair(#key, key)

9 #define StrPairVal(val) make_pair(val, #val)

10 #endif

11

12 classAboutVideoCAP13 {14 public:15 map> capProps =

16 {17 make_pair(0, StrPairVal(CAP_PROP_POS_MSEC)),18 make_pair(1, StrPairVal(CAP_PROP_POS_FRAMES)),19 make_pair(2, StrPairVal(CAP_PROP_FRAME_COUNT)),20 make_pair(3, StrPairVal(CAP_PROP_POS_AVI_RATIO)),21

22 make_pair(4, StrPairVal(CAP_PROP_FRAME_WIDTH)),23 make_pair(5, StrPairVal(CAP_PROP_FRAME_HEIGHT)),24 make_pair(6, StrPairVal(CAP_PROP_FPS)),25 make_pair(7, StrPairVal(CAP_PROP_FOURCC)),26 make_pair(8, StrPairVal(CAP_PROP_FORMAT)),27 make_pair(9, StrPairVal(CAP_PROP_MODE)),28

29 make_pair(10, StrPairVal(CAP_PROP_BRIGHTNESS)),30 make_pair(11, StrPairVal(CAP_PROP_HUE)),31 make_pair(12, StrPairVal(CAP_PROP_SATURATION)),32 make_pair(13, StrPairVal(CAP_PROP_CONTRAST)),33 make_pair(14, StrPairVal(CAP_PROP_GAIN)),34 make_pair(15, StrPairVal(CAP_PROP_EXPOSURE))35 };36

37 void TestMe(int argc = 0, char** argv = 0)38 {39 //0.GetParams

40 if (argc < 3) { spdlog::critical("Usage: appName streamFrom saveDir waitTime(Optional) deviceRows(Optional) deviceCols(Optional)"); return; }41 string imaFrom = argv[1];42 string saveDir = argv[2];43 int waitTime = 30; if (argc > 3) waitTime = atoi(argv[3]);44 int deviceRows = 0; if (argc > 4) deviceRows = atoi(argv[4]);45 int deviceCols = 0; if (argc > 5) deviceCols = atoi(argv[5]);46

47 //1.CreatDirectory

48 utils::fs::createDirectories(saveDir);49 spdlog::set_pattern("%v"); spdlog::info("imaFrom: {}\nsaveDir: {}\nwaitTime: {}\ndeviceRows: {}\ndeviceCols: {}", imaFrom, saveDir, waitTime, deviceRows, deviceCols);50

51 //2.OpenStream

52 VideoCapture cap;53 if (imaFrom.size() == 1)54 if (cap.open(atoi(imaFrom.c_str())) == false) { spdlog::critical("Failed to open device: {}", imaFrom); return; }55 if (imaFrom.size() > 1)56 if (cap.open(imaFrom) == false) { spdlog::critical("Failed to open file: {}", imaFrom); return; }57

58 //3.SetDevice

59 if (imaFrom.size() == 1 && argc > 4) cap.set(CAP_PROP_FRAME_HEIGHT, deviceRows);60 if (imaFrom.size() == 1 && argc > 5) cap.set(CAP_PROP_FRAME_WIDTH, deviceCols);61

62 //4.GetDevice

63 spdlog::info("cap.isOpened(): {}", cap.isOpened());64 spdlog::info("cap.getBackendName():", cap.getBackendName());65 for (map>::iterator it = capProps.begin(); it != capProps.end(); ++it)66 spdlog::info("cap.get({}): {}", it->second.second, cap.get(it->second.first));67

68 //5.ReadStream

69 cv::namedWindow(__FUNCTION__, WINDOW_NORMAL);70 spdlog::info("Press space to save one and q/Q to exit");71 Mat frame;72 while(cap.read(frame))73 {74 //5.1 ShowImage

75 cv::imshow(__FUNCTION__, frame);76 int c =cv::waitKey(waitTime);77 if (c == 'q' || c == 'Q') break;78

79 //5.2 SaveImage

80 if (c == ' ')81 {82 string savePath = saveDir + fmt::format("/{}.png", chrono::time_point_cast<:nanoseconds>(chrono::system_clock::now()).time_since_epoch().count());83 cv::imwrite(savePath, frame);84 spdlog::info("Saved to:" +savePath);85 }86 }87 cv::destroyWindow(__FUNCTION__);88 }89 };90

91 int main(int argc, char** argv) { AboutVideoCAP me; me.TestMe(argc, argv); return 0; }

View Code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdbc查询序列_JDBC –模拟序列

jdbc查询序列也许我们每个人在程序员的生活中至少遇到过一次这个问题- 如何模拟数据库序列&#xff1f; 在下面&#xff0c;您可能会发现我对该问题解决方案的各种了解。 假设我们有一个接口定义了所需的API&#xff0c;用于返回整数序列&#xff1a; public interface Sequen…

利用 GregorianCalendar 制作当前月的月历

【0】README 0.1&#xff09;本文文字总结于 core java volume 1 &#xff0c; 源代码均为原创&#xff1b; 0.2&#xff09;本文旨在熟悉 GregorianCalendar 日历类&#xff0c;每一天就是一个GregorianCalendar 日历类&#xff0c;一天有很多的日历属性&#xff0c;觉得用它…

pyecharts怎么绘制散点图_PyeCharts绘制各种图形

简介PyeCharts 是一个用于生成 Echarts 图表的类库&#xff0c;用其生成的图可视化效果非常棒&#xff0c;而且使用起来非常简单。下面是一些常用图的pyecharts实现方法柱状图bar pye.Bar("柱状图")#新建柱状图bar.add("服装", #图例名称["衬衫"…

junit junit_穿越JUnit流

junit junit关于JUnit 5迁移的好处之一是&#xff0c;您可以在老式模式下运行JUnit 4测试&#xff0c;并且所有内容仍然兼容。 不利的一面是&#xff0c;某些注释和方法在JUnit 4和JUnit 5中具有相同的名称&#xff0c;并且当两组库依赖项都可用时&#xff0c;很容易导入错误的…

被遗忘的软件产品形态

从2010年以后&#xff0c;很多公司开发的软件产品&#xff0c;很少有客户端了&#xff0c;web2.0之后&#xff0c;主流的业务系统基本上都是基于Web去构建业务系统。这几年见到的业务应用系统都是基于Web的构建的。而在To C市场&#xff0c;几乎就没有客户端了&#xff0c;都是…

vue进行判断使用class_vue判断dom的class

vue点击给dom添加class然后获取含有class的dom{{item.name}}{{item2.name}}jschek(index2, index) {this.iac[index2] indexthis.iac this.iac.concat([]);this.checkchose()},checkchose:function(){var chosethisvar chosedomchose.$refs.choseboxconsole.log(chosedom)for…

方法参数的值调用+引用调用+深浅拷贝

【0】README 0.1&#xff09;本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理清值调用引用调用&#xff1b; 【1】参数传递给方法的专业术语&#xff1a; 1.1&#xff09;值调用&#xff1a;它表示方法接收的是调用者提供的值&#xff1b; 1.2&#xff09;引用…

设计模式 工厂方法_工厂方法设计模式

设计模式 工厂方法工厂方法模式是流行的创作设计模式之一。 它并不特别依赖于工厂对象来创建对象。 而是要在同一类中使用单独的方法来创建对象。 Factory Method模式定义了一个用于创建对象的接口&#xff0c;但是让子类决定如何实例化其对象。 每个子类必须定义其Factory方法…

靖江机器人怎么样_铁饭碗不保?靖江可能消失的12大职业!快看有你的工作没?...

原标题&#xff1a;铁饭碗不保&#xff1f;靖江可能消失的12大职业&#xff01;快看有你的工作没&#xff1f;无人飞机、无人驾驶、智能机器人....你能想象这些充满现代感的高科技正在改变我们的生活吗&#xff1f;在科技高速发展的今天人工智能逐渐能够代替人类的部分工作但&a…

MarkdownPad 汉化破解(含下载地址)

转自 http://jingyan.baidu.com/article/ca41422fe209271eaf99ed7c.html MarkdownPad是一个全功能Markdown编辑器的Windows。 【1】MarkdownPad 汉化破解&#xff08;含下载地址&#xff09; 工具/原料 MarkdownPad 2.4 方法/步骤 软件 下载地址&#xff08;本软件为绿色版…

捡对象引流脚本 内容_对象和索引流

捡对象引流脚本 内容我本来要写一篇关于如何将流与每个元素的索引混合的文章&#xff0c;但是Baeldung上的人们已经很好地涵盖了这个主题 &#xff01; 鉴于我是他们编辑团队的一员&#xff0c;我为他们/我们感到自豪。 有趣的是&#xff0c;特别是Streams中的Java函数式编程如…

散列之再散列

【0】README 0.1&#xff09;本文描述总结于 数据结构与算法分析&#xff0c; 但源代码为原创&#xff1b; 0.2&#xff09;为什么写这篇博文&#xff1f; 再散列的代码实现 包括了 解决冲突的方法实现&#xff1b;很有代表性&#xff1b;&#xff08;本源代码采用的解决冲突…

激活策略 查询_5个提问,详细介绍北极星指标的策略框架

北极星指标&#xff08;North Star Metric&#xff09;已经逐渐成为许多公司指导产品发展的重要指标&#xff0c;本文通过五个设问和多个行业案例&#xff0c;系统性地介绍北极星指标这类产品策略框架。如今有非常多的人在谈论和使用北极星指标&#xff08;North Star Metric&a…

变色龙嗅探卡功能_变色龙功能

变色龙嗅探卡功能在《神秘博士》中&#xff0c;卡梅利恩&#xff08;Kamelion&#xff09;角色是一个可以采取任何形式的机器人。 据称&#xff0c;他们使用的物理道具非常麻烦&#xff0c;只有其创建者才能理解&#xff0c;而该创建者并没有帮助纠正它。 因此&#xff0c;Cha…

老人与海好词100英文带翻译_《老人与海》经典语录(英文+译文)

《老人与海》是海明威于1951年在古巴写的一篇中篇小说&#xff0c;于1952年出版。是海明威最著名的作品之一。它围绕一位老年古巴渔夫&#xff0c;与一条巨大的马林鱼在离岸很远的湾流中搏斗而展开故事的讲述。它奠定了海明威在世界文学中的突出地位&#xff0c;这篇小说相继获…

java多态+多态中隐含的问题

【0】RAEDME 0.1&#xff09;本文总结于 core java volume 1&#xff0c; 感觉多态中存在的这个问题很新颖&#xff0c;故分享之&#xff1b; 【1】继承与is-a法则 1.1&#xff09;有一个用来判断是否应该设计为继承关系的规则&#xff1a; 这就是 is-a 规则&#xff0c; 它…

MacOS命令终端(CMD)的快捷键/终端快捷键

文章目录常用删除清屏复制粘贴交互/撤销移动光标查找历史命令使用命令查看历史命令标签页控制命令滚屏常用 快捷键说明Control A跳到本行的行首Control E跳到本行的行尾Control U删除光标前面&#xff08;左侧&#xff09;的所有文字&#xff08;还有剪切功能&#xff09;&…

apache kafka_使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务...

apache kafka微服务架构不是免费的午餐 &#xff01; 微服务需要解耦&#xff0c;灵活&#xff0c;操作透明&#xff0c;数据感知和弹性。 过去几年的大多数材料仅讨论具有紧密耦合且不可扩展的技术&#xff08;如REST / HTTP&#xff09;的点对点体系结构。 这篇博客文章介绍了…

c++ 箭头符号怎么打_老司机怎么测量三极管管型、管脚和性能?三极管测量此中有深意...

众所周知&#xff0c;三极管具有基极、集电极、发射极三极&#xff0c;另外还有NPN型还有PNP型&#xff0c;那么如何用最快的方法进行三极管测量来确认三极管的管脚和管型。另外&#xff0c;三极管的工作状态是否可以通过三极管测量进行判断&#xff1f;接下来本网整理了老司机…

java强制类型转换

【0】README 0.1&#xff09;本文转自 core java volume 1 &#xff0c;在强制类型转换部分&#xff0c;它提到了 使用 instanceof 以保证 类型成功转换&#xff08;而不是抛出异常&#xff09;&#xff0c;很有看点&#xff1b; 【1】强制类型转换的相关知识点&#xff1a; …