基于放大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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...