了解openCV不失真

blu*_*hub 5 matlab opencv camera-calibration

我正在接收一个过tof camera孔的深度图像MATLAB.用于计算深度图像中的x,y,z坐标的tof相机的传送驱动程序是使用openCV函数,其在MATLABvia mex文件中实现.

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

...而且有我的问题:我真的不明白它,我希望你能帮助我.它是如何实际工作的?我试图通过论坛搜索,但没有找到任何有关此案例的有用线程.

问候!

BCo*_*nic 9

与摄像机校准相关文档页面上提供了3D点[X; Y; Z]到2D图像点的投影方程:[u; v]

opencv投影方程http://docs.opencv.org/_images/math/dbe76ed3ef28b501c3933a74618c2c94889d38fa.png

在透镜失真的情况下,方程是非线性的并且取决于3到8个参数(k1到k6,p1和p2).因此,通常需要非线性求解算法(例如Newton方法,Levenberg-Marquardt算法等)来反演这样的模型并估计失真的未失真坐标.这就是功能背后使用的功能undistortPoints,通过调整参数可以使优化快速但有点不准确.

然而,在图像镜头校正的特定情况下(与点校正相反),存在基于众所周知的图像重新采样技巧的更有效的方法.这个技巧是,为了获得目标图像的每个像素的有效强度,您必须将目标图像中的坐标转换为源图像中的坐标,而不是直观地期望的相反.在镜头失真校正的情况下,这意味着您实际上不必反转非线性模型,而只是应用它.

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

  • 使用校准矩阵的反转将像素坐标转换(u_dst, v_dst)为标准化坐标,(x', y')K
  • 如上所示应用镜头变形模型,以获得失真的标准化坐标(x'', y''),
  • 使用校准矩阵转换(x'', y'')为失真的像素坐标,(u_src, v_src)K
  • 使用您选择的插值方法查找与(u_src, v_src)源图像中的像素坐标关联的强度/深度,并将此强度/深度指定给当前目标像素.

请注意,如果您对失真深度图图像感兴趣,则应使用最近邻插值,否则几乎可以肯定在对象边界处插入深度值,从而导致不必要的伪像.

  • "为什么我要扭曲已经扭曲的标准化坐标?" >实际上,您将未失真图像`(u_dst,v_dst)`的像素坐标转换为失真图像`(u_src,v_src)`的像素坐标,以便检索要分配给未失真像素的强度/深度. (2认同)