【问题标题】:Understanding of openCV undistortionopenCV不失真的理解
【发布时间】:2014-03-24 09:21:05
【问题描述】:

我正在通过MATLAB 接收tof camera 的深度图像。用于计算深度图像外的 x,y,z 坐标的 tof 相机的交付驱动程序正在使用 openCV 函数,该函数通过 mex 文件在 MATLAB 中实现。

但后来我不能再使用那些驱动程序,也不能使用openCV 函数,因此我需要自己实现 2d 到 3d 映射,包括径向失真的补偿。我已经掌握了相机参数,并且深度图像的每个像素的 x、y、z 坐标的计算正在工作。到目前为止,我正在通过牛顿法求解不失真的隐式方程(这并不是很快......)。但是我想实现openCV函数的不失真。

...这是我的问题:我不太明白,希望您能帮助我。它实际上是如何工作的?我试图搜索论坛,但没有找到任何关于此案例的有用线索。

你好!

【问题讨论】:

    标签: matlab opencv camera-calibration


    【解决方案1】:

    上述答案是正确的,但请注意 UV 坐标位于屏幕空间中,并且以 (0,0) 为中心,而不是“真实的”UV 坐标。

    来源:自己使用 Python/OpenGL 重新实现。代码:

    def correct_pt(uv, K, Kinv, ds):
       uv_3=np.stack((uv[:,0],uv[:,1],np.ones(uv.shape[0]),),axis=-1)
       xy_=uv_3@Kinv.T
       r=np.linalg.norm(xy_,axis=-1)
       coeff=(1+ds[0]*(r**2)+ds[1]*(r**4)+ds[4]*(r**6));
       xy__=xy_*coeff[:,np.newaxis]
       return (xy__@K.T)[:,0:2]
    

    【讨论】:

      【解决方案2】:

      documentation page related to camera calibration 上提供了 3D 点 [X; Y; Z] 到 2D 图像点 [u; v] 的投影方程:


      (来源:opencv.org)

      在镜头畸变的情况下,方程是非线性的,取决于 3 到 8 个参数(k1 到 k6、p1 和 p2)。因此,通常需要非线性求解算法(例如牛顿法、Levenberg-Marquardt 算法等)来反转这样的模型并从扭曲的坐标中估计未扭曲的坐标。这就是 undistortPoints 函数后面使用的,通过调整参数使优化快速但有点不准确。

      但是,在图像镜头校正的特定情况下(与点校正相反),有一种基于众所周知的图像重采样技巧的更有效的方法。这个技巧是,为了获得目标图像的每个像素的有效强度,您必须将目标图像中的坐标转换为源图像中的坐标,而不是像直觉预期的那样相反。在镜头畸变校正的情况下,这意味着您实际上不必反转非线性模型,只需应用它即可。

      基本上,函数undistort背后的算法如下。对于目标镜头校正图像的每个像素,请执行以下操作:

      • 使用校准矩阵的逆矩阵K 将像素坐标(u_dst, v_dst) 转换为归一化坐标(x', y'),
      • 应用镜头畸变模型,如上所示,获得畸变归一化坐标(x'', y''),
      • 使用校准矩阵K 将(x'', y'') 转换为扭曲的像素坐标(u_src, v_src),
      • 使用您选择的插值方法查找与源图像中像素坐标(u_src, v_src) 相关联的强度/深度,并将此强度/深度分配给当前目标像素。

      请注意,如果您有兴趣使深度图图像不失真,则应使用最近邻插值法,否则您几乎肯定会在对象边界处插值深度值,从而导致不需要的伪影。

      【讨论】:

      • 感谢您的回复,我已经阅读过这种方法。但我真的不明白。为什么要扭曲已经扭曲的归一化坐标?它基于什么假设?您能否提供有关此步骤的更多详细信息?
      • "为什么要扭曲已经扭曲的归一化坐标?" > 实际上,您将来自未失真图像(u_dst, v_dst) 的像素坐标转换为来自失真图像(u_src, v_src) 的像素坐标,以便检索分配给未失真像素的强度/深度。
      • 好的,谢谢.. 我想,我理解它背后的想法。但如果我这样做,我会不会忽略图像边界处的一定数量的深度值?
      • 不一定,因为您可以根据需要构建目标图像:如果在映射到标准化坐标时考虑到它,您可以增加其大小并更改原点。
      • 好的,谢谢!对于进一步的处理,我只需要像素的 x、y、z 坐标。在我决定要实现哪种逆向建模之前,你能告诉我,函数undistortPoints 的优化是如何工作的吗?
      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 2013-01-08
      • 2021-09-14
      • 2014-02-04
      • 2020-10-09
      • 1970-01-01
      • 2017-11-22
      • 2017-08-01
      相关资源
      最近更新 更多