You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相机标定中基于OpenCV的重投影误差计算疑问

相机标定重投影误差计算疑问解答

问题场景

做相机标定验证精度时,发现重投影点和标定板初始检测点视觉上有1-2像素差异,但按OpenCV文档写的代码算出的重投影误差只有0.1676704。怀疑代码里的重复除法导致结果偏差,想问这段代码的计算逻辑是否正确。

待检查代码

for i in range(len(threedpoints)):
    imgpoints2, _ = cv2.projectPoints(threedpoints[i], r_vecs[i], t_vecs[i], mtx, dist)
    error = cv2.norm(twodpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)
    mean_error += error
print( "total error: {}".format(mean_error/len(threedpoints)) )

代码正确性判断

这段代码完全正确,和OpenCV官方标定教程的计算逻辑一致,不存在重复除法问题。具体计算步骤:

  • 对每张标定图,用已求得的相机内外参,通过cv2.projectPoints把3D标定点重投影到图像平面,得到重投影点集imgpoints2;
  • cv2.norm(..., cv2.NORM_L2)计算的是:所有对应点对的(x坐标差平方 + y坐标差平方)之和的平方根,也就是所有点误差的L2范数;
  • 把单张图的L2范数除以该图的标定点数,得到单张图的“平均点误差L2范数”;
  • 累加所有图的该值后,再除以标定图总数,得到全局的平均重投影误差。

视觉差异与计算结果不符的原因

你看到的1-2像素是个别点的最大误差,而代码算的是所有点的全局平均误差:

  • 标定过程中,大部分点的重投影误差其实很小(通常0.1~0.3像素);
  • 只有少数点会因为标定板边缘畸变、检测噪声等出现1-2像素的误差;
  • 大量低误差点会把全局平均值拉低,最终结果自然远小于你看到的单点最大误差。

OpenCV官方教程对应说明(中文翻译)

OpenCV官方相机标定教程中,重投影误差的计算逻辑和你实现的代码完全一致。该指标的设计思路是通过平均所有标定图的“单图误差L2范数/点数”来评估整体标定精度,数值越小说明相机参数拟合效果越好,理想情况下该值应低于1像素。

内容的提问来源于stack exchange,提问作者AAslihak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:41:05