我一直在努力获得没有插值的无畸变图像。但是当执行下面的代码时,我得到了一些奇怪的图像。我正在使用函数initUndistortRectifyMap,后者使用convertMaps函数给出mapx和类型CV_16SC2的mapy我将mapx和mapy转换为类型CV_32FC1.I一直在尝试调试原因,但找不到任何有用的东西。
int main()
{
Mat Cam1MatrixParam, Cam1Distortion;
Mat cf1;
cf1=imread("cam1.distort1.jpg", CV_LOAD_IMAGE_COLOR);
Size imagesize = cf1.size();
FileStorage fs1("cameracalibration.xml", FileStorage::READ);
fs1["camera_matrix"] >> Cam1MatrixParam;
fs1["distortion_coefficients"] >> Cam1Distortion;
Mat R = Mat::eye(3, 3, CV_32F) * 1;
int width = cf1.cols;
int height = cf1.rows;
Mat undistorted = Mat(height, width, CV_8UC3);
Mat mapx = Mat(height, width, CV_32FC1);
Mat mapy = Mat(height, width, CV_32FC1);
initUndistortRectifyMap(Cam1MatrixParam, Cam1Distortion, Cam1MatrixParam, R, imagesize, CV_16SC2, mapx, mapy);
convertMaps(mapx, mapy, mapx, mapy, CV_32FC1, false);
for (int j = 0; j < height; j++)
{
for ( int i = 0; i < width; i++)
{
undistorted.at<uchar>(mapy.at<float>(j, i), mapx.at<float>(j, i)) = cf1.at<uchar>(j, i);
}
}
imwrite("cam1.undistortimage.png", undistorted);
}
使用此版本代码的图像 undistorted.at(j,i)= cf1.at(mapy.at(j,i),mapx.at(j,i));
答案 0 :(得分:0)
看起来它不再是撤消失真,而是再次应用它。
mapx
和mapy
从显示坐标映射到照片坐标。
undistorted.at<cv::Vec3b>(j, i) = distort.at<cv::Vec3b>(mapy.at<float>(j, i), mapx.at<float>(j, i));
您可以将此代码解释为:对于每个显示坐标{j, i}
,在照片中找到相应的(扭曲的)坐标,然后复制像素。
答案 1 :(得分:0)
您正在使用彩色图像(cv :: Vec3b),请尝试改为:
undistorted.at<cv::Vec3b>(mapy.at<float>(j, i), mapx.at<float>(j, i)) = cf1.at<cv::Vec3b>(j, i);
如果不失真地图是反向的话,可能会与Maxim Egorushkin的答案相结合