frame.cc 中 实现去畸变函数 (UnditortPoints)
此函数常作用于稀疏点集的去畸变
src: 输入的图像点坐标 2xN/Nx2 1-channel or 1xN/Nx1 2-channel (CV_32FC2 or CV_64FC2) (or vector )
dst: 输出的去畸变之后的坐标 1xN/Nx1 2-channel or vector
cameraMatrix: 相机内参矩阵
distCoeffs: 相机畸变系数
void Frame::UndistortKeyPoints()
{
// 如果没有图像是矫正过的,没有失真
if(mDistCoef.at<float>(0)==0.0)
{
mvKeysUn=mvKeys;
return;
}
// Fill matrix with points
// N为提取的特征点数量,将N个特征点保存在N*2的mat中
cv::Mat mat(N,2,CV_32F);
for(int i=0; i<N; i++)
{
mat.at<float>(i,0)=mvKeys[i].pt.x;
mat.at<float>(i,1)=mvKeys[i].pt.y;
}
// Undistort points
// 调整mat的通道为2,矩阵的行列形状不变
mat=mat.reshape(2);
cv::undistortPoints(mat,mat,mK,mDistCoef,cv::Mat(),mK); // 用cv的函数进行失真校正
mat=mat.reshape(1);
// Fill undistorted keypoint vector
// 存储校正后的特征点
mvKeysUn.resize(N);
for(int i=0; i<N; i++)
{
cv::KeyPoint kp = mvKeys[i];
kp.pt.x=mat.at<float>(i,0);
kp.pt.y=mat.at<float>(i,1);
mvKeysUn[i]=kp;
}
}
reshape 函数 : 变换二维矩阵的行列数或是channel数, 但不复制任何数据
—没有任何数据被加入新矩阵或从新矩阵中舍去, rows()cols()channels() 需保持一致
—O(1) 无数据拷贝
代码中, 将N2 矩阵 先变为N12 畸变校正后 再变回N2