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
opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例相关推荐
- c++ opencv 照片清晰度_opencv新手学习————素描视频(C++)
我也是第一次写知乎专栏,所以有些地方弄的不好,也请见谅. 首先我们明确自己目标---将自己所拥有的视频转换成为素描视频,所以我们得现有一段视频(如下即为我的示例视频) https://www.zhih ...
- 【OSATE学习笔记】AADL 样例 ARP4761 介绍
ARP4761介绍 本示例再现了ARP4761和AIR6110标准中描述的车轮制动系统.它最初是由卡耐基梅隆大学(CMU)的软件工程研究所(SEI)设计的,旨在展示OSATE的以下能力: Fault ...
- 【VC++学习日志】VCC++学习日志
2012.6.12 .Net Framework: 简单的说.Net Framework就是一个C++的类库 MFC 微软基础类库MFC(Microsoft Foundation Classes),是 ...
- java 注入日志_java框架学习日志-5(常见的依赖注入)
依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入. 依赖-- ...
- 日志库EasyLogging++学习系列(5)—— 辅助配置功能
正如前面<日志库EasyLogging++学习系列(3)-- 配置功能>文中最后提到的,在某些应用场景下,我们还需要通过其他的一些配置手段来辅助我们完成某些特殊功能,这些辅助配置手段包括设 ...
- Python学习日志16 - 数据库SQL查询
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...
- Python学习日志08 - 字典
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志08课 - 字典 前言 进入正题 创 ...
- Java日志框架-SLF4J入门 [ LogBack 样例实现 ]
概述 slf4j只是一个日志标准,并不是日志系统的具体实现. 我们编程的时候只需要操作slf4j,具体底层实现不关注,只需要配置即可. slf4j只做两件事情: 提供日志接口 提供获取具体日志对象的方 ...
- linux日志生成速率统计,Linux学习29-awk提取log日志信息,统计日志里面ip访问次数排序...
前言 有一段log日志,需从日志里面分析,统计IP访问次数排序前10名,查看是否有异常攻击. 日志提取 如下日志,这段日志包含的信息内容较多,我们希望提取ip,访问时间,请求方式,访问路径(不带参数) ...
最新文章
- ABAP 一个隐藏 selection-screen block的实例
- mongodb高可用性架构---Replica Set
- comsol稀物质传递_印刷指南丨印刷油墨传递的影响因素?
- 【温故知新】CSS学习笔记(盒子水平居中方法)
- C语言stdio.h与stdlib.h的区别
- 推荐几本对创业者很有用的书籍
- niosii spi 外部_基于Nios_II的DMA传输总结
- 如何只保留1000条数据mysql_php实现只保留mysql中最新1000条记录
- 页面上插入flash文件
- c语言编写弹窗提示是否确认退出_弹窗设计的5条基本原则
- SQL SERVER 和ACCESS/excel的数据导入导出
- Git安装遇到的问题fatal: Could not read from remote repository.的解决办法
- 使用WMI和性能计数器监控远程服务器权限设置
- VB2010的时间表示
- java 多线程面试题及答案
- 使用 AppFuse 的七个理由之二
- rabbitmq用户及vhost配置
- 服务器未能启动w3svc,win10,iis10无法启动,w3svc服务无法启动
- Gogs-轻量级代码仓库
- 深度linux安装宝塔,Linux 安装宝塔
热门文章
- 通过aws部署推荐系统_通过AWS Elastic Beanstalk轻松进行Spring Boot部署
- apache kafka_使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务...
- idea 切换java11_Java 11就在这里,您准备好进行切换了吗?
- java isempty_Optional.isEmpty()即将加入Java吗?
- Hibernate和UUID标识符
- java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?
- jboss5.1安全性配置_使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全
- java编译器分析_Java反编译器的剖析
- 取消堆集以提高延迟并减少AWS账单
- glassfish_重写到边缘–充分利用它! 在GlassFish上!