我目前在进行一个姿态估计相关的项目,使用OpenCV进行操作。我需要在一对之间三角化点以进行重建和尺度因子估计。但是,在使用OpenCV函数recoverPose()和triangulatePoints()时,我遇到了一个奇怪的问题。
假设我有两个相机,称为相机1和相机2,它们在X轴上间隔一定距离。相机1坐标为(0,0,0),相机2位于右侧(正X轴方向)。我有两个数组points1和points2,它们包含了这两张图像中匹配的特征点。根据OpenCV文档和代码,我已经注意到了两个重要点:
- recoverPose() assumes that points1 belong to the camera at (0,0,0).
triangulatePoints() is called twice: one from recoverPose() to tell us which of the four R/t combinations is valid, and then again from my code, and the documentation says:
cv::triangulatePoints(P1, P2, points1, points2, points3D) : points1 -> P1 and points2 -> P2.
实际上我发现:事实并非如此。虽然我的相机1在0,0,0处,相机2在1,0,0处(1代表比例),但只有当我运行...
recoverPose(E, points2, points1...)
triangulatePoints([I|0], [R|t], points2, points1, pts3D)
这应该是不正确的,因为points2是来自R|t的集合,而不是points1。我测试了我的房间里有三个显眼物体的场景图像对进行三角化:一个显示器和墙上的两张海报。以下是从三角化中得出的点云结果(请原谅MS Paint)
如果按照OpenCV的规定方式进行操作:(分散在空间中的海报点,结果看起来很奇怪)
如果按照我的(错误?)方式进行操作:
能否有人分享一下他们对这里发生的事情的看法?从技术上讲,两种解决方案都是有效的,因为所有点都在两个相机的前面:我不知道该选择哪个,直到将其呈现为点云。我做错了什么,还是文档中存在错误?我对计算机视觉理论并不太了解,所以可能会遗漏一些基本的东西。感谢您的时间!
cv::calcOpticalFlowPyrLK
吗?我对你在问题中提到的特征检测和跟踪部分感到困惑。 - Farid Alijani