2012-08-13 144 views
6

幾種方法我得到了一個任務:打開CV - SFM的

我們有一個系統的工作,其中一個攝像頭周圍做一個人的頭部halfcircle。我們知道相機矩陣和每一幀的旋轉/平移。 (失真和更多...但我希望第一個工作沒有這些參數)

我的任務是,我只有相機矩陣,這是不變的這一舉措,和圖像(超過100)。現在,我必須逐幀地獲得翻譯和旋轉,並將其與現實世界中的旋轉和平移進行比較(來自我的系統,但僅用於比較,我也證明了這一點!)

第一步I到目前爲止:

  1. 使用OpenCV Cookbook的robustMatcher - works finde - 40-70匹配每個幀 - 可見看起來非常好!
  2. 我用getFundamental()獲得了基礎矩陣。我使用來自robustMatcher和RANSAC的健壯點。
  3. 當我在F,我可以用我的CameraMatrixķ得到Essentialmatrixè這樣的:

cv::Mat E = K.t() * F * K; //Found at the Bible HZ Chapter 9.12

現在我們需要用SVD提取R和T出電子商務。順便說一句,camera1的位置只是零,因爲我們必須從某處開始。

cv::SVD svd(E); 
cv::SVD svd(E); 

cv::Matx33d W(0,-1,0, //HZ 9.13 
      1,0,0, 
      0,0,1); 

cv::Matx33d Wt(0,1,0,//W^ 
     -1,0,0, 
     0,0,1); 

cv::Mat R1 = svd.u * cv::Mat(W) * svd.vt; //HZ 9.19 
cv::Mat R2 = svd.u * cv::Mat(Wt) * svd.vt; //HZ 9.19 

//R1 or R2??? 
R = R1; //R2 

//t=+u3 or t=-u3? 
t = svd.u.col(2); //=u3 

這是我的實際狀態!

我的計劃是:

  1. 三角測量的所有點獲得3D點
  2. 加入幀i與幀i ++
  3. 我的可視化3D莫名其妙地指出他們!

現在我的問題是:

  1. 在這個強大的匹配過時?還有其他方法嗎?
  2. 在我的第二步描述中使用這些要點是錯誤的嗎?他們必須轉換扭曲或什麼?
  3. 什麼R和T是我在這裏提取?從camera1的角度來看camera1和camera2之間的旋轉和平移嗎?
  4. 當我讀到聖經或論文或其他地方時,我發現R和t有四種可能性! 'P'= [UWV^T | + u3] oder [UWV^T | -u3] oder [UW^TV^T | + u3] oder [UW^TV^T | -u3]' P'是第二圖像的投影矩陣。 這意味着t可能是 - 或+和R可能是完全不同的?! 我發現我應該計算一個點到三維,並找出這個點是否是兩個相機的盈虧,然後我找到了正確的矩陣! 我發現了一些這個代碼在網上和他只是說這沒有進一步的計算: cv::Mat R1 = svd.u * cv::Mat(W) * svd.vtt = svd.u.col(2); //=u3 爲什麼這是正確的?如果不是的話 - 我如何在OpenCV中做這個三角測量? 我把這個翻譯與給我的翻譯進行了比較。 (首先,我必須將相關的翻譯和旋轉轉換爲camera1,但我現在得到了這個!)但它不一樣。我的程序的價值只是讓我們稱它從加減去跳。但它應該更穩定,因爲相機正在不斷的移動。 我確信有些軸可能會被切換。我知道翻譯只是從-1到1,但我認爲我可以從我的結果中提取一個因子到我的比較值,然後它應該是類似的。

有人做過這樣的事嗎?

很多人用棋盤進行攝像機標定,但是我不能用這個方法來獲得外部參數。

我知道visual sfm可以以某種方式做到這一點。 (在youtube上是一個視頻,其中有人圍着一棵樹走來走去,並從這些圖片中獲取這棵樹的視覺效果) 這與我所要做的非常相似。

最後一個問題:

是否有人知道一個簡單的方法來可視化我的3D點?我優先考慮MeshLab。有一些經驗呢?

回答

2

很多人用棋盤進行攝像機標定,但是我不能用這種方法獲取外部參數。

棋盤或檢查板用於查找內部/內在矩陣/參數,而不是外部參數。你說你已經拿到了內部矩陣了,我想這是你的

是什麼意思,我們知道相機矩陣和...

你在YouTube上看到這些影片都做了同樣,相機已經校準過,即內部矩陣已知。

這是一個健壯的匹配器嗎?還有其他方法嗎?

我沒有那本書,所以不能看到代碼並回答這個問題。

在我的第二步描述使用這些點是錯誤的嗎?他們必須轉換扭曲或什麼?

您需要先取消徑向變形,請參閱undistortPoints

什麼R和t是我在這裏提取?從camera1的角度來看camera1和camera2之間的旋轉和平移嗎?

R是第二個攝像頭在第一個攝像頭座標系中的方位。而T是第二臺攝像機在該座標系中的位置。這些有幾種用法。

當我在聖經或紙或其他地方我發現閱讀有4種可能性如何....

閱讀聖經的相關部分,這是很好的解釋有,三角是天真的方法,在那裏解釋更好的方法。

有人知道一個簡單的方法來可視化我的3D點嗎?

看到他們在Meshlab一個非常簡單的方法就是保存在PLY文件中的3D點的座標,這是一個極其簡單的格式,並通過Meshlab支持和幾乎所有其他的3D模型查看器。

+0

@ Shambool:謝謝你的幫助。我進一步研究了一下。我真的應該使用undistortPoints。我認爲你可以通過校準得到外在的。但似乎我錯了。 – 2012-08-19 14:25:26

+0

但是我對校準不感興趣,因爲我已經有了相機(內在)矩陣。重要的是要知道R和t矩陣取決於第一個攝像機座標系。下一步:獲得正確的R和T,因爲有4個選項。是的,它可以通過三角測量完成。 (以及SVD或Horn的封閉形式以獲得四個選項) – 2012-08-19 14:26:03

+0

但是你只是說聖經中可能並且描述了數學,但是我希望有人已經這樣做並且想要分享他的代碼。最後:是的,文件夾應該是Meshlab的最佳文件。我想回到youtube視頻:不,他們沒有做過校準。他們使用來自羅馬,杜布羅夫尼克或樹木的150.000 Flikrimages,並做一個sfm。所以他們絕對不能有校準!但我的問題的意思是解決這個問題。如果有人想分享他的代碼 - 那真的很有幫助。 – 2012-08-19 14:26:36

1

在這篇文章「五點相對姿勢問題的有效解決方案」中,Nistér解釋了一種非常好的方法來確定四種配置中哪一種是正確的(談論R和T)。

我試過了健壯的匹配器,我覺得很安靜。這個匹配器存在的問題是,它真的很慢,因爲它使用SURF,也許你應該嘗試用其他檢測器和提取器來提高速度。我還相信OpenCV中計算基本矩陣的函數不需要Ransac參數,因爲方法速度和對稱性在去除異常值方面做得很好,你應該嘗試8點參數。

OpenCV具有函數triangulate,這隻需要兩個投影矩陣,即在第一個和第二個圖像中的點。檢查calib3d模塊。

+0

值得注意的是,根據Nister的工作,最新版本的OpenCV現在包含三個用於恢復基本矩陣並將其分解的函數。我發現新的findEssentialMat函數比舊的findFundamentalMat函數更適合我的數據。我在糾正只移動一個攝像頭拍攝的一對圖像時遇到了很多麻煩,現在我有更好的運氣。 – 2015-01-21 16:55:31