背景建模技术(五):视频捕获(VideoCapture)模块
本次对“视频捕获(VideoCapture)模块”做出分析,给出源代码和对应的程序流程框架。
视频捕获模块的主要功能是设置视频或相机参数,并读取设置配置参数,最后进入帧处理模块的process进程,该模块的源码如下,请重点关注start()函数:
- #include "VideoCapture.h"
- namespace bgslibrary
- {
- namespace VC_ROI
- {
- IplImage* img_input1 = 0;
- IplImage* img_input2 = 0;
- int roi_x0 = 0;
- int roi_y0 = 0;
- int roi_x1 = 0;
- int roi_y1 = 0;
- int numOfRec = 0;
- int startDraw = 0;
- bool roi_defined = false;
- bool use_roi = true;
- bool disable_event = false;
- void reset(void)
- {
- disable_event = false;
- startDraw = false;
- }
- void VideoCapture_on_mouse(int evt, int x, int y, int flag, void* param)
- {
- if (use_roi == false || disable_event == true)
- return;
- if (evt == CV_EVENT_LBUTTONDOWN)
- {
- if (!startDraw)
- {
- roi_x0 = x;
- roi_y0 = y;
- startDraw = 1;
- }
- else
- {
- roi_x1 = x;
- roi_y1 = y;
- startDraw = 0;
- roi_defined = true;
- disable_event = true;
- }
- }
- if (evt == CV_EVENT_MOUSEMOVE && startDraw)
- {
- //redraw ROI selection
- img_input2 = cvCloneImage(img_input1);
- cvRectangle(img_input2, cvPoint(roi_x0, roi_y0), cvPoint(x, y), CV_RGB(255, 0, 0), 1);
- cvShowImage("Input", img_input2);
- cvReleaseImage(&img_input2);
- //startDraw = false;
- //disable_event = true;
- }
- }
- }
- VideoCapture::VideoCapture() : key(0), start_time(0), delta_time(0), freq(0), fps(0), frameNumber(0), stopAt(0),
- useCamera(false), useVideo(false), input_resize_percent(100), showOutput(true), enableFlip(false)
- {
- std::cout << "VideoCapture()" << std::endl;
- }
- VideoCapture::~VideoCapture()
- {
- std::cout << "~VideoCapture()" << std::endl;
- }
- void VideoCapture::setFrameProcessor(IFrameProcessor* frameProcessorPtr)
- {
- frameProcessor = frameProcessorPtr;
- }
- void VideoCapture::setCamera(int index)
- {
- useCamera = true;
- cameraIndex = index;
- useVideo = false;
- }
- void VideoCapture::setUpCamera()
- {
- std::cout << "Camera index:" << cameraIndex << std::endl;
- capture = cvCaptureFromCAM(cameraIndex);
- if (!capture)
- std::cerr << "Cannot open initialize webcam!\n" << std::endl;
- }
- void VideoCapture::setVideo(std::string filename)
- {
- useVideo = true;
- videoFileName = filename;
- useCamera = false;
- }
- void VideoCapture::setUpVideo()
- {
- capture = cvCaptureFromFile(videoFileName.c_str());
- if (!capture)
- std::cerr << "Cannot open video file " << videoFileName << std::endl;
- }
- void VideoCapture::start()
- {
- ///////////////loadConfig
- loadConfig();
- ///////////////setUpCamera
- if (useCamera) setUpCamera();
- ///////////////setUpVideo
- if (useVideo) setUpVideo();
- if (!capture) std::cerr << "Capture error..." << std::endl;
- int input_fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
- std::cout << "input->fps:" << input_fps << std::endl;
- IplImage* frame1 = cvQueryFrame(capture);
- frame = cvCreateImage(cvSize((int)((frame1->width*input_resize_percent) / 100), (int)((frame1->height*input_resize_percent) / 100)), frame1->depth, frame1->nChannels);
- //cvCreateImage(cvSize(frame1->width/input_resize_factor, frame1->height/input_resize_factor), frame1->depth, frame1->nChannels);
- std::cout << "input->resize_percent:" << input_resize_percent << std::endl;
- std::cout << "input->width:" << frame->width << std::endl;
- std::cout << "input->height:" << frame->height << std::endl;
- double loopDelay = 33.333;
- if (input_fps > 0)
- loopDelay = (1. / input_fps)*1000.;
- std::cout << "loopDelay:" << loopDelay << std::endl;
- std::cout << "Press 'ESC' to stop..." << std::endl;
- bool firstTime = true;
- do
- {
- frameNumber++;
- frame1 = cvQueryFrame(capture);
- if (!frame1) break;
- cvResize(frame1, frame);
- if (enableFlip)
- cvFlip(frame, frame, 0);
- if (VC_ROI::use_roi == true && VC_ROI::roi_defined == false && firstTime == true)
- {
- VC_ROI::reset();
- do
- {
- cv::Mat img_input(frame);
- if (showOutput)
- {
- cv::imshow("Input", img_input);
- std::cout << "Set ROI (press ESC to skip)" << std::endl;
- VC_ROI::img_input1 = new IplImage(img_input);
- cvSetMouseCallback("Input", VC_ROI::VideoCapture_on_mouse, NULL);
- key = cvWaitKey(0);
- delete VC_ROI::img_input1;
- }
- else
- key = KEY_ESC;
- if (key == KEY_ESC)
- {
- std::cout << "ROI disabled" << std::endl;
- VC_ROI::reset();
- VC_ROI::use_roi = false;
- break;
- }
- if (VC_ROI::roi_defined)
- {
- std::cout << "ROI defined (" << VC_ROI::roi_x0 << "," << VC_ROI::roi_y0 << "," << VC_ROI::roi_x1 << "," << VC_ROI::roi_y1 << ")" << std::endl;
- break;
- }
- else
- std::cout << "ROI undefined" << std::endl;
- } while (1);
- }
- if (VC_ROI::use_roi == true && VC_ROI::roi_defined == true)
- {
- 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);
- cvSetImageROI(frame, rect);
- }
- cv::Mat img_input(frame);
- if (showOutput)
- cv::imshow("Input", img_input);
- ///////////////saveConfig
- if (firstTime)
- saveConfig();
- start_time = cv::getTickCount();
- ///////////////frameProcessor,start "Background Modeling"
- frameProcessor->process(img_input);
- int64 delta_time = cv::getTickCount() - start_time;
- freq = cv::getTickFrequency();
- fps = freq / delta_time;
- //std::cout << "FPS: " << fps << std::endl;
- cvResetImageROI(frame);
- key = cvWaitKey(loopDelay);
- //std::cout << "key: " << key << std::endl;
- if (key == KEY_SPACE)
- key = cvWaitKey(0);
- if (key == KEY_ESC)
- break;
- if (stopAt > 0 && stopAt == frameNumber)
- key = cvWaitKey(0);
- firstTime = false;
- } while (1);
- cvReleaseCapture(&capture);
- }
- void VideoCapture::saveConfig()
- {
- CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_WRITE);
- cvWriteInt(fs, "stopAt", stopAt);
- cvWriteInt(fs, "input_resize_percent", input_resize_percent);
- cvWriteInt(fs, "enableFlip", enableFlip);
- cvWriteInt(fs, "use_roi", VC_ROI::use_roi);
- cvWriteInt(fs, "roi_defined", VC_ROI::roi_defined);
- cvWriteInt(fs, "roi_x0", VC_ROI::roi_x0);
- cvWriteInt(fs, "roi_y0", VC_ROI::roi_y0);
- cvWriteInt(fs, "roi_x1", VC_ROI::roi_x1);
- cvWriteInt(fs, "roi_y1", VC_ROI::roi_y1);
- cvWriteInt(fs, "showOutput", showOutput);
- cvReleaseFileStorage(&fs);
- }
- void VideoCapture::loadConfig()
- {
- CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_READ);
- stopAt = cvReadIntByName(fs, 0, "stopAt", 0);
- input_resize_percent = cvReadIntByName(fs, 0, "input_resize_percent", 100);
- enableFlip = cvReadIntByName(fs, 0, "enableFlip", false);
- VC_ROI::use_roi = cvReadIntByName(fs, 0, "use_roi", true);
- VC_ROI::roi_defined = cvReadIntByName(fs, 0, "roi_defined", false);
- VC_ROI::roi_x0 = cvReadIntByName(fs, 0, "roi_x0", 0);
- VC_ROI::roi_y0 = cvReadIntByName(fs, 0, "roi_y0", 0);
- VC_ROI::roi_x1 = cvReadIntByName(fs, 0, "roi_x1", 0);
- VC_ROI::roi_y1 = cvReadIntByName(fs, 0, "roi_y1", 0);
- showOutput = cvReadIntByName(fs, 0, "showOutput", true);
- cvReleaseFileStorage(&fs);
- }
- }
对应的流程框架如下图:
背景建模技术(五):视频捕获(VideoCapture)模块的更多相关文章
- 背景建模技术(二):BgsLibrary的框架、背景建模的37种算法性能分析、背景建模技术的挑战
背景建模技术(二):BgsLibrary的框架.背景建模的37种算法性能分析.背景建模技术的挑战 1.基于MFC的BgsLibrary软件下载 下载地址:http://download.csdn.ne ...
- 背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能
背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料.本文将更加详细的介 ...
- 背景建模技术(四):视频分析(VideoAnalysis)模块
视频分析模块主要包含两个函数,一个是VideoAnalysis::setup(....),其主要功能就是确定测试的视频是视频文件或摄像头输入亦或是采用命令行参数:第二个函数是VideoAnalysis ...
- 背景建模技术(六):帧处理(FrameProcessor)模块
前面几篇文章简单介绍了BgsLibrary的入口函数.视频分析和视频捕获模块,本文将简单介绍帧处理模块,即对每一帧进行处理的函数,也就是真正调用背景建模算法的接口处. 下面贴出源码供大家分析: #in ...
- 背景建模技术(七):预处理(PreProcessor)模块
预处理(PreProcessor)模块是BgsLibrary中一个必选的模块,是真正进入背景建模算法的“预处理”过程,其主要功能包括‘去模糊’.‘获得灰度图’.'应用Canny算子‘等可选模块. 下面 ...
- 浅析软件工程中的UML建模技术
一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...
- iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码
iOS精选源码 以tableview的section为整体添加阴影效果/ta'b'le'vi'e'w顶部悬浮.... 一个可以轻松应用自定义过滤器的视频捕获框架. 基于UITableView的组件,旨 ...
- [MOC062066]背景建模资料收集整理
一.相关博客 背景建模相关资料收集,各个链接都已给出. 资料,不可能非常完整,以后不定期更新. -----------------切割线----------------- 这个哥们总结的非常好啊,看完 ...
- OpenCV ——背景建模之CodeBook(1)
1,CodeBook算法流程介绍 CodeBook算法的基本思想是得到每个像素的时间序列模型.这种模型能很好地处理时间起伏,缺点是需要消耗大量的内存.CodeBook算法为当前图像的每一个像素建立一个 ...
随机推荐
- python编程os、os.path 模块中关于文件、目录常用的函数使用方法
os模块中关于文件/目录常用的函数使用方法 函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名( ...
- Unity编辑器 - 资源批处理工具基类
Unity编辑器 - 资源批处理工具基类 经常要对资源进行批处理,很多时候都是一次性的需求,于是弄个通用脚本. 工具是个弹出面板,处理过程有进度条,如下: 如图,子类只需要重写几个方法: using ...
- springMVC使用拦截器检查用户登录
参考文章 编写拦截器类 package cultivate_web.interceptor; import javax.servlet.http.HttpServletRequest; import ...
- c# 生成的没用文件
1.pdb 2.vhost 3.application 4.含有更新功能(更新文件夹)
- 接口文档管理工具-Postman、Swagger、RAP(转载)
接口文档管理工具-Postman.Swagger.RAP 转自:http://www.51testing.com/html/10/n-3715910.html 在项目开发测试中,接口文档是贯穿始终的. ...
- Ubuntu下FileZilla的安装
FileZilla是一个免费而且开源的FTP客户端软件,共有两种版本:客户端版本.服务器版本.FileZilla有条理的界面和管理多站点的简化方式使得FileZilla Client成为一个方便高效的 ...
- lintcode-185-矩阵的之字型遍历
185-矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9 ...
- 3dContactPointAnnotationTool开发日志(十三)
为了使生成的项目能够显示报错信息我又勾选了下面这几个选项: 然后生成的项目运行时可以显示错误信息了,貌似是shader是空的. 之前的代码是这么写的,调用了Shader.Find(),貌似 ...
- Java SE1.6中的Synchronized
1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本 ...
- 【python】 可迭代对象、迭代器、生成器
可迭代对象 iterable 可直接作用于for循环的对象统称为可迭代对象. 有 list. dict.tuple.set.str等数据类型,还有 generator(包括生成器和带yield的gen ...