我用同一台相机从两个位置拍摄了 aruco 板上的一个物体。在工作之前,我有未失真的图像和校准的相机。我在一次拍摄中取一个红点并计算出对应于该点3D空间的3d线,然后将其投影到另一张图像:
问题是另一幅图像上的线和点之间存在一些差异 (~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优化库,专门用于多维优化,没有针对繁重计算差异函数的导数。这给出了很好的结果:
关于opencv - 如何提高aruco检测精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723618/