我已校準的我的相機用的OpenCV(findChessboard等),所以我有: - 相機畸變係數&內在函數矩陣 - 相機姿勢信息(翻譯&旋轉,separatedly計算通過其他方式)作爲歐拉角& a 4x4 - 相機框架內的二維點在OpenCV中,2D圖像點轉換爲3D世界單位矢量
如何將這些二維點轉換爲指向世界的三維單位向量?我嘗試使用cv :: undistortPoints,但似乎沒有做到這一點(只返回二維重新映射的點),並且我不確定用什麼矩陣數學方法來通過相機內在函數對相機進行建模。
我已校準的我的相機用的OpenCV(findChessboard等),所以我有: - 相機畸變係數&內在函數矩陣 - 相機姿勢信息(翻譯&旋轉,separatedly計算通過其他方式)作爲歐拉角& a 4x4 - 相機框架內的二維點在OpenCV中,2D圖像點轉換爲3D世界單位矢量
如何將這些二維點轉換爲指向世界的三維單位向量?我嘗試使用cv :: undistortPoints,但似乎沒有做到這一點(只返回二維重新映射的點),並且我不確定用什麼矩陣數學方法來通過相機內在函數對相機進行建模。
將您的2d點轉換爲同質點(給它第三個座標等於1),然後乘以相機內在矩陣的逆。例如,
cv::Matx31f hom_pt(point_in_image.x, point_in_image.y, 1);
hom_pt = camera_intrinsics_mat.inv()*hom_pt; //put in world coordinates
cv::Point3f origin(0,0,0);
cv::Point3f direction(hom_pt(0),hom_pt(1),hom_pt(2));
//To get a unit vector, direction just needs to be normalized
direction *= 1/cv::norm(direction);
原點和方向現在定義對應於該圖像點的世界空間中的射線。請注意,此處原點位於相機的中心,您可以使用相機姿態轉換爲不同的原點。失真係數會從您的實際相機映射到針孔相機模型,並應在一開始就使用它來查找您的實際二維座標。的步驟然後是
你忘了標準化hom_pt。 :) –
@IanMedeiros你的意思是使它成爲一個單位矢量或使第三個元素1?由這些點定義的向量在有或沒有任何類型的歸一化的情況下是正確的,在乘以相機矩陣的逆矩陣之後,第三個元素可以被解釋爲z座標。 – Hammer
其實,我已經upvoted你的答案,但現在我不知道它的正確。我認爲在進行所討論的均勻化之前,您需要使用固有矩陣將二維座標從像素轉換爲世界座標。您可以使用相機姿態信息將其轉換爲光線方向。 –
你在說什麼2D點? –
在相機框架內捕獲的2D圖像(像素)座標。基本上,給定一個二維圖像座標和上述數據,我應該能夠構建一個3D單位矢量指向來自相機的二維圖像座標。 – Yeraze