【入門】(二)SFM的基本概念與opencv實現
目錄
基本概念
SFM(Structure from motion)由一系列包含著視覺運動資訊(motion signals)的多幅二維影象序列(2D image sequences)估計三維結構(3D model)的技術。它屬於計算機視覺及視覺化的研究範圍。
關鍵步驟
1、特徵提取與匹配
2、相機標定,計算本質矩陣,分解得到相機相對位姿R,T
3、利用已知的R、T和匹配的特徵點還原三維座標。(三角化)
三維重建與優化:
選取其中的兩幅影象進行重建,選擇的標準是匹配的特徵點數目多。採用五點法求出兩幅影象相對的外引數和相機內參數,然後利用bundle adjustment(光束平差法)
方法來進行優化。依據得到的引數和兩幅影象的匹配關係求出空間點的座標。然後繼續新增圖片,選擇與已知“實際“”座標的點匹配最多的影象來進行新增。這樣就變成了已知二維影象特徵點及其三維世界座標進行相機標定的問題。
(1)雙目(兩相機檢視)重建推導過程:
由匹配的特徵點和旋轉平移矩陣重建三維點,簡單理解為,以相機1為參考座標,已知相對旋轉平移矩陣,可以得到相機2相對座標(平移相差一個尺度因子),又有一對畫素點,那麼在幾何意義上,過分別過光心和畫素點做直線即可得到空間點的座標。公式推導如下:
在前面的推導中,已知畫素點和世界座標(這裡設為相機1座標)之間有如下關係
,其中x為畫素座標,K為內參,R,t為旋轉平移矩陣,兩邊做外積,消除常量s,有如下公式
,t點稱其垂直向量為0,則有
,??表達為座標X的線性方程,用SVD求X左邊矩陣的零空間,再將最後一個元素歸一化到1,即可求得X。??
//已知相機記憶體和旋轉平移矩陣R,T,三角化重建三維點 void reconstruct(Mat& K, Mat& R, Mat& T, vector<Point2f>& p1, vector<Point2f>& p2, Mat& structure) { //兩個相機的投影矩陣[R T],triangulatePoints只支援float型 Mat proj1(3, 4, CV_32FC1); Mat proj2(3, 4, CV_32FC1); proj1(Range(0, 3), Range(0, 3)) = Mat::eye(3, 3, CV_32FC1); proj1.col(3) = Mat::zeros(3, 1, CV_32FC1); R.convertTo(proj2(Range(0, 3), Range(0, 3)), CV_32FC1); T.convertTo(proj2.col(3), CV_32FC1); Mat fK; K.convertTo(fK, CV_32FC1); proj1 = fK*proj1; proj2 = fK*proj2; //三角化重建 triangulatePoints(proj1, proj2, p1, p2, structure); }
(2)多目重建方法
雙目重建下,對同一三維點在兩個相機座標下不同畫素點的匹配,求出本質矩陣後可以得到相對旋轉平移矩陣,從而進行三維點的重建,三維點的座標基於相機1座標系統。當加入更多的圖片,即有多個相機,那麼應該如果進行點的三維重建。提出可能的解決方案有:
(1)相機3與相機1做雙目重建——但是採用這種方法,當相機實際旋轉平移矩陣較大時,得到的兩幅圖沒有匹配的畫素點時,這種方法就不可行了
(2)已知相機1和相機2的相對旋轉平移矩陣,相機2和相機3的相對旋轉平移矩陣,能否得到相機3和相機1的旋轉平移矩陣?不能,這樣累積只能得到旋轉矩陣,不能得到平移矩陣,會相差一個尺度因子。
正確的解決辦法如下:
使用solvePnP和solvePnPRansac函式(function:已知空間點座標和畫素座標,得到相機座標,即根據空間中的點與影象中的點的對應關係,求解相機在空間中的位置)。
具體過程如下:
a、雙目重建得到一些空間點和對應的相機2畫素點
b、相機2和相機3畫素點做特徵匹配,取其中由上一步已知空間點的畫素點,求解相機3的空間位置
c、已知相機3的空間位置,即可得到相機3到1的旋轉平移矩陣,求解餘下未知匹配畫素點空間位置
d、相機4與相機3做特徵匹配。。。依次類推可以進行多目重建。