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