帧差法是运动目标检测中一个非常重要的方法,它的原理十分简单。思路是设置一个阈值,然后将视频中相邻的两帧相减,结果中大于阈值的地方就是运动区域。
帧差法的优势是运算量小,实时性好,可以获得不错的轮廓。缺点是不够精细,阈值过高容易漏检,过低则无法做到noise tolerance. 另外如果发生光照突变等情况,帧差法会把整副图像当成运动区域。
以下是实现的代码。
#include "highgui.h"
#include "cv.h"
void main()
{
CvCapture* capture;
capture=cvCaptureFromFile("test.avi");//获取视频
cvNamedWindow("camera",CV_WINDOW_AUTOSIZE);
cvNamedWindow("moving area",CV_WINDOW_AUTOSIZE);
IplImage* tempFrame;//用于遍历capture中的帧,通道数为3,需要转化为单通道才可以处理
IplImage* currentFrame;//当前帧
IplImage* previousFrame;//上一帧
/*
CvMat结构,本质上和IplImage差不多,但是因为IplImage里的数据只能用uchar的形式存放,当需要这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;
然而CvMat里却可以存放任意通道数、任意格式的数据
*/
CvMat* tempFrameMat;
CvMat* currentFrameMat; //IplImage要转成CvMat进行处理
CvMat* previousFrameMat;
int frameNum=0;
while(tempFrame=c