如何解决基于放大OpenCV 风格的相机参数的径向畸变误差
我们的 AR 设备基于具有很强光学变焦的相机。我们使用经典的相机校准工具(棋盘),通过 OpenCV 和 GML 相机校准工具测量该相机的失真。
在更高的缩放级别(我将使用 255 个中的 249 个作为示例),我们以全高清分辨率 (1920x1080) 测量以下相机参数:
fx = 24545.4316 fy = 24628.5469 cx = 924.3162 cy = 440.2694
对于径向和切向畸变,我们测量了 4 个值:
k1 = 5.423406 k2 = -2964.24243 p1 = 0.004201721 p2 = 0.0162647516
我们不确定如何解释(读取:实现)k1 和 k2 的这些极大值。使用 OpenCV 的经典“不失真”操作来使用这些值来校正图像似乎效果很好。不幸的是,这对于实时使用来说(太)太慢了。
下面的缩略图看起来很相似,点击它们将显示全尺寸图像,您可以从中发现不同之处:
这就是为什么我们要采取相反的方法:让摄像机镜头失真,并使用着色器对我们的 3D 场景应用类似的失真。遵循 OpenCV 文档,特别是这个 accepted answer,角点 (0,0) 的扭曲位置将是
// To relative coordinates
double x = (point.X - cx) / fx; // -960 / 24545 = -0.03911
double y = (point.Y - cy) / fy; // -540 / 24628 = -0.02193
double r2 = x*x + y*y; // 0.002010
// Radial distortion
// -0.03911 * (1 + 5.423406 * 0.002010 + -2964.24243 * 0.002010 * 0.002010) = -0.039067
double xdistort = x * (1 + k1 * r2 + k2 * r2 * r2);
// -0.02193 * (1 + 5.423406 * 0.002010 + -2964.24243 * 0.002010 * 0.002010) = -0.021906
double ydistort = y * (1 + k1 * r2 + k2 * r2 * r2);
// Tangential distortion
... left out for brevity
// Back to absolute coordinates.
xdistort = xdistort * fx + cx; // -0.039067 * 24545.4316 + 924.3162 = -34.6002 !!!
ydistort = ydistort * fy + cy; // -0.021906 * 24628.5469 + 440.2694 = = -99.2435 !!!
这些大的像素位移(左上角的 34 和 100 像素)似乎过度扭曲,与 OpenCV 生成的未失真图像不符。
那么具体的问题是:我们解释测量值的方式有什么问题,失真的正确代码应该是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。