在做差分试验中,发现对于运动快的手臂效果好,而对于很少运动的身体来讲效果不好,无意中摆动摄像头时,发现它可以获得差分后的轮廓,进一步来讲,如果假设摄像头不动,而图像出现抖动的情况,即整个图像向上向左平移一个单位象素,这样在差分中也可以得到轮廓,所以特地在OPENCV5上实现了这个算法。试验的效果还是不错的。
它的好处是一种新颖,简单,计算量小的方法,因为它不需要计算任何梯度,如果采用一些canny,sobel算子,会慢很多,它的缺点是引入了其他物体的干扰。
实际上更大的意义是在一个静态场景中,需要对那些静止的物体进行分割时,不妨采用这种方法,很容易获得轮廓。
算法如下:
//使用帧间差分方法得到轮廓
int HumanMotion::getContour(IplImage *grey, IplImage *pre_grey)
{
CvMat mat;
CvMat *temp = cvGetMat(pre_grey , &mat,0 ,2);
int shift_x = 1;
int shift_y = 1;
for(int x=0;x<mat.rows-shift_x;x++)
{
for(int y=0;y<mat.step-shift_x;y++)
{
int value =mat.step*x + y;
int value2 =mat.step*(x+shift_x) + y + shift_y;
mat.data.ptr[value]=mat.data.ptr[value2];
}
}
cvAbsDiff( grey,pre_grey,abs_image );
cvThreshold( abs_image, abs_image, 20, 255, CV_THRESH_BINARY );
return 0;
}