相機模型與標定(六) 單應性求解

2021-07-15 13:12:25 字數 3637 閱讀 5217

原文:

在計算機視覺中,平面的單應性被定義為乙個平面到另外乙個平面的投影對映。因此乙個二維平面上的點對映到攝像機成像儀上的對映

就是平面單應性的例子。如果點q到成像儀上的點q的對映使用齊次座標,這種對映可以用矩陣相乘的方式表示。若有一下定義:

則可以將單應性簡單的表示為:

這裡引入引數s,它是任意尺度的比例(目的是使得單應性定義到該尺度比例)。通常根據習慣放在h的外面。

h有兩部分組成:用於定位觀察的物體平面的物理變換和使用攝像機內引數矩陣的投影。

物理變換部分是與觀測到的影象平面相關的部分旋轉r和部分平移t的影響之和,表示如下

這裡r為3*3大小的矩陣,t表示乙個乙個3維的列向量。

攝像機內引數矩陣用m表示,那麼我們重寫單應性如下:

我們知道單應性研究的是乙個平面上到另外乙個平面的對映,那麼上述公式中的~q,就可以簡化為平面座標中的~q',即我們使z=0。即物體平面上的點我們用x,y表示,相機平面上的點,我們也是用二維點表示。我們去掉了z方向的座標,那麼相對於旋轉矩陣r,r可以分解為r=[r1 r2 r3],那麼r3也就不要了,參考下面的推導:

其中h為:

是乙個3×3大小的矩陣.

故最終的單應性矩陣可表示如下:

opencv就是利用上述公式來計算單應性矩陣。它使用同一物體的多個影象來計算每個視場的旋轉和平移,同時也計算攝像機的內引數。我們知道旋轉和平移共6個引數,攝像機內引數為4個引數。對於每乙個視場有6個要求解的新引數和4個不變的相機內引數。對於平面物體如棋盤,能夠提供8個方差,即對映乙個正方形到四邊形可以用4個(x,y)來描述。那麼對於兩個視場,我們就有8*2=16=2*6+4,即求解所有的引數,至少需要兩個視場。

為什麼正方形到四邊形的四個點的對映可以確定8個方程呢,結果是顯然的,我們假設物體平面上的正方形的乙個頂點座標為(u,v),成像儀與該點對應的點座標為(x,y),我們假設它們之間的關係如下:

u=f(x,y);

v=g(x,y);

顯然,我們把四點的對應座標帶入到上述公式可以得到8個方程。

這裡我們會想物體平面上正方形的四個頂點座標如何確定,其實我們就可以理解為角點的個數,對於尺度的話,我們有s進行控制。對於影象平面上的角點的位置,我們可以可以通過尋找角點來定位他們的位置。其實對於具體的操作,由於還沒細讀**和相關原理,在這裡只能大體猜測一下。等日後學習了,再來糾正。

單應性矩陣h把源影象平面上的點集位置與目標影象平面上(通常是成像儀平面)的點集位置聯絡起來:

opencv就是利用多個視場計算多個單應性矩陣的方法來求解攝像機內引數。

opencv提供了乙個方便的c函式cvfindhomography(),函式介面如下:

[cpp]view plain

copy

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大小的矩陣,用來儲存輸出的結果。

c++函式的介面:

[cpp]view plain

copy

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& 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型別

2、method:0表示使用所有點的常規方法;cv_ransac 基於ransac魯棒性的方法;cv_lmeds 最小中值魯棒性方法

3、ransacreprojthreshod 僅在ransac方法中使用,乙個點對被認為是內層圍值(非異常值)所允許的最大投影誤差。即如果:

那麼點i被認為是異常值。如果srcpoints和dstpoints單位是畫素,通常意味著在某些情況下這個引數的範圍在1到10之間。

4、status,可選的輸出掩碼,用在cv_ransac或者cv_lmeds方法中。注意輸入掩碼將被忽略。

這個函式找到並且返回源影象平面和目的影象平面之間的透視變換矩陣h:

使得下面的返回投影誤差(back-projection)最小:

如果引數method設定為預設值0,該函式使用乙個簡單的最小二乘方案來計算初始的單應性估計。

然而,如果不是所有的點對(srcpoints,dstpoints)都適應這個嚴格的透視變換。(也就是說,有一些異常值),這個初始估計值將很差。在這種情況下,我們可以使用兩個魯棒性演算法中的乙個。ransca和lmeds這兩個方法都嘗試不同的隨機的相對應點對的子集,每四對點集一組,使用這個子集和乙個簡單的最小二乘演算法來估計單應性矩陣,然後計算得到單應性矩陣的質量quality/goodness。(對於ransac方法是內層圍點的數量,對於lmeds是中間的重投影誤差)。然後最好的子集用來產生單應性矩陣的初始化估計和inliers/outliers的掩碼。

忽略方法,魯棒性與否,計算得到的單應性矩陣使用levenberg-marquardt方法來進一步減少重投影誤差,從而進一步提純。(對於魯棒性的方法僅使用內圍層點(inliers))。

ransac方法,幾乎可以處理任含有何異常值比率的情況,但是它需要乙個閾值用來區分inliers和outliers。lmeds方法不需要任何閾值,但是它僅在inliers大於50%的情況下才能正確的工作。最後,如果你確信在你計算得到的特徵點僅含一些小的雜訊,但是沒有異常值,預設的方法可能是最好的選擇。(因此,在計算相機引數時,我們或許僅使用預設的方法)

這個函式用來找到初始化內引數和外引數矩陣。單應性矩陣取決於乙個尺度,那麼通常歸一化,以使得h33=1。

相機模型與標定(學習筆記)

內外參定義 相機中有四個座標系,分別是 從到 從到 從到 標定方法概述 標定板介紹 例 標定方法 計算外參 設三維世界座標點為m x,y,z,1 t,二維相機平面畫素座標為m u,v,1 t,所以標定用的棋盤格平面到影象平面的單應性關係為sm a r,t m,其中 不妨設棋盤格位於z 0,定義旋轉矩...

單應性矩陣的理解及求解1

盡量寫的通俗一點,因為從某種程度上講,本人也是dummy.1.先說homogeneous coordinate,齊次座標 一幅2d影象上的非齊次座標為 x,y 而齊次座標為 x,y,1 也可以寫成 x z,y z,1 或 x,y,z 齊次座標有很多好處,比如可以很清楚的確定乙個點在不在直線上 t x...

slam基礎知識 相機模型 單應矩陣

單應矩陣 這一部分引用了下面兩個材料 如下圖所示,如果只有乙個成像平面,那麼成像平面上乙個點會接收來自世界中所有的點的光線,從而無法形成一張影象 如果在成像平面前部放乙個遮光板配乙個小孔,只允許很少一部分光透過小孔,此時,成像平面上的乙個點,只接受到特定外部點反射的光,所有的點放在一起,就成了一幅影...