1. 程式人生 > >單應矩陣與基礎矩陣/本質矩陣的區別 本質矩陣分解失效情況?

單應矩陣與基礎矩陣/本質矩陣的區別 本質矩陣分解失效情況?

基礎矩陣與本質矩陣

基礎矩陣與本質矩陣反應的是對極幾何中一幅影象上的點在另一幅影象上的對應點的的位置關係,本質矩陣則是基本矩陣的一種特殊情況,是在歸一化影象座標下的基本矩陣,可以理解為本質矩陣對應的座標位於相機座標系,基礎矩陣對應的座標位於影象平面座標系,具體見:
https://blog.csdn.net/kokerf/article/details/72191054

單應矩陣

單應矩陣與基礎矩陣/本質矩陣的區別

單應矩陣反應的是世界座標系下平面上的點之間的對應關係,就是現實平面上的點到相機平面上的點的射影變換矩陣,具有8個自由度,就是說單應矩陣就是射影變換。相反,本質矩陣或基礎矩陣則沒有這個限制。見下圖:
這裡寫圖片描述


而基礎矩陣或本質矩陣反應的則是影象平面點x對應的真實點X在另一幅影象的投影點x’在對極線上的關係。

- 單應矩陣與本質矩陣/基礎矩陣都能分解得到R和T,有什麼區別?

本質矩陣:
基礎矩陣: 這裡寫圖片描述
單應矩陣: 這裡寫圖片描述n,d)表示世界座標系中一個平面的座標。

對上述3個矩陣進行運動分解,即可得到雙目攝像頭之間的相互位置關係。但需要注意的是,分解出來的平移向量T只代表平移的方向,不能代表實際平移量的大小。

  • 單應矩陣的求解需要世界座標系中平面上的點進行求解,為什麼Opencv中函式直接找特徵點進行H矩陣求解?

C++函式的介面:

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型別
2、method:0表示使用所有點的常規方法;CV_RANSAC 基於RANSAC魯棒性的方法;CV_LMEDS 最小中值魯棒性方法
3、ransacReprojThreshod 僅在RANSAC方法中使用,一個點對被認為是內層圍值(非異常值)所允許的最大投影誤差。
4、status,可選的輸出掩碼,用在CV_RANSAC或者CV_LMEDS方法中。注意輸入掩碼將被忽略。
這個函式找到並且返回源影象平面和目的影象平面之間的透視變換矩陣H:使得下面的返回投影誤差(back-projection)最小:
如果引數method設定為預設值0,該函式使用一個簡單的最小二乘方案來計算初始的單應性估計。

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

本質矩陣分解失效情況

利用影象之間的匹配特徵點進行本質矩陣的計算,當影象Resize後,要進行以下兩點的改變:
1、相機的內參乘相應的縮放係數;
2、在resize後的圖中檢測到的特徵點的座標乘相應的縮放係數,還原到原始影象中的座標(會有比較大的誤差)。

理論上可以直接使用估計基礎矩陣(Fundamental matrix)的方法來估計本質矩陣,如:8點演算法,7點演算法,及與之結合的最小中值法,RANSAC(隨機抽樣一致)法等。但是實際中使用這些方法估計出的本質矩陣的結果並不太令人滿意,尤其當匹配點對趨於共面時和平移量較小時,這些方法獲得的結果完全就不能用。如果用於標定的匹配點對,是在一個平面上的話,這些方法將完全失效,(比如,檢測到的特徵點本來就比較少,有可能就處於同一個平面上,再比如,本來在大圖上計算是沒有問題的,但是對影象進行Resize後,再進行特徵點的檢測,就會出現匹配點平移量很小的情況,也導致失效。)因為平面是一種退化結構或者叫臨界曲線(Critical surfaces)。而且在opencv3之前的opencv版本只提供了求取基礎矩陣F的API,雖然cv::stereoCalibrate(…)可以得到雙目標定結果以及本質矩陣E,但該方法是使用平面標定版輔助的plane2plane(單應性矩陣)估計出各相機的外引數,然後由外引數直接計算出影象相互之間的旋轉矩陣R和平移量t,此時獲取的剛體運動引數自由度為6。(https://blog.csdn.net/j10527/article/details/51295099)