簡體   English   中英

相機姿態估計:如何解釋旋轉和平移矩陣?

[英]Camera pose estimation: How do I interpret rotation and translation matrices?

假設我在兩個圖像之間有良好的對應關系並嘗試恢復它們之間的相機運動。 我可以使用OpenCV 3的新設施,如下所示:

 Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask);

 int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask);

 Mat mtxR, mtxQ;
 Mat Qx, Qy, Qz;
 Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz);

 cout << "Translation: " << t.t() << endl;
 cout << "Euler angles [x y z] in degrees: " << angles.t() << endl;

現在,我無法繞過Rt實際意味着什么。 它們是將坐標從相機空間1映射到相機空間2所需的變換,如p_2 = R * p_1 + t

考慮這個例子,用地面實況手動標記對應關系

在此輸入圖像描述

我得到的輸出是這樣的:

Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796]
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445]

我嘗試將其與我在圖像中看到的相匹配並提出解釋, [-0.96,-0.04,0.25]告訴我,我向右移動,因為坐標沿着負x軸移動,但它也會告訴我,我已經走得更遠了,因為坐標沿正z軸移動。

我還圍繞y軸旋轉了相機(左邊,我認為這是圍繞負y軸的逆時針旋轉,因為在OpenCV中,y軸指向下方,不是嗎?)

問題:我的解釋是否正確,如果不正確,那么正確的解釋是什么?

事實證明我的解釋是正確的,關系p2 = R * p1 + t確實成立。 可以通過使用cv::triangulatePoints()cv::convertPointsFromHomogeneous來驗證這一點,以從相應的點(相對於相機1)獲得3D坐標,然后應用上面的等式。 使用相機2的相機矩陣進行乘法,然后生成p2圖像坐標。

你的解釋聽起來對我說得對。 我不是100%關於OpenCV中軸的方向,但我相信你對Y軸是正確的。

輸出也是有意義的,不僅僅是從代碼的角度來看,但如果你看兩個圖像,你可以粗略地想象一個完整的90度旋轉指向的位置(它基本上是相同的角度,但在汽車的另一側) )

這也是通過Rigid Body Motion力學對這個概念的一個相當不錯的解釋: http//nghiaho.com/?page_id = 671

實際上你的解釋是正確的。

首先,你是正確的,關於y軸的方向。 有關OpenCV攝像機坐標系的說明,請參見此處

您的代碼將從第二個到第一個相機返回R和T. 這意味着如果x1是第一圖像中的點並且x2是第二圖像中的點,則以下等式保持x1 = R*x2 + t 現在,在您的情況下,右側圖像(前視圖)來自攝像機1,而左側圖像(側視圖)來自攝像機2。

看看這個等式,我們看到首先應用了旋轉。 因此,將相機當前圖像成像為左框架。 現在你的R指定圍繞y軸旋轉大約46度。 由於角度α的旋轉點與將坐標軸反向旋轉此角度相同,因此R指示您向左旋轉。 正如你自己所指出的,如果看圖片,這似乎是正確的。 由於圍繞其他軸的旋轉很小並且難以成像,所以我們在這里省略它們。 因此,在應用旋轉后,您仍然站在相同的位置,左框架被取出,但您的相機或多或少指向汽車后部或直接位於汽車后方的空間。

現在讓我們看一下翻譯向量。 關於向右和向遠移動的解釋也是正確的。 讓我試着解釋一下原因。 從您當前的位置想象一下,使用新的攝像頭方向,您只能向右移動。 你會直接撞到汽車或需要將相機放在發動機罩上方。 因此,向右移動后,您還需要進一步移動到達您拍​​攝右圖的位置。

我希望這個解釋可以幫助你想象你的R和t描述的運動。

讓我們來看看。 OpenCV攝像機坐標系是“X朝向圖像右,Y朝向圖像底部,Z = X x Y朝向場景”。 Q = [R | t]是從camera2到camera1的坐標變換,因此t是以camera1為根的向量,其尖端位於camera2,以camera1幀表示。 因此,您的平移向量意味着攝影機2位於攝像機1的左側,只有當汽車的側視圖位於攝像機2中且汽車的前視圖位於攝像機1中時,才能使用攝像機1的左側。這與正Z分量一致因為在側視圖中,汽車看起來離相機更遠。

此標識也與您計算的歐拉角一致:它們在OpenGL約定中返回,從而表示從源到目標的旋轉。 在您的情況下,相對於攝像機1的垂直軸旋轉46度,逆時針旋轉向下Y軸,在您的側視圖中為您提供。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM