OpenCV中Camshitf算法學習(補充)

結合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學習

相關文章
相關標籤/搜索