微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于放大OpenCV 风格的相机参数的径向畸变误差

如何解决基于放大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 的经典“不失真”操作来使用这些值来校正图像似乎效果很好。不幸的是,这对于实时使用来说(太)太慢了。

下面的缩略图看起来很相似,点击它们将显示全尺寸图像,您可以从中发现不同之处:

Camera footage


相机镜头

Undistorted using OpenCV


使用 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 举报,一经查实,本站将立刻删除。