opencv - 如何提高aruco检测精度?

标签 opencv 3d-reconstruction pose-estimation aruco

我用同一台相机从两个位置拍摄了 aruco 板上的一个物体。在工作之前,我有未失真的图像和校准的相机。我在一次拍摄中取一个红点并计算出对应于该点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。如果我相信至少在理论上可以做到这一点,我该如何提高精度?

最佳答案

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

enter image description here

关于opencv - 如何提高aruco检测精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723618/

相关文章:

java - 为什么 cvFindContours() 方法不能在 javacv 中正确检测轮廓?

c++ - 在 C++ 下的 OpenCV 中提取 RGB channel

python - 使用角坐标收缩多边形

c++ - 如何使用 Visual Studio 将 OpenCV 图像查看窗口推送到 QT GUI?

python - 使用多相机的 3D 点投影

mesh - 从使用点云库通过泊松重建构建的网格中去除水密性属性

python - 具有精确的移动距离和方向变化如何填充OpenCV透视变换矩阵(disparity-to-depth)?

python - OpenCV 误差校准教程 (solvePnPRansac)

c# - 用于在 Unity3D 中定位 3D 对象的 OpenCV 旋转(Rodrigues)和平移向量

c++ - solvePnpRansac GPU断言失败