有畸变相机下Aruco标记检测及相关函数使用疑问
OpenCV畸变校正与aruco/solvePnP/projectPoints的配合使用
aruco::detectMarkers的畸变问题
官方文档要求输入无畸变图是因为镜头畸变会干扰标记点的角点定位精度,示例没做校正大概率是用了畸变可忽略的相机,或是为简化演示流程。实际项目里一定要先做畸变校正,用undistort()或者initUndistortRectifyMap()+remap()把原始畸变图转成无畸变图,再传入detectMarkers。
solvePnP在无畸变图上的正确用法
如果已经用无畸变图得到标记点,调用solvePnP时:
- 畸变系数
distCoeffs直接传cv::noArray() - 相机内参必须用校正后的newCameraMatrix,不能用原始相机内参矩阵
projectPoints的对应操作
和solvePnP逻辑完全一致:
- 内参传校正后的
newCameraMatrix distCoeffs传cv::noArray()- 这样投影出的像素点才能和无畸变图像上的标记点位置匹配
核心结论
只要是基于无畸变图像的位姿计算、点投影操作,都要统一使用校正后的newCameraMatrix,同时把畸变系数设为空数组,才能保证结果的准确性。
内容的提问来源于stack exchange,提问作者Vladimir Tsyshnatiy
相关产品推荐
相关产品推荐

