2014-02-25 49 views
3

我有一個Kinect攝像頭和一個攝像頭,我試圖找到Kinect和攝像頭之間使用OpenCV的旋轉/平移矩陣。下面是設置:查找2個攝像頭之間的相對位置

setup

的兩個照相機面朝相同的方向。我可以得到兩個相機的固有矩陣,但我不知道如何獲得它們之間的相對位置?

我做了一些研究,發現找到必需的()函數。顯然,它返回一個基本矩陣(但因爲它假定焦點和原理點是在這兩款相機同樣的該功能似乎不適合),可用於:

  1. recoverPose()
  2. decomposeEssentialMat() - >如果我理解了,它會返回4種不同的解決方案,我應該使用這個函數嗎?

非常感謝!

編輯:如何stereoCalibrate()函數?但我的設置並不真正對應於立體相機。編輯2:我嘗試了openCV提供的「stereo_calib.cpp」示例。這是我的結果,我真的不知道如何解釋它?

enter image description here

而且,它產生一個「extrinsics.yml」的文件在哪裏可以找到R和T矩陣,但我不知道在哪個單位,他們是代表?我多次改變了源代碼中的squareSize變量,但似乎矩陣並沒有改變。

+0

嗨!它有幫助嗎? – nkint

+0

嗨!謝謝大家的回覆,我現在正忙着準備面試工作。下週,我會做一些測試,並給你一些反饋。感謝您的幫助! – Gustanas

回答

2

我認爲stereoCalibrate是工作的方式,如果你有興趣在深度圖和對齊的2個圖像(我認爲這是一個重要的問題,即使我不知道你想要做什麼即使你已經有了kinect的深度圖)。

但是,如果我正確地理解了您需要的東西,您還需要找到相機在世界上的位置。您可以通過在兩個視圖中具有相同的已知幾何體來實現這一點。這通常通過躺在地板上的棋盤圖案來實現,通過兩個(固定位置)相機發送。

一旦你有一個已知的幾何圖形3d點和相應的2D點投影在圖像平面上,你可以獨立地找到相機相對於3D世界的3D位置,考慮到從棋盤的一個邊緣開始的世界。

這樣你要達到什麼樣的是這樣的形象:

enter image description here

要找到相對棋盤相機的三維位置,你可以使用cv::solvePnP找到外在獨立地爲每臺相機設置矩陣這些是關於攝像機方向(從攝像機指向原點世界的光線)的一些問題,如果想要對它們進行可視化(如在OpenGL中),則必須處理它們(對於每個攝像機都是相同的)。一些矩陣代數和角度處理。

有關數學的詳細說明,我可以告訴你着名的Multiple View Geometry

另見我以前answer on augmented reality and integration between OpenCV and OpenGL(即熱使用所述非本徵矩陣和Ťř矩陣可以從它被分解,並在世界照相機的表示位置和方向)。

只是爲了好奇:你爲什麼使用普通的相機加一個kinect?該kinect爲您提供了我們試圖用2個立體相機實現的深度圖。我不明白一個額外的普通攝像機可以給你更多的校準的kinect,並且很好地利用了外部矩陣已經給你的數據類型。

PS的圖像是從這個不錯的OpenCV introductory blog拍攝的,但我認爲這個帖子與你的問題沒有多大關係,因爲那篇文章是關於似乎你已經擁有的intrisinc矩陣和失真參數。只是爲了澄清。

編輯:當你在談論單位外在數據的你通常是衡量他們在棋盤上的三維點的同一個單元是,如果你在3D識別平方棋盤邊緣點的P (0,0)P(1,0)P(1,1)P(0,1)並用它們與solvePnP相機的平移將以「棋盤邊緣尺寸」爲單位進行測量。如果它是1米長,則度量單位將是米。對於旋轉,單位通常以弧度表示角度,但它取決於您如何使用cv::Rodrigues提取它們以及如何從旋轉矩陣獲得3個角度的打哈欠距離。

+0

嗨,對於遲到的回覆感到抱歉。我使用另一臺相機,因爲我的目標是將我的網絡攝像頭拍攝的照片映射到由kinect創建的3D表面。我這樣做,因爲網絡攝像機將進一步被紅外攝像機所取代(我們害怕紅外攝像機和kinect之間的干擾)。如果我理解你的答案,solvePnp會給我2個攝像頭的rvec和tvec,一旦我有了它們,我就可以找到相對變換了嗎?另外,在校準步驟中,我的尺寸是否與我的方格有關? (因爲你說如果我修改P(0,0)等單位會發生變化) – Gustanas

+0

是的,你正確理解solvePnP的事情,但記得使用cv :: Rodrigues。那麼是的,廣場的大小很重要!這是否回答這個問題? – nkint

+0

是的,你真的很有幫助,非常感謝你。我想我現在明白了,羅德里格斯會給我旋轉矩陣。至於翻譯矩陣,我應該使用tvec而不更改任何內容嗎?或者我應該使用這個: cameraPosition = -np.matrix(rotM).T * np.matrix(tvec) (我在這裏看到這個來自你的問題:http://stackoverflow.com/questions/18637494/camera-position -in-world-coordinate-from-cvsolvepnp) – Gustanas

3

使用stereoCalibrate。您的設置完全像立體相機。

+0

謝謝!我嘗試過,但我不太瞭解用於旋轉/平移矩陣的單位。我編輯了我的問題 – Gustanas

+0

您發佈的圖像是糾正立體聲對 - 請注意相應的棋盤角落在同一條垂直線附近。 但是,您可能希望迭代使用更多圖像對,因爲這些對應關係看起來不太準確(很難判斷給出您張貼的圖像的大小)。 旋轉矩陣R沒有比例/單位 - 列是單位矢量。 IIRC定義了yml格式,以便將校準網格的一個平方的寬度作爲1來縮放平移向量矩陣T,因此您只需將目標的實際物理寬度乘以。 –

0

只需將Kinect放在網絡攝像機後面即可。 Kinect將爲您提供網絡攝像機的深度圖翻譯。關聯旋轉可以通過剛性連接到網絡攝像頭的平面上的Kinect進行計算。如果你不太關心精確度,那麼這將起作用,並且我認爲在這種情況下立體聲是無關緊要的,因爲Kinect已經給出了深度圖。

如果您需要更準確的結果,您需要指定您的目標。例如,立體校準的目標是生成兩個單應矩陣,可以應用到每個攝像機圖像以糾正它們,換句話說,使像素對應位於同一列(用於設置)。這簡化了立體匹配的搜索。你的目標是什麼?

相關問題