如何使用OpenCV计算两个帧之间的旋转-平移矩阵

4
我希望使用OpenCV计算两个帧之间的旋转-平移矩阵[R|t](请参见http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=fundamentalmat#camera-calibration-and-3d-reconstruction)。
我知道我需要做以下三步:
1)检测两个帧上的特征(例如使用SURF), 2)匹配特征(例如使用ORBBFMatcher), 3)计算[R|t]矩阵。已知内部参数。
但是,我不知道如何使用OpenCV完成第三步。是否有一种常规/简单的方法来完成这个过程?
我的目标是计算相机的轨迹。

假设你正在处理2D到2D的对应关系,你尝试过使用cv::findHomography()函数了吗? - Iwillnotexist Idonotexist
我正在使用RGB+D相机,因此我知道每个像素的深度。 然而,我尝试了cv::findHomography(),但返回的结果似乎很奇怪。我可能漏掉了什么..? - DouglasAdams
findHomography() 接收 vector<Point2f> 来源和目标点,并找到将源映射到目标点的3x3投影矩阵。我强烈建议在 findHomography() 中使用默认参数的 RANSAC 方法。因为它接受的点是2D的,所以它完全忽略了深度。对于2D-to-3D对应关系,您需要 solvePnP()solvePnPRANSAC(),但首先您需要知道3D对象坐标空间中目标的实际坐标。 - Iwillnotexist Idonotexist
好的,使用RGB+D相机,如果我假设我的初始位置是(x = 0,y = 0,z = 0),并且z始终保持等于0。我应该使用哪个函数?是2D-to-2D还是2D-to-3D?我不太清楚。 稍后,我将计算每个像素在现实世界中的位置,但那是下一步。 - DouglasAdams
2个回答

2

使用单应矩阵来估计姿态,而不是基础矩阵。基础矩阵是无尺度的,会产生糟糕的结果。 - half-potato

1
你可以简单地使用stereoCalibrate,其中你的旋转和平移矩阵分别为R和T。object_points、l_image_points、r_image_points是物体和左/右图像帧中匹配点/特征的坐标。
stereoCalibrate(object_points, l_image_points, r_image_points, LcameraMatrix, LdistCoeffs, RcameraMatrix, RdistCoeffs, imageSize, R, T, E, F);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接