如何提高aruco检测精度?

How to increase aruco detection accuracy?

我用同一台相机从两个位置拍摄了 aruco 板上的一个物体。在工作之前,我有未失真的图像和校准的相机。我一次拍一个红点,计算3d线,对应这个点3Dspace,然后投影到另一张图:

问题是另一张图片上的线和点之间存在一些差异 (~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。如果我相信至少理论上可以做到这一点,我该如何提高精度?

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