2

我用同一个相机从两个位置拍摄了 aruco board 上的一个物体。我在工作前没有失真的图像和校准过的相机。我在一个镜头上取一个红点并计算3d线,它对应于这个点3D空间,然后将其投影到另一个图像:

p1

p2

问题是另一个图像上的线和点之间存在一些差异(~5px-15px)。我还观察到 opengl 生成的图像存在同样的问题,所以这似乎不是我的相机的问题。我使用这段代码来检测板的位置:

MarkerMapPoseTracker MSPoseTracker;  // tracks the pose of the marker map
MSPoseTracker.setParams(camParam, theMarkerMapConfig);
MSPoseTracker.estimatePose(ret.markers);

是否有可能以某种方式增加耐受性?我还发现了具有某种容差参数的函数:

bool estimatePose(Marker& m, const CameraParameters& cam_params, float markerSize, float minErrorRatio = 4 /*tau_e in paper*/)

但我不知道如何将此参数传递给 MSPoseTracker.estimatePose。如果我相信至少理论上可以做到这一点,我该如何提高精度?

4

1 回答 1

1

我最终得到了蛮力解决方案,我在没有时间的情况下实施了该解决方案。我用getMarker3DInfo在校准板上获取了标记边界的坐标,找到了用 cv::projectPoints 投影的点的坐标,然后在这两组四个点之间找到了一个单应性。这使我能够计算原始照片和投影校准板之间的 L2 范数。然后我连接了 bobyqa算法,它是开源的 GNU 优化库,专门用于多维优化,没有用于重计算差异函数的导数。这给出了很好的结果:

在此处输入图像描述

于 2018-02-12T06:59:04.333 回答