我无法在网上找到问题的正确答案,所以我在这里问一下。让我们说我们从略微不同的角度拍摄了两张相同位置的2D照片。我选择了一组点(边缘检测),找到它们之间的对应关系(哪一点是其他照片上的哪一点)。现在我需要以某种方式在3D中找出这些点的世界坐标。
在过去的5个小时里,我已经阅读了很多关于它的内容,但我仍然无法理解我应该遵循哪些步骤。我尝试使用应用于基本矩阵的函数recoverPose
和每帧上的两组点来估计相机的运动。当我知道旋转和翻译矩阵(recoverPose
返回时)时,我无法理解它给了我什么。为了实现目标,我该怎么做?
我也知道相机的校准矩阵(我使用KITTI数据集)。我已阅读opencv documentation,但仍然不理解。 它的单眼视力。
答案 0 :(得分:0)
如果你的相机有cameraMatrix
和distCoeffs
矢量(可能来自calibrateCamera()
函数),你也有旋转矩阵R
和对于摄像机的两个位置的平移向量T
,您可以使用stereoRectify()
来获取投影矩阵。请参阅OpenCV documentation on this function。因为在你的情况下它是相同的相机,我想传递相同的cameraMatrix
和distCoeffs
来代替第一和第二相机。
然后,使用trinangulatePoints()
中获得的投影矩阵。对于由两个图像平面中的2D坐标定义的给定点集,它以[X, Y, Z, W]
格式重构齐次坐标中的真实世界点。要获得3D坐标,请将前三个除以W
。
或者,正如文档所指出的,如果您通过视差矩阵而不是两个点向量来表示立体声数据,则可以使用reprojectImageTo3D()
来获得相同的效果。虽然它需要重投影矩阵Q
,它也是从stereoRectify()
获得的。