我处于需要根据图像对应关系找出两个或多个相机之间的相对位置(所以相机不在同一个点)的情况。为了解决这个问题,我尝试了与here(代码如下)中描述的相同的方法。寻找相机之间的extrinsics
cv::Mat calibration_1 = ...;
cv::Mat calibration_2 = ...;
cv::Mat calibration_target = calibration_1;
calibration_target.at<float>(0, 2) = 0.5f * frame_width; // principal point
calibration_target.at<float>(1, 2) = 0.5f * frame_height; // principal point
auto fundamental_matrix = cv::findFundamentalMat(left_matches, right_matches, CV_RANSAC);
fundamental_matrix.convertTo(fundamental_matrix, CV_32F);
cv::Mat essential_matrix = calibration_2.t() * fundamental_matrix * calibration_1;
cv::SVD svd(essential_matrix);
cv::Matx33f w(0,-1,0,
1,0,0,
0,0,1);
cv::Matx33f w_inv(0,1,0,
-1,0,0,
0,0,1);
cv::Mat rotation_between_cameras = svd.u * cv::Mat(w) * svd.vt; //HZ 9.19
但在我的大多数情况下,我得到极其奇怪的结果。所以我的下一个想法是使用一个完整的捆绑调整器(应该做我想找的?!)。目前我唯一的大依赖是OpenCV,他们只有一个无证的捆绑调整实现。
所以,问题是:
- 有它没有依赖关系,并使用许可证,允许商用使用束调节?
- 有没有其他简单的方法来找到extrinsics?
- 距离摄像机距离很远的物体是否有问题? (重视差)
在此先感谢
你能提供更多的细节吗?请问,这两款相机都有一个共同的视场(FOV)? –
相机是相同的型号 - 但不完全相同 - 因此内在因素可能会稍有不同。理想情况下,内部调整也得到调整,但目前这不是我的优先 – Daniel
我的问题是两台相机是否有可以成像的公共区域。如果是的话,你可以在该公共区域放置一个棋盘,并找出相机之间的相对位置。 –