资源简介

OpenCV2.4.9的基于背景差分法的视频目标运动侦测的代码,相应位置有具体的注释,具体分析见博客http://blog.csdn.net/primetong/article/details/79609993

资源截图

代码片段和文件信息

//解决VS2013中fopen替代为fopen_s的问题
//最普通的解决方法,就是使用fopen_s替代,这是fopen_s()函数的用法
//fopen_s(_Outptr_result_maybenull_ FILE ** _File _In_z_ const char * _Filename _In_z_ const char * _Mode);
//这是fopen()函数:
//fopen(_In_z_ const char * _Filename _In_z_ const char * _Mode);
//但fopen_s参数要比fopen多一个,并且返回的类型为:errno_t __cdecl,但fopen()返回的类型为:FILE * __cdecl
//因此,fopen_s函数可能并不适合自己的程序,解决方法有一比较好的方法:
//更改预处理定义:
//项目->属性->配置属性->C / C++->预处理器->预处理器定义,增加_CRT_SECURE_NO_DEPRECATE
//这样就可以解决vs2013报错的问题了。

//1、关于运动目标检测的方法总结
//查阅了相关的文献,目前能够实现运动物体检测的方法主要有以下几种:
//1)背景差分法:能完整快速地分割出运动图像。其不足之处是易受光线变化影响,背景的更新是关键。不适用于摄像头运动的情况;
//2)光流法:能检测独立运动的图像,可用于摄像头运动的情况,但是计算复杂耗时,较难实现实时监测;
//3)帧差法:受光线变化影响较小,简单快速,但不能分割出完整的运动对象,需进一步运用目标分割算法。
//   还有一些改进的算法,主要致力于减少光照影响和检测慢速物体变化。以上是大多数文献中对这三种方法的评价,
//   由于是初次接触,而且项目的需求是静止相机,因此采用最简单的方法:背景差分法。
//2、背景差分法实现步骤
//可将背景差分法的实现步骤总结如下:
//1)进行图像的预处理:主要包括对图像进行灰度化以及滤波。
//   灰度化的方法及其C语言实现可参考《Canny边缘检测算法原理及其VC实现详解(二)》一文;
//   关于图像滤波,通常可采用的方法有中值滤波、均值滤波以及高斯滤波等。
//   关于高斯滤波的实现详见《高斯图像滤波原理及其编程离散化实现方法》一文。
//2)背景建模:这是背景差法较为重要的第一步。
//   目前大多的思路都是根据前N帧图像的灰度值进行区间统计从而得到一个具有统计意义的初始背景。
//   在第一次的实现过程中,采用第一幅图片作为背景图,这样比较简单。
//3)前景提取:将当前最新的图像与背景做差,即可求得背景差图,然后根据一定的方法对改图进行二值化,
//   最终获得运动前景区域,即实现图像分割。

//所研究的运动检测和背景更新方法实现的步骤如下:
//(1)开辟静态内存,对图像进行初始化准备采集;
//(2)采集图像,定义参数k,作为图像序列计数。采集第1幅图像时,则根据第一帧的大小信息进行矩阵、图像的初始化,
//并且将第一帧图像进行灰度化处理,并转化为矩阵,作为背景图像及矩阵;如果k不等于1则把当前帧进行灰度化处理,
//并转化为矩阵,作为当前帧的图像及矩阵。用当前帧的图像矩阵和背景帧的图像矩阵做差算出前景图矩阵并对其进行
//二值化以便计算它与背景帧差别较大的像素个数,也就是二值化后零的个数。
//当第一帧的异物大于1W个像数点则需要将当前帧存储为第一帧,并且将系统的状态转为1——采集第二帧;
//第一帧和第二帧的异物都大于1W个像数点时,将当前帧存储为第二帧,通过判断第一帧和第二帧的差值来确定两帧是否连续,
//若连续则将系统状态转为2——采集第三帧,若不连续则报警,并把系统状态转为0——采集背景帧;
//当第一帧和第二帧的异物都大于1W个像数点 而第三帧没有时则报警;
//若连续3帧的异物都大于1W个像数点时,将当前帧存储为第三帧,通过判断第二帧和第三帧的差值来确定两帧是否连续,
//若连续则将更新背景,若不连续则报警。然后把系统状态转为0——采集背景帧。
//注意其中有一个0-1-2-0....的状态机。
//cvCopy的原型是:
//void cvCopy(const CvArr* src CvArr* dst const CvArr* mask = NULL);
//在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。cvCopy会把src中的数据复制到dst的内存中。
//
//cvCloneImage的原型是:
//IplImage* cvCloneImage(const IplImage* image);
//在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好image里面的数据,然后把这段内存中的数据返回给你。
//clone是把所有的都复制过来,也就是说不论你是否设置Roi Coi等影响copy的参数,clone都会原封不动的克隆过来。
//copy就不一样,只会复制ROI区域等。

#include 
#include 
#include 
#include 
#include 

////调用以下函数可以对运动目标寻找轮廓并绘制矩形框,但是效果不佳暂且就不找问题所在了
//CvMemStorage *stor;
//CvSeq *cont;
//void DrawRec(IplImage* pImgframe IplImage* pImgProcessed int MaxArea);

//main(int argc char *argv[])中的两个参数 argc表示参数个数,*argv则是具体的参数.
//默认情况下,project本身是作为第一个参数的(比如,我的应用输出是test.exe,则argv[0]对应的值为test.exe的绝对路径 
//- D:\program files\vs2012\vctest\debug\test.exe),即默认情况下argc的值为1(该值无需手动改变) 
//如果需设定其他参数,可以通过如下配置:
//<1>选择PROJECT—>Properties—>Configuration Properties—>Debugging—>Command Arguments
//<2>在Command Arguments中添加参数,假设 : 要设定argv[1] = ”23” argv[2] = ”Hello” 
//那么输入值23  Hello即可(两个值之间空格隔开要传空格就包括在“ “中)然后保存即可。运行之后可发现参数值已经改变
//中文版:菜单[项目]->属性页->配置属性->调试,在[命令行参数]里填上即可。不同参数之前用空格隔开。

int main( int arg

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      66560  2018-03-19 15:06  VideoDetection\Debug\VideoDetection.exe

     文件     588308  2018-03-19 15:06  VideoDetection\Debug\VideoDetection.ilk

     文件    1928192  2018-03-19 15:06  VideoDetection\Debug\VideoDetection.pdb

     文件     209885  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\main.obj

     文件     650240  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\vc120.idb

     文件    1249280  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\vc120.pdb

     文件       1884  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.log

     文件        744  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\cl.command.1.tlog

     文件      17906  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\CL.read.1.tlog

     文件        556  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\CL.write.1.tlog

     文件       2064  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\link.command.1.tlog

     文件       4956  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\link.read.1.tlog

     文件        534  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\link.write.1.tlog

     文件        172  2018-03-19 15:06  VideoDetection\VideoDetection\Debug\VideoDetection.tlog\VideoDetection.lastbuildstate

     文件      12636  2017-12-25 19:41  VideoDetection\VideoDetection\main.cpp

     文件    2498886  2017-12-24 23:31  VideoDetection\VideoDetection\traffic.flv

     文件       4116  2017-12-25 11:58  VideoDetection\VideoDetection\VideoDetection.vcxproj

     文件        945  2017-12-25 11:53  VideoDetection\VideoDetection\VideoDetection.vcxproj.filters

     文件        380  2018-03-19 15:14  VideoDetection\VideoDetection\VideoDetection.vcxproj.user

     文件   15335424  2018-03-19 15:52  VideoDetection\VideoDetection.sdf

     文件        988  2017-12-25 11:51  VideoDetection\VideoDetection.sln

    ..A..H.     24576  2018-03-19 15:52  VideoDetection\VideoDetection.v12.suo

     目录          0  2018-03-19 15:14  VideoDetection\VideoDetection\Debug\VideoDetection.tlog

     目录          0  2018-03-19 15:14  VideoDetection\VideoDetection\Debug

     目录          0  2018-03-19 15:14  VideoDetection\Debug

     目录          0  2018-03-19 15:14  VideoDetection\VideoDetection

     目录          0  2018-03-19 15:52  VideoDetection

----------- ---------  ---------- -----  ----

             22599232                    27



............此处省略0个文件信息

评论

共有 条评论