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