结合OpenCV中Camshitf算法学习,作一些简单的补充,包括:html
参考opencv中的相关demo,能够截取目标物体的图片,由此预先计算出其色彩投影图,用于实际的目标跟随。算法
1 Mat hsv,mask,hue,hist; 2 cvtColor( cut_image, hsv, CV_BGR2HSV );//cut_image为提早截取的目标图片 3 inRange( hsv, Scalar( MIN( _hmin, _hmax ), MIN( _smin, _smax ), MIN( _vmin, _vmax ) ),Scalar( MAX( _hmin, _hmax ), MAX( _smin, _smax ), MAX( _vmin, _vmax ) ),mask ); 4 5 int ch[] = {0, 0}; 6 hue.create(hsv.size(), hsv.depth()); 7 mixChannels(&hsv, 1, &hue, 1, ch, 1); 8 calcHist( &hue,1,0,mask,hist,1,&hsize,&phranges); 9 normalize(hist, hist, 0, 255, CV_MINMAX);
上述代码计算出了目标物体的色彩投影图 hist,以后利用hist即可以实现目标物体的全自动跟随了post
1 cvtColor( sceneImg,hsv,CV_BGR2HSV); 2 inRange( hsv, Scalar( MIN( _hmin, _hmax ), MIN( _smin, _smax ), MIN( _vmin, _vmax ) ),Scalar( MAX( _hmin, _hmax ), MAX( _smin, _smax ), MAX( _vmin, _vmax ) ),mask ); 3 4 Mat backproj; 5 hue.create(hsv.size(), hsv.depth()); 6 mixChannels(&hsv, 1, &hue, 1, ch, 1); 7 calcBackProject( &hue, 1, 0, hist, backproj, &phranges ); 8 backproj &= mask; 9 trackWindow = Rect( 0, 0, 640, 480 ); 10 trackBox = CamShift(backproj, trackWindow, 11 TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));
camshift能有效解决目标变形和遮挡的问题,对系统资源要求不高,时间复杂度低,在简单背景下可以取得良好的跟踪效果。但当背景较为复杂,或者有许 多与目标颜色类似像素干扰的状况下,会致使跟踪失败。由于它单纯的考虑颜色直方图,忽略了目标的空间分布特性,因此这种状况下需加入对跟踪目标的预测算法。
因为这个缺点,所以能够利用surf算法进行特征点匹配,从而克服camshif因复杂环境形成的影响,不过surf算法的一个缺陷是不能解决目标物体的变形。由此,最好的解决方法即是 camshift+surf 。或者说利用PCL。
2013.10.25学习