CamShift算法----OpenCV實現1 Back Projection

原文http://blog.csdn.net/houdy/archive/2004/11/10/175739.aspx

CamShift算法,即"Continuously Apative Mean-Shift"算法,是一種運動跟蹤算法。它主要通過視頻圖像中運動物體的顏色信息來達到跟蹤的目的。我把這個算法分解成三個部分,便於理解:
1) Back Projection計算
2) Mean Shift算法
3) CamShift算法
在這裏主要討論Back Projection,在隨後的文章中繼續討論後面兩個算法。

Back Projection
計算Back Projection的步驟是這樣的:
1. 計算被跟蹤目標的色彩直方圖。在各種色彩空間中,只有HSI空間(或與HSI類似的色彩空間)中的H分量可以表示顏色信息。所以在具體的計算過程中,首先將其他的色彩空間的值轉化到HSI空間,然後會其中的H分量做1D直方圖計算。
2. 根據獲得的色彩直方圖將原始圖像轉化成色彩概率分佈圖像,這個過程就被稱作"Back Projection"。
在OpenCV中的直方圖函數中,包含Back Projection的函數,函數原型是:
   void cvCalcBackProject(IplImage** img, CvArr** backproject, const CvHistogram* hist);
傳遞給這個函數的參數有三個:
1. IplImage** img:存放原始圖像,輸入。
2. CvArr** backproject:存放Back Projection結果,輸出。
3. CvHistogram* hist:存放直方圖,輸入

下面就給出計算Back Projection的OpenCV代碼。
1.準備一張只包含被跟蹤目標的圖片,將色彩空間轉化到HSI空間,獲得其中的H分量:
  IplImage* target=cvLoadImage("target.bmp",-1);  //裝載圖片
  IplImage* target_hsv=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
  IplImage* target_hue=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
  cvCvtColor(target,target_hsv,CV_BGR2HSV);       //轉化到HSV空間
  cvSplit( target_hsv, target_hue, NULL, NULL, NULL );    //獲得H分量
2.計算H分量的直方圖,即1D直方圖:
  IplImage* h_plane=cvCreateImage( cvGetSize(target_hsv),IPL_DEPTH_8U,1 );
  int hist_size[]={255};          //將H分量的值量化到[0,255]
  float* ranges[]={ {0,360} };    //H分量的取值範圍是[0,360)
  CvHistogram* hist=cvCreateHist(1, hist_size, ranges, 1);
  cvCalcHist(&target_hue, hist, 0, NULL);
在這裏需要考慮H分量的取值範圍的問題,H分量的取值範圍是[0,360),這個取值範圍的值不能用一個byte來表示,爲了能用一個byte表示,需要將H值做適當的量化處理,在這裏我們將H分量的範圍量化到[0,255].
4.計算Back Projection:
  IplImage* rawImage;
  //----------------------------------------------
  //get from video frame,unsigned byte,one channel
  //----------------------------------------------
  IplImage* result=cvCreateImage(cvGetSize(rawImage),IPL_DEPTH_8U,1);
  cvCalcBackProject(&rawImage,result,hist);
5.結果:result即爲我們需要的.

算法分析
用在cvCalcBackProject處理中的模板是目標圖像色調(HUE)的直方圖,而直方圖可以看作是一種概率分佈圖。在處理前,目標圖像中的每一個象素的值描述的在這一點的顏色信息,而處理後,圖像中每一個象素的值就變成了這個顏色信息出現在此處的可能性的一種離散化的度量,出現的可能性大,象素的值就大,反之則小。這樣就爲後面的匹配和跟蹤提供了線索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章