因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新的方法和思路。个人了解的大概概括为以下一些:
帧差、背景减除(GMM、CodeBook、 SOBS、 SACON、 VIBE、 W4、多帧平均……)、光流(稀疏光流、稠密光流)、运动竞争(Motion Competition)、运动模版(运动历史图像)、时间熵……等等。如果加上他们的改进版,那就是很大的一个家族了。
对于上一些方法的一点简单的对比分析可以参考下:http://www.cnblogs.com/ronny/archive/2012/04/12/2444053.html
至于哪个最好,看使用环境吧,各有千秋,有一些适用的情况更多,有一些在某些情况下表现更好。这些都需要针对自己的使用情况作测试确定的。呵呵。
推荐一个牛逼的库:http://code.google.com/p/bgslibrary/里面包含了各种背景减除的方法,可以让自己少做很多力气活。
还有王先荣博客上存在不少的分析:http://www.cnblogs.com/xrwang/archive/2010/02/21/ForegroundDetection.html
下面的博客上转载王先荣的上面几篇,然后加上自己分析了两篇:http://blog.csdn.NET/stellar0
/**************帧差法************/
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
VideoCapture capture("test.avi");//获取视频
if (!capture.isOpened())
return -1;
double rate = capture.get(CV_CAP_PROP_FPS);//获取视频帧率
int delay = 1000 / rate;
Mat framepro, frame, dframe;
bool flag = false;
namedWindow("image");
namedWindow("test");
while (capture.read(frame))
{
if (false == flag)
{
framepro = frame.clone();//将第一帧图像拷贝给framePro
flag = true;
}
else
{
absdiff(frame, framepro, dframe);//帧间差分计算两幅图像各个通道的相对应元素的差的绝对值函数 AbsDiff 计算两个数组差的绝对值。
framepro = frame.clone();//将当前帧拷贝给framepro
threshold(dframe, dframe, 40, 255, CV_THRESH_BINARY);//阈值分割
imshow("image", frame);
imshow("test", dframe);
waitKey(delay);
}
}
waitKey();
return 0;
}