本次对“视频捕获(VideoCapture)模块”做出分析,给出源代码和对应的程序流程框架。

视频捕获模块的主要功能是设置视频或相机参数,并读取设置配置参数,最后进入帧处理模块的process进程,该模块的源码如下,请重点关注start()函数:

  1. #include "VideoCapture.h"
  2. namespace bgslibrary
  3. {
  4. namespace VC_ROI
  5. {
  6. IplImage* img_input1 = 0;
  7. IplImage* img_input2 = 0;
  8. int roi_x0 = 0;
  9. int roi_y0 = 0;
  10. int roi_x1 = 0;
  11. int roi_y1 = 0;
  12. int numOfRec = 0;
  13. int startDraw = 0;
  14. bool roi_defined = false;
  15. bool use_roi = true;
  16. bool disable_event = false;
  17. void reset(void)
  18. {
  19. disable_event = false;
  20. startDraw = false;
  21. }
  22. void VideoCapture_on_mouse(int evt, int x, int y, int flag, void* param)
  23. {
  24. if (use_roi == false || disable_event == true)
  25. return;
  26. if (evt == CV_EVENT_LBUTTONDOWN)
  27. {
  28. if (!startDraw)
  29. {
  30. roi_x0 = x;
  31. roi_y0 = y;
  32. startDraw = 1;
  33. }
  34. else
  35. {
  36. roi_x1 = x;
  37. roi_y1 = y;
  38. startDraw = 0;
  39. roi_defined = true;
  40. disable_event = true;
  41. }
  42. }
  43. if (evt == CV_EVENT_MOUSEMOVE && startDraw)
  44. {
  45. //redraw ROI selection
  46. img_input2 = cvCloneImage(img_input1);
  47. cvRectangle(img_input2, cvPoint(roi_x0, roi_y0), cvPoint(x, y), CV_RGB(255, 0, 0), 1);
  48. cvShowImage("Input", img_input2);
  49. cvReleaseImage(&img_input2);
  50. //startDraw = false;
  51. //disable_event = true;
  52. }
  53. }
  54. }
  55. VideoCapture::VideoCapture() : key(0), start_time(0), delta_time(0), freq(0), fps(0), frameNumber(0), stopAt(0),
  56. useCamera(false), useVideo(false), input_resize_percent(100), showOutput(true), enableFlip(false)
  57. {
  58. std::cout << "VideoCapture()" << std::endl;
  59. }
  60. VideoCapture::~VideoCapture()
  61. {
  62. std::cout << "~VideoCapture()" << std::endl;
  63. }
  64. void VideoCapture::setFrameProcessor(IFrameProcessor* frameProcessorPtr)
  65. {
  66. frameProcessor = frameProcessorPtr;
  67. }
  68. void VideoCapture::setCamera(int index)
  69. {
  70. useCamera = true;
  71. cameraIndex = index;
  72. useVideo = false;
  73. }
  74. void VideoCapture::setUpCamera()
  75. {
  76. std::cout << "Camera index:" << cameraIndex << std::endl;
  77. capture = cvCaptureFromCAM(cameraIndex);
  78. if (!capture)
  79. std::cerr << "Cannot open initialize webcam!\n" << std::endl;
  80. }
  81. void VideoCapture::setVideo(std::string filename)
  82. {
  83. useVideo = true;
  84. videoFileName = filename;
  85. useCamera = false;
  86. }
  87. void VideoCapture::setUpVideo()
  88. {
  89. capture = cvCaptureFromFile(videoFileName.c_str());
  90. if (!capture)
  91. std::cerr << "Cannot open video file " << videoFileName << std::endl;
  92. }
  93. void VideoCapture::start()
  94. {
  95. ///////////////loadConfig
  96. loadConfig();
  97. ///////////////setUpCamera
  98. if (useCamera) setUpCamera();
  99. ///////////////setUpVideo
  100. if (useVideo)  setUpVideo();
  101. if (!capture)  std::cerr << "Capture error..." << std::endl;
  102. int input_fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
  103. std::cout << "input->fps:" << input_fps << std::endl;
  104. IplImage* frame1 = cvQueryFrame(capture);
  105. frame = cvCreateImage(cvSize((int)((frame1->width*input_resize_percent) / 100), (int)((frame1->height*input_resize_percent) / 100)), frame1->depth, frame1->nChannels);
  106. //cvCreateImage(cvSize(frame1->width/input_resize_factor, frame1->height/input_resize_factor), frame1->depth, frame1->nChannels);
  107. std::cout << "input->resize_percent:" << input_resize_percent << std::endl;
  108. std::cout << "input->width:" << frame->width << std::endl;
  109. std::cout << "input->height:" << frame->height << std::endl;
  110. double loopDelay = 33.333;
  111. if (input_fps > 0)
  112. loopDelay = (1. / input_fps)*1000.;
  113. std::cout << "loopDelay:" << loopDelay << std::endl;
  114. std::cout << "Press 'ESC' to stop..." << std::endl;
  115. bool firstTime = true;
  116. do
  117. {
  118. frameNumber++;
  119. frame1 = cvQueryFrame(capture);
  120. if (!frame1) break;
  121. cvResize(frame1, frame);
  122. if (enableFlip)
  123. cvFlip(frame, frame, 0);
  124. if (VC_ROI::use_roi == true && VC_ROI::roi_defined == false && firstTime == true)
  125. {
  126. VC_ROI::reset();
  127. do
  128. {
  129. cv::Mat img_input(frame);
  130. if (showOutput)
  131. {
  132. cv::imshow("Input", img_input);
  133. std::cout << "Set ROI (press ESC to skip)" << std::endl;
  134. VC_ROI::img_input1 = new IplImage(img_input);
  135. cvSetMouseCallback("Input", VC_ROI::VideoCapture_on_mouse, NULL);
  136. key = cvWaitKey(0);
  137. delete VC_ROI::img_input1;
  138. }
  139. else
  140. key = KEY_ESC;
  141. if (key == KEY_ESC)
  142. {
  143. std::cout << "ROI disabled" << std::endl;
  144. VC_ROI::reset();
  145. VC_ROI::use_roi = false;
  146. break;
  147. }
  148. if (VC_ROI::roi_defined)
  149. {
  150. std::cout << "ROI defined (" << VC_ROI::roi_x0 << "," << VC_ROI::roi_y0 << "," << VC_ROI::roi_x1 << "," << VC_ROI::roi_y1 << ")" << std::endl;
  151. break;
  152. }
  153. else
  154. std::cout << "ROI undefined" << std::endl;
  155. } while (1);
  156. }
  157. if (VC_ROI::use_roi == true && VC_ROI::roi_defined == true)
  158. {
  159. CvRect rect = cvRect(VC_ROI::roi_x0, VC_ROI::roi_y0, VC_ROI::roi_x1 - VC_ROI::roi_x0, VC_ROI::roi_y1 - VC_ROI::roi_y0);
  160. cvSetImageROI(frame, rect);
  161. }
  162. cv::Mat img_input(frame);
  163. if (showOutput)
  164. cv::imshow("Input", img_input);
  165. ///////////////saveConfig
  166. if (firstTime)
  167. saveConfig();
  168. start_time = cv::getTickCount();
  169. ///////////////frameProcessor,start "Background Modeling"
  170. frameProcessor->process(img_input);
  171. int64 delta_time = cv::getTickCount() - start_time;
  172. freq = cv::getTickFrequency();
  173. fps = freq / delta_time;
  174. //std::cout << "FPS: " << fps << std::endl;
  175. cvResetImageROI(frame);
  176. key = cvWaitKey(loopDelay);
  177. //std::cout << "key: " << key << std::endl;
  178. if (key == KEY_SPACE)
  179. key = cvWaitKey(0);
  180. if (key == KEY_ESC)
  181. break;
  182. if (stopAt > 0 && stopAt == frameNumber)
  183. key = cvWaitKey(0);
  184. firstTime = false;
  185. } while (1);
  186. cvReleaseCapture(&capture);
  187. }
  188. void VideoCapture::saveConfig()
  189. {
  190. CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_WRITE);
  191. cvWriteInt(fs, "stopAt", stopAt);
  192. cvWriteInt(fs, "input_resize_percent", input_resize_percent);
  193. cvWriteInt(fs, "enableFlip", enableFlip);
  194. cvWriteInt(fs, "use_roi", VC_ROI::use_roi);
  195. cvWriteInt(fs, "roi_defined", VC_ROI::roi_defined);
  196. cvWriteInt(fs, "roi_x0", VC_ROI::roi_x0);
  197. cvWriteInt(fs, "roi_y0", VC_ROI::roi_y0);
  198. cvWriteInt(fs, "roi_x1", VC_ROI::roi_x1);
  199. cvWriteInt(fs, "roi_y1", VC_ROI::roi_y1);
  200. cvWriteInt(fs, "showOutput", showOutput);
  201. cvReleaseFileStorage(&fs);
  202. }
  203. void VideoCapture::loadConfig()
  204. {
  205. CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_READ);
  206. stopAt = cvReadIntByName(fs, 0, "stopAt", 0);
  207. input_resize_percent = cvReadIntByName(fs, 0, "input_resize_percent", 100);
  208. enableFlip = cvReadIntByName(fs, 0, "enableFlip", false);
  209. VC_ROI::use_roi = cvReadIntByName(fs, 0, "use_roi", true);
  210. VC_ROI::roi_defined = cvReadIntByName(fs, 0, "roi_defined", false);
  211. VC_ROI::roi_x0 = cvReadIntByName(fs, 0, "roi_x0", 0);
  212. VC_ROI::roi_y0 = cvReadIntByName(fs, 0, "roi_y0", 0);
  213. VC_ROI::roi_x1 = cvReadIntByName(fs, 0, "roi_x1", 0);
  214. VC_ROI::roi_y1 = cvReadIntByName(fs, 0, "roi_y1", 0);
  215. showOutput = cvReadIntByName(fs, 0, "showOutput", true);
  216. cvReleaseFileStorage(&fs);
  217. }
  218. }

对应的流程框架如下图:

背景建模技术(五):视频捕获(VideoCapture)模块的更多相关文章

  1. 背景建模技术(二):BgsLibrary的框架、背景建模的37种算法性能分析、背景建模技术的挑战

    背景建模技术(二):BgsLibrary的框架.背景建模的37种算法性能分析.背景建模技术的挑战 1.基于MFC的BgsLibrary软件下载 下载地址:http://download.csdn.ne ...

  2. 背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能

    背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料.本文将更加详细的介 ...

  3. 背景建模技术(四):视频分析(VideoAnalysis)模块

    视频分析模块主要包含两个函数,一个是VideoAnalysis::setup(....),其主要功能就是确定测试的视频是视频文件或摄像头输入亦或是采用命令行参数:第二个函数是VideoAnalysis ...

  4. 背景建模技术(六):帧处理(FrameProcessor)模块

    前面几篇文章简单介绍了BgsLibrary的入口函数.视频分析和视频捕获模块,本文将简单介绍帧处理模块,即对每一帧进行处理的函数,也就是真正调用背景建模算法的接口处. 下面贴出源码供大家分析: #in ...

  5. 背景建模技术(七):预处理(PreProcessor)模块

    预处理(PreProcessor)模块是BgsLibrary中一个必选的模块,是真正进入背景建模算法的“预处理”过程,其主要功能包括‘去模糊’.‘获得灰度图’.'应用Canny算子‘等可选模块. 下面 ...

  6. 浅析软件工程中的UML建模技术

    一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...

  7. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码

    iOS精选源码 以tableview的section为整体添加阴影效果/ta'b'le'vi'e'w顶部悬浮.... 一个可以轻松应用自定义过滤器的视频捕获框架. 基于UITableView的组件,旨 ...

  8. [MOC062066]背景建模资料收集整理

    一.相关博客 背景建模相关资料收集,各个链接都已给出. 资料,不可能非常完整,以后不定期更新. -----------------切割线----------------- 这个哥们总结的非常好啊,看完 ...

  9. OpenCV ——背景建模之CodeBook(1)

    1,CodeBook算法流程介绍 CodeBook算法的基本思想是得到每个像素的时间序列模型.这种模型能很好地处理时间起伏,缺点是需要消耗大量的内存.CodeBook算法为当前图像的每一个像素建立一个 ...

随机推荐

  1. JAVA基础学习之路(八)[1]String类的基本特点

    String类的两种定义方式: 直接赋值 通过构造方法赋值 //直接赋值 public class test2 { public static void main(String args[]) { S ...

  2. 油田 (Oil Deposits UVA - 572)

    题目描述: 原题:https://vjudge.net/problem/UVA-572 题目思路: 1.图的DFS遍历 2.二重循环找到相邻的八个格子 AC代码: #include <iostr ...

  3. 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588

    题目描述:算法竞赛入门经典习题3-11 题目思路:1.两长条移动匹配 2.上下调换,取小者 #include <stdio.h> #include <string.h> int ...

  4. 【模板】DFS

    int dx[] = { 0,1,0,-1 }; int dy[] = { 1,0,-1,0 }; void dfs()//参数用来表示状态 { if (到达终点状态) { ...//根据题意来添加 ...

  5. 网络安全部门的漏洞扫描让你头痛不已么——PHP环境选它就可以了

    最近网络安全要求是越来越严,原来PHP编写的程序在XAMPP或者其他环境下总会被某款软件扫出漏洞,进而上级部门就停止了我们服务器的外网出口,然而自从发现了一款安全环境神器UPUPW后,这样的问题就再也 ...

  6. Hadoop源码解析 1 --- Hadoop工程包架构解析

    1 Hadoop中各工程包依赖简述     Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施.     GoogleCluster: http:// ...

  7. Alpha 冲刺报告(3/10)

    Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:开始编写角色的移动脚本 明日计划:继续学习并进行脚本编写 剩余任务:物品背包交互代码 困难:如何把各个模块的脚本整合起来 --------- ...

  8. LintCode-67.二叉树的中序遍历

    二叉树的中序遍历 给出一棵二叉树,返回其中序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [1,3,2]. 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 code /** ...

  9. <Effective C++>读书摘要--Inheritance and Object-Oriented Design<一>

    1.Furthermore, I explain what the different features in C++ really mean — what you are really expres ...

  10. python实现post请求

    今天无论如何都要留下一些什么东西... 可以说今天学到一个新的一个东西,也需要分享出来,给更多的人去使用. 今天爬取的数据里面是客户端向服务器端发送加密过的token和一些页码之类的一个数据.(我主要 ...