校正映射源码分析
initUndistortRectifyMap
-
校正映射参数:
输入单相机内参,畸变参数,旋转矩阵R,投影参数矩阵P(R和P是通过立体矫正stereoRectify()得到),原图像size大小,类型CV_32FC1,输出映射矩阵mapx,mapy -
校正映射过程:
1、获取相机内参cameraMatrix、畸变矩阵distCoeffs、旋转矩阵matR、摄像机投影参数矩阵newCameraMatrix
2、创建相机内参矩阵A、投影参数矩阵Ar,旋转矩阵R、畸变矩阵distCoeffs
3、通过LU分解求新的内参矩阵Ar与旋转矩阵R乘积的逆矩阵iR
4、从旧的内参矩阵中取出光心位置u0,v0作为主坐标点,和归一化焦距fx,fy
5、畸变参数计算,14个畸变系数,不过大多用到的只有(k1,k2,p1,p2),k1,k2为径向畸变系数,p1,p2为切向畸变系数,用不到的置为0,tauX,tauY是梯形畸变
6、通过tauX,tauY计算倾斜图像传感器的梯形畸变矩阵matTilt,其中tauX,tauY用不到的话matTilt为单位矩阵
7、求得上述提到的逆矩阵ir、梯形矩阵、主坐标点(u0,v0)、焦距(fx,fy)及畸变参数后,反向映射,遍历目标图像所有像素位置,找到畸变图像中对应位置坐标(u,v),并分别保存坐标(u,v)到mapx和mapy中。
①定义映射表1、2行元素指针
②利用逆矩阵iR将二维图像坐标(j,i)转换到摄像机坐标系(_x,_y,_w)
③遍历每个相机坐标位置,将相机坐标系归一化,令Z=1平面上。
④畸变模型的转换,求得xd,yd
⑤根据求取的xd,yd将三维坐标重投影到二维畸变图像坐标(u,v)
⑥保存u,v的值到Mapx,Mapy中
map_x实际上记录的是对应原图像中(i,j)位置的横坐标,map_y实际上记录的是(i,j)位置的纵坐标,而我们在这里把像素操作的i当做了横坐标,j当做了纵坐标
remap
-
像素重映射:
重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为 非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的
g(x,y) = f ( h(x,y) )
g( ) 是目标图像, f() 是源图像, 而h(x,y) 是作用于 (x,y) 的映射方法函数。简单的说就是改变图片的位置(左,右,上,下,颠倒翻转) -
像素重映射参数:
输入源图像src,目标图像dst,输入记录源图像位置的横坐标Mapx,输入记录源图像位置的纵坐标Mapy,使用双线性插值方式INTER_LINEAR,边界模式使用默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改