如果我們進行圖象處理的目的不是用于辨認特點點而是進行稽核丈量,則通常需要更高的精度,而cvGoodFeatureToTrack()只能提供簡單的像素坐標值,但有時候我們會需要實際坐標值而不是證書坐標值,例如,我們想要肯定圖形中1個尖銳的峰值點的位置,但是峰值點的位置1般都不會位于1個像素點的正中心,,這時候候就能夠使用亞像素檢測方法。
亞像素級角點的位置在攝像機標定、跟蹤并重建攝像機的軌跡或重建被跟蹤目標的3維結構時就是1個基本的丈量值。通過cvGoodFeaturesToTrack()函數可以求得角點坐標值,接下來就要討論如何將求得的坐標值精確到亞像素級精度。方法就是向量的點積理論:1個向量和其正交的向量的點積為0,角點我們之前有說過了,就是兩個邊沿的相交,可以滿足這樣的情況。以下圖:
當要求的點P位于1個區域的內部時,點p邊沿是平緩的,它的梯度值為0,此時向量 的與p的梯度點積為0,;
當點p位于區域的邊沿的時候,向量 與區域平行,而p的梯度值則與邊沿垂直,此時向量
的與p的梯度點積為0。
這兩種情況下,向量 與P點的梯度都是正交的。先假定起始角點q在實際亞像素級角點p附近,則我們可以在要求的p點的周圍取到很多p點的梯度和相干向量
令其點積為0,然后就能夠通過求解方程組,方程組的解就是角點q的亞像素精度的位置,也就是精確角點的位置。
代碼以下:
void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,
int count, CvSize win,
CvSize zero_zone,
CvTermCriteria criteria );
image
輸入圖象.
corners
輸入角點的初始坐標,也存儲精確的輸出坐標
count
角點數目
win
搜索窗口的1半尺寸。如果 win=(5,5) 那末使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口
zero_zone
死區的1半尺寸,死區為不對搜索區的中央位置做求和運算的區域。它是用來避免自相干矩陣出現的某些可能的奇特性。當值為 (⑴,⑴) 表示沒有死區。
criteria
求角點的迭代進程的終止條件。即角點位置的肯定,要末迭代數大于某個設定值,或是精確度到達某個設定值。 criteria 可以是最大迭代數目,或是設定的精確度,也能夠是它們的組合。
函數 cvFindCornerSubPix 通過迭代來發現具有子象素精度的角點位置,或如圖所示的放射鞍點(radial saddle points)。
當找到1個q的新位置時,算法會以這個新的角點作為初始點進行迭代知道滿足用戶定義的迭代終止條件。
下一篇 mysql開機自啟動設置