2011-02-04 24 views
2


跟蹤斑點我有減去
攝像機的輸入的背景和提取乾淨的斑點的EMGU(OpenCV的包裝器)程序。
現在我需要一些能夠跟蹤這些斑點併爲它們分配ID的東西。
任何建議/圖書館?


感謝,
SW與OpenCV的

回答

3

好,如果你有,你想跟蹤你可以嘗試Particle Filter多個對象。

粒子濾波器基本上是在圖像上「處理」粒子,每個粒子都有一定的權重。在每個時間步驟中,通過將這些權重與當時對象的實際測量值進行比較來更新這些權重。在下一個時間步驟中,高重量的粒子將在其方向上處理更多的粒子(在方向上添加一個輕微的隨機部分)。 經過幾個時間步後,粒子將圍繞物體測量位置分組。這就是爲什麼這種方法有時也被稱爲優勝劣汰的方法的生存...

所以這整個事情建立一個圓:

Initialization ---->  Sampling 
         >    \ 
        /    > 
       Updating   Prediction 
         <    /
         \    < 
          Association 

因此,這提供了在給定場景跟蹤對象的好方法。進行多對象跟蹤的一種方法是在所有對象上使用這一個粒子濾波器,這將起作用,但是當您嘗試爲對象提供ID時以及當對象相互交叉時會有缺點,因爲粒子云可能會丟失一個對象並且遵循另一個對象。

爲了解決這個問題,你可以嘗試使用混合粒子濾波器(Vermaak et al。[2003])。這個通過一個單獨的粒子過濾器跟蹤每個對象(當然有更少的必要粒子)。

上好的紙可以在這裏找到:http://www.springerlink.com/content/qn4704415gx65315/ (我還可以與其他一些東西提供給您的是,如果你喜歡,如果你會講德語我甚至可以給你介紹我在大學舉辦有關前一陣子)

編輯:

忘了提:既然你嘗試做這在OpenCV中:據我知道有凝結算法的實現(如果你使用一個第一個粒子濾波器在整個圖像上)是OpenCV發行版的一部分,雖然它可能已經過時了一點。 OpenCV中可能有更新的粒子過濾器,但如果不是,你會在Google上找到很多結果,如果你尋找OpenCV和粒子過濾器

希望有幫助...如果沒有,請繼續詢問.. 。

2

你可以簡單地適應的EMGU CV例子,讓 VideoSurveillance命名空間的用途之一:

public partial class VideoSurveilance : Form 
    { 
     private static MCvFont _font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0); 
     private static Capture _cameraCapture; 
     private static BlobTrackerAuto<Bgr> _tracker; 
     private static IBGFGDetector<Bgr> _detector; 

     public VideoSurveilance() 
     { 
     InitializeComponent(); 
     Run(); 
     } 

     void Run() 
     { 
     try 
     { 
      _cameraCapture = new Capture(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message); 
      return; 
     } 

     _detector = new FGDetector<Bgr>(FORGROUND_DETECTOR_TYPE.FGD); 

     _tracker = new BlobTrackerAuto<Bgr>(); 

     Application.Idle += ProcessFrame; 
     } 

     void ProcessFrame(object sender, EventArgs e) 
     { 
     Image<Bgr, Byte> frame = _cameraCapture.QueryFrame(); 
     frame._SmoothGaussian(3); //filter out noises 

     #region use the background code book model to find the forground mask 
     _detector.Update(frame); 
     Image<Gray, Byte> forgroundMask = _detector.ForgroundMask; 
     #endregion 

     _tracker.Process(frame, forgroundMask); 

     foreach (MCvBlob blob in _tracker) 
     { 
      frame.Draw(Rectangle.Round(blob), new Bgr(255.0, 255.0, 255.0), 2); 
      frame.Draw(blob.ID.ToString(), ref _font, Point.Round(blob.Center), new Bgr(255.0, 255.0, 255.0)); 
     } 

     imageBox1.Image = frame; 
     imageBox2.Image = forgroundMask; 

     } 
    } 
+0

這幾個問題用的OpenCV的BlobTrackerAuto。它只適用於BGR圖像,非常慢,並且沒有辦法只用於跟蹤斑點(沒有Forground-extraction部分)。 – 2011-02-05 18:48:57