1. 導言
這兩天又有個機會又(為什麼要說又呢?)要用到OpenCV中的camshift tracking。簡單記錄一下,算是這篇目標跟蹤學習筆記_1(opencv中meanshift和camshift例子的應用)文章的補充
2. 工作流程
2.1 使用方法
- trackObject為0表示不跟蹤,為1表示繼續跟蹤;滑鼠選擇完(新)跟蹤地區後trackObject為-1, 根據新視窗準備跟蹤的資料(色彩空間轉換,長條圖等)---這些上面的代碼注釋裡都有提到
- 剛讀源碼才發現可以按p暫停後再選跟蹤目標---這個邏輯還挺有用
2.2 涉及的源碼有:
$OPENCV_HOME/samples/cpp/camshiftdemo.cpp
$OPENCV_HOME//modules/video/src/camshift.cpp:總共4個函數
- cv::CamShift
- cv::meanShift
- cvCamShift
- cvMeanShift
2.3 呼叫流程:
cv::CamShift(...)-->cvCamShift(...)-->cvMeanShift(...)
- i) cvCamShift會調整輸入視窗大小。具體是四個矩形邊各自向外擴張TOLERANCE像素。越界的情況會自動處理。TOLERANCE hard coded為10。
- ii)對擴充後的矩形跟蹤地區計算moments。如果零階矩小於DBL_EPSILON,則直接返回-1。
- iii)DBL_EPSILON: 前28位在本機上列印出來是這樣:0.0000000000000002220446049250
注意之前cv::CamShift初始化了一個CvConnectedComp comp 為全0值,並傳入cvCamShift。cvCamShift返回後再用這個comp改變傳入cv::CamShift的最最初始的跟蹤視窗。
所以上面如果返回-1,則初始視窗(camshiftdemo中的trackWindow)會變成0。在下一幀時會抱如下錯誤:
camshift.cpp:81: error: (-5) Input window has non-positive sizes in function cvMeanShift
這也算是一個小bug吧。可以出現這種情況就提示不再跟蹤任何視窗,或在返回-1前把當前跟蹤視窗(其m00為零)賦給_comp,這樣跟蹤視窗應該一直維持在那個小地區,直到選取新的地區---我這麼試了,又出drawing的錯誤,應該是地區太小了,沒法fit elipse。 whatever啦。。。
每一幀的處理中,基本上有三個地方可能改變初始的跟蹤視窗(注意這裡初始視窗是針對每一幀而言,而不是滑鼠選定的最開始的初始視窗)
- cvMeanshift本身最終收斂的結果
- cvCamShift中,cvMeanShift之後視窗擴充,也就是上面的i)
- 屬於CamShift本身的根據二階矩調整跟蹤視窗大小的演算法
3. The End