之前在點跟蹤技術中介紹了兩種不同的跟蹤理論。一種是假設每個特徵點在前後兩幀的亮度是不變的,這就是光流法,但是大部分實際跟蹤問題都不能完全滿足這個假設。另一種是承認每個點是可變的,但變化是極小的,而且該點周圍的乙個鄰域的變化都是極小的,於是把點跟蹤變成塊匹配問題。實際上大部分跟蹤方法是不提取特徵點,而直接針對整個物體所在的影象塊的(包含物體的矩形或其他規則形狀),提取整個影象塊的特徵,進行匹配或者其他檢測方法。
塊跟蹤技術中最基礎的方法是meanshift方法。
meanshift的應用方法一般是首先提取物體塊初始的顏色/亮度直方圖,然後根據該直方圖在之後的每一幀影象中尋找最相似的出現,即為物體的位置。
為了避免進行諸如滑動視窗之類的窮舉式搜尋,meanshift採用了一種貪心搜尋法。
meanshift並不是專為影象跟蹤設計的演算法,它是一種概率密度估計演算法。
將影象中所有畫素點為中心的影象塊與目標的相似度用密度函式來表示,目標是從任意位置開始向密度最高的位置移動。根據梯度法的原則,meanshift每次選擇沿梯度反方向移動。這個過程當中每次只需要計算上次起始點周圍乙個範圍內(視窗內)若干取樣點的密度,不需要計算整個影象所有畫素點的密度。
在實際應用中,opencv採用的是一種稱為camshift的變體方法。這種方法很難稱為「改進」,因為他的效果不見得比meanshift好,但是肯定比meanshift快,而且可以自適應的估計物體的形狀大小和方向。
camshift的關鍵是反向投影(backprojection)方法。
backprojection方法的介紹詳見
這種方法只能算是偽直方圖匹配法。舉個比較極端的例子,學習乙個半紅半藍的物體的直方圖,再去計算純紅色塊、純藍色塊和半紅半藍塊,它們的匹配度是相同的。物體的方向和大小是直接根據反向直方圖的零階、一階和二階矩用固定公式算出來的。可見這個方法是多麼不靠譜,不過它的計算速度絕對塊。真是影象處理無堅不破,唯快不破。
附上opencv的camshift使用方法
#include using namespace std;
using namespace cv;
enum status ;
status status = play;
bool showhist = false;
bool selectobject = false;
point origin;
rect selection;
size imgsz;
void onmouse(int evt, int x, int y, int, void*)
switch(evt)
}int main()
namedwindow("disp");
setmousecallback("disp", onmouse, 0);
mat frame, disp, hsv, mask, hue, hist, histimg = mat::zeros(200, 320, cv_8uc3), backproj;
int smin = 30;
int vmin = 10;
int vmax = 256;
int hsize = 16;
float hranges = ;
const float* phranges = hranges;
int iframe = 0;
while (1)
//get initial information
if (iframe == 0)
cvtcolor(frame, hsv, cv_bgr2hsv);
//ignore dark regions
inrange(hsv, scalar(0, smin, vmin), scalar(180, 256, vmax), mask);
//only hue information is used
int ch = ;
hue.create(hsv.size(), hsv.depth());
mixchannels(&hsv, 1, &hue, 1, ch, 1);
if (status != tracking)
if (status == tracking_init)
status = tracking;
} else
/* draw */
if (status == paused || status == play) else if (status == tracking)
if (showhist)
iframe++;
char key = waitkey(30);
if (key == 27)
break;
switch (key)
}}
目標跟蹤的點跟蹤技術 1
目標跟蹤技術按實際跟蹤物件可以分為點跟蹤和塊跟蹤。所謂點跟蹤就是在初始影象幀的目標上找一些具有跟蹤價值的點,用點周圍的一小塊區域的特徵對其進行描述,在後續的影象幀中根據特徵描述尋找這些點移動到的新位置。這裡需要解決三個問題。特徵點選擇 特徵點描述和特徵點匹配。首先談一下特徵點選擇。用於跟蹤的特徵點周...
目標跟蹤的點跟蹤技術 4
獲取特徵點後,sift用方向梯度直方圖描述每個特徵點的特徵。首先計算每個特徵點的梯度幅度和方向 然後計算特徵點周圍16x16範圍的每個點的梯度方向,對其中上下左右每4x4的區域,統計區域內各點的方向梯度直方圖。直方圖把360度角劃分為36個bin,計算前先用高斯平滑削弱邊緣的影響。16x16點的梯度...
目標跟蹤方法 基於輪廓跟蹤
一 理論 該方法的基本思想是使用一組封閉的輪廓曲線來表徵目標,將曲線作為模板,在相鄰幀的邊緣影象中匹配並跟蹤該模板。該方法與基於區域的跟蹤方法相類似,都存在目標模板匹配和目標模板更新兩個環節,但是該方法是在二值化影象中匹配目標的輪廓模板,大大減小了計算量,提高了匹配的速度。主動輪廓模型方法是近些年來...