blu*_*hub 5 matlab opencv camera-calibration
我正在接收一个过tof camera
孔的深度图像MATLAB
.用于计算深度图像中的x,y,z坐标的tof相机的传送驱动程序是使用openCV
函数,其在MATLAB
via mex文件中实现.
但是后来我不能再使用那些驱动程序也不能使用openCV
函数,因此我需要自己实现2d到3d的映射,包括径向失真的补偿.我已经掌握了相机参数,并且深度图像的每个像素的x,y,z坐标的计算正在工作.到目前为止,我正在通过牛顿法解决非正畸的隐式方程(这不是很快......).但我想实现openCV
功能的不失真.
...而且有我的问题:我真的不明白它,我希望你能帮助我.它是如何实际工作的?我试图通过论坛搜索,但没有找到任何有关此案例的有用线程.
问候!
在与摄像机校准相关的文档页面上提供了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)
源图像中的像素坐标关联的强度/深度,并将此强度/深度指定给当前目标像素.请注意,如果您对失真深度图图像感兴趣,则应使用最近邻插值,否则几乎可以肯定在对象边界处插入深度值,从而导致不必要的伪像.