Homography 理解本文轉(zhuǎn)自:http://m.blog.csdn.net/blog/xuluhui123/17115073
在計算機視覺中,平面的單應(yīng)性被定義為一個平面到另外一個平面的投影映射撰筷。因此一個二維平面上的點映射到攝像機成像儀上的映射就是平面單應(yīng)性的例子陈惰。如果點Q到成像儀上的點q的映射使用齊次坐標,這種映射可以用矩陣相乘的方式表示毕籽。若有一下定義:
則可以將單應(yīng)性簡單的表示為:
這里引入?yún)?shù)s抬闯,它是任意尺度的比例(目的是使得單應(yīng)性定義到該尺度比例)。通常根據(jù)習慣放在H的外面影钉。
H有兩部分組成:用于定位觀察的物體平面的物理變換和使用攝像機內(nèi)參數(shù)矩陣的投影画髓。
物理變換部分是與觀測到的圖像平面相關(guān)的部分旋轉(zhuǎn)R和部分平移t的影響之和掘剪,表示如下
這里R為33大小的矩陣平委,t表示一個一個3維的列矢量。
攝像機內(nèi)參數(shù)矩陣用M表示夺谁,那么我們重寫單應(yīng)性如下:
我們知道單應(yīng)性研究的是一個平面上到另外一個平面的映射廉赔,那么上述公式中的Q肉微,就可以簡化為平面坐標中的Q',即我們使Z=0蜡塌。即物體平面上的點我們用x,y表示碉纳,相機平面上的點,我們也是用二維點表示馏艾。我們?nèi)サ袅薢方向的坐標劳曹,那么相對于旋轉(zhuǎn)矩陣R,R可以分解為R=[r1 r2 r3]琅摩,那么r3也就不要了铁孵,參考下面的推導:
其中H為:
是一個3×3大小的矩陣.
故最終的單應(yīng)性矩陣可表示如下:
OpenCV就是利用上述公式來計算單應(yīng)性矩陣。它使用同一物體的多個圖像來計算每個視場的旋轉(zhuǎn)和平移房资,同時也計算攝像機的內(nèi)參數(shù)蜕劝。我們知道旋轉(zhuǎn)和平移共6個參數(shù),攝像機內(nèi)參數(shù)為4個參數(shù)轰异。對于每一個視場有6個要求解的新參數(shù)和4個不變的相機內(nèi)參數(shù)岖沛。對于平面物體如棋盤,能夠提供8個方差搭独,即映射一個正方形到四邊形可以用4個(x,y)來描述婴削。那么對于兩個視場,我們就有82=16=2*6+4,即求解所有的參數(shù)牙肝,至少需要兩個視場馆蠕。
為什么正方形到四邊形的四個點的映射可以確定8個方程呢,結(jié)果是顯然的惊奇,我們假設(shè)物體平面上的正方形的一個頂點坐標為(u,v)互躬,成像儀與該點對應(yīng)的點坐標為(x,y),我們假設(shè)它們之間的關(guān)系如下:
u=f(x,y);
v=g(x,y);
顯然颂郎,我們把四點的對應(yīng)坐標帶入到上述公式可以得到8個方程吼渡。
這里我們會想物體平面上正方形的四個頂點坐標如何確定,其實我們就可以理解為角點的個數(shù)乓序,對于尺度的話寺酪,我們有s進行控制。對于圖像平面上的角點的位置替劈,我們可以可以通過尋找角點來定位他們的位置寄雀。其實對于具體的操作,由于還沒細讀代碼和相關(guān)原理陨献,在這里只能大體猜測一下盒犹。等日后學習了,再來糾正。
單應(yīng)性矩陣H把源圖像平面上的點集位置與目標圖像平面上(通常是成像儀平面)的點集位置聯(lián)系起來:
OpenCV就是利用多個視場計算多個單應(yīng)性矩陣的方法來求解攝像機內(nèi)參數(shù)急膀。
OpenCV提供了一個方便的C函數(shù)cvFindHomography(),函數(shù)接口如下:
void cvFindHomography(
const CvMat* src_points,
const CvMat* dst_points,
CvMat* homography
);
1沮协、src_points,dst_points為N×2或者N×3的矩陣卓嫂,N×2表示點是以像素坐標表示慷暂。N×3表示以齊次坐標表示。
2晨雳、homography,為3*3大小的矩陣行瑞,用來存儲輸出的結(jié)果。
C++函數(shù)的接口:
Mat findHomography( const Mat& srcPoints, const Mat& dstPoints,
Mat& status, int method=0,
double ransacReprojThreshold=3 );
Mat findHomography( const Mat& srcPoints, const Mat& dstPoints,
vector<uchar>& status, int method=0,
double ransacReprojThreshold=3 );
Mat findHomography( const Mat& srcPoints, const Mat& dstPoints,
int method=0, double ransacReprojThreshold=3 );
1餐禁、srcPoints,dstPoints為CV_32FC2或者vector<Point2f>類型
2蘑辑、method:0表示使用所有點的常規(guī)方法;CV_RANSAC 基于RANSAC魯棒性的方法坠宴;CV_LMEDS 最小中值魯棒性方法
3洋魂、ransacReprojThreshod 僅在RANSAC方法中使用,一個點對被認為是內(nèi)層圍值(非異常值)所允許的最大投影誤差喜鼓。即如果:
那么點i被認為是異常值副砍。如果srcPoints和dstPoints單位是像素,通常意味著在某些情況下這個參數(shù)的范圍在1到10之間庄岖。
4豁翎、status,可選的輸出掩碼隅忿,用在CV_RANSAC或者CV_LMEDS方法中心剥。注意輸入掩碼將被忽略。
這個函數(shù)找到并且返回源圖像平面和目的圖像平面之間的透視變換矩陣H:
使得下面的返回投影誤差(back-projection)最斜惩:
如果參數(shù)method設(shè)置為默認值0优烧,該函數(shù)使用一個簡單的最小二乘方案來計算初始的單應(yīng)性估計。
然而链峭,如果不是所有的點對(srcPoints,dstPoints)都適應(yīng)這個嚴格的透視變換畦娄。(也就是說,有一些異常值)弊仪,這個初始估計值將很差熙卡。在這種情況下,我們可以使用兩個魯棒性算法中的一個励饵。RANSCA和LMEDS這兩個方法都嘗試不同的隨機的相對應(yīng)點對的子集驳癌,每四對點集一組,使用這個子集和一個簡單的最小二乘算法來估計單應(yīng)性矩陣役听,然后計算得到單應(yīng)性矩陣的質(zhì)量quality/goodness颓鲜。(對于RANSAC方法是內(nèi)層圍點的數(shù)量表窘,對于LMeDs是中間的重投影誤差)。然后最好的子集用來產(chǎn)生單應(yīng)性矩陣的初始化估計和inliers/outliers的掩碼灾杰。
忽略方法蚊丐,魯棒性與否熙参,計算得到的單應(yīng)性矩陣使用Levenberg-Marquardt方法來進一步減少重投影誤差艳吠,從而進一步提純。(對于魯棒性的方法僅使用內(nèi)圍層點(inliers))孽椰。
RANSAC方法昭娩,幾乎可以處理任含有何異常值比率的情況,但是它需要一個閾值用來區(qū)分inliers和outliers黍匾。LMeDS方法不需要任何閾值栏渺,但是它僅在inliers大于50%的情況下才能正確的工作。最后锐涯,如果你確信在你計算得到的特征點僅含一些小的噪聲磕诊,但是沒有異常值,默認的方法可能是最好的選擇纹腌。(因此霎终,在計算相機參數(shù)時,我們或許僅使用默認的方法)
這個函數(shù)用來找到初始化內(nèi)參數(shù)和外參數(shù)矩陣升薯。單應(yīng)性矩陣取決于一個尺度莱褒,那么通常歸一化,以使得h33=1涎劈。
再貼一個知乎回答: