从两个2D帧获取3D坐标

时间:2017-07-10 17:07:59

标签: python python-3.x opencv opencv3.0 pose-estimation

我无法在网上找到问题的正确答案,所以我在这里问一下。让我们说我们从略微不同的角度拍摄了两张相同位置的2D照片。我选择了一组点(边缘检测),找到它们之间的对应关系(哪一点是其他照片上的哪一点)。现在我需要以某种方式在3D中找出这些点的世界坐标。

在过去的5个小时里,我已经阅读了很多关于它的内容,但我仍然无法理解我应该遵循哪些步骤。我尝试使用应用于基本矩阵的函数recoverPose和每帧上的两组点来估计相机的运动。当我知道旋转和翻译矩阵(recoverPose返回时)时,我无法理解它给了我什么。为了实现目标,我该怎么做?

我也知道相机的校准矩阵(我使用KITTI数据集)。我已阅读opencv documentation,但仍然不理解。 它的单眼视力。

1 个答案:

答案 0 :(得分:0)

如果你的相机有cameraMatrixdistCoeffs矢量(可能来自calibrateCamera()函数),你也有旋转矩阵R和对于摄像机的两个位置的平移向量T,您可以使用stereoRectify()来获取投影矩阵。请参阅OpenCV documentation on this function。因为在你的情况下它是相同的相机,我想传递相同的cameraMatrixdistCoeffs来代替第一和第二相机。

然后,使用trinangulatePoints()中获得的投影矩阵。对于由两个图像平面中的2D坐标定义的给定点集,它以[X, Y, Z, W]格式重构齐次坐标中的真实世界点。要获得3D坐标,请将前三个除以W

或者,正如文档所指出的,如果您通过视差矩阵而不是两个点向量来表示立体声数据,则可以使用reprojectImageTo3D()来获得相同的效果。虽然它需要重投影矩阵Q,它也是从stereoRectify()获得的。