在OpenCv中提供了兩種實現目標跟蹤的關鍵算法,LK算法和HS算法,也就是通常所說的稀疏光流和稠密光流。
角點,其實也就是1幅圖象中,容易被跟蹤的特點點,通常來講,這個點在兩個正交方向上都有明顯的倒數,該點在圖象中我們認為是唯一無2的。
從直觀上講,角點是1類有足夠信息并且能夠從當前幀和下1幀都能提取出來的點。
關于角點的定義,是由Harris提出的,其基礎是圖象灰度強度的2階導數矩陣 。該定義的角點位于圖象2階導數的自相干矩陣中有兩個最大特點值的地方,這本質上表示以此點為中心周圍存在最少兩個不同方向的邊沿。實際上1個角點也就是由兩個不同方向的邊沿相交而成的。而且,采取2階導數是由于它對圖象的均勻梯度不產生相應(梯度是1階導數而來,如果1階導數為均勻的,則2階導數為0)。
void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image,
CvPoint2D32f* corners, int* corner_count,
double quality_level, double min_distance,
const CvArr* mask=NULL );
在這個函數中,輸入圖象image必須是8位或是32位,也就是IPL_DEPTH_8U 或是 IPL_DEPTH_32F 單通道圖象。
第2和第3個參數是大小與輸入圖象相同的32位單通道圖象。
參數 temp_image 和 eig_image 在計算進程中被當作臨時變量使用,計算結束后eig_image中的內容是有效的。特別的,每一個函數包括了輸入圖象中對應的最小特點值。
corners 是函數的輸出,為檢測到 32位(CvPoint2D32f)的角點數組,在調用 cvGoodFeaturesToTrack 函數之前要為該數組分配內存空間。
corner_count 表示可以返回的最大角點數目,函數調用結束后,其返回實際檢測到的角點數目。
quality_level 表示1點唄認為是角點的可接受的最小特點值,實際用于過濾角點的最小特點值是quality_level與圖象匯總最大特點值的乘積,所以quality_level的值不應當超過1,通常取值為(0.10或是0.01)
檢測完以后還要進1步剔除掉1些距離較近的角點,min_distance 保證返回的角點之間的距離不小于min_distance個像素
mask是可選參數,是1幅像素值為boolean類型的圖象,用于指定輸入圖象中參與角點計算的像素點,若mask的值為NULL,值表示選擇全部圖象
block_size 是計算導數的自相干矩陣是指定的領域,采取小窗口計算的結果比單點(也就是block_size 為1)計算的結果要好
函數cvGoodFeaturesToTrack() 的輸出結果為需找到的角點的位置數組。