去除畸变:
(1)对整幅图像去除畸变
(2)对一些点集去除畸变求位置
首先是图片:
initUndistortRectifyMap
中畸变矩阵参数解释:
double k1 = ((double*)distCoeffs.data)[0];
double k2 = ((double*)distCoeffs.data)[1];
double p1 = ((double*)distCoeffs.data)[2];
double p2 = ((double*)distCoeffs.data)[3];
double k3 = distCoeffs.cols + distCoeffs.rows - 1 >= 5 ? ((double*)distCoeffs.data)[4] : 0.;
double k4 = distCoeffs.cols + distCoeffs.rows - 1 >= 8 ? ((double*)distCoeffs.data)[5] : 0.;
double k5 = distCoeffs.cols + distCoeffs.rows - 1 >= 8 ? ((double*)distCoeffs.data)[6] : 0.;
double k6 = distCoeffs.cols + distCoeffs.rows - 1 >= 8 ? ((double*)distCoeffs.data)[7] : 0.;
使用样例:
Mat cameraMatrix = Mat::eye(3, 3, CV_64F);
//内参矩阵, 就算复制代码,也不要用我的参数。摄像头都不一样...
cameraMatrix.at<double>(0, 0) = 2.075319928848340e+03;
cameraMatrix.at<double>(0, 1) = 0;
cameraMatrix.at<double>(0, 2) = 1.273350420020438e+03;
cameraMatrix.at<double>(1, 1) = 2.073416138777327e+03;
cameraMatrix.at<double>(1, 2) = 6.898818022397845e+02;
//畸变参数,不要用我的参数~
Mat distCoeffs = Mat::zeros(5, 1, CV_64F);
distCoeffs.at<double>(0, 0) = 0.005961692158170;
distCoeffs.at<double>(1, 0) = 0.014892085926656;
distCoeffs.at<double>(2, 0) = -0.007714274148788;
distCoeffs.at<double>(3, 0) = -0.010548832296675;
distCoeffs.at<double>(4, 0) = 0;
Mat view, rview, map1, map2;
Size imageSize;
imageSize = image.size();
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(),
getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),
imageSize, CV_16SC2, map1, map2);
remap(image, image, map1, map2, INTER_LINEAR);
但是remap后的效果没有自己写去畸变的效果好看。反正我觉得很怪异。
然后是点集:
undistortPoints(imgpt[k], imgpt[k], cameraMatrix[k], distCoeffs[k], Mat(), cameraMatrix[k]);
Mat imgpt[2];
imgpt[k] = Mat(imagePoints[k][i]);
imagePoints类型为Point2f