# Different undistorting results (first rotate, then undistort OR first undistort, then rotate)

Hello,

i don't know why, but i get different results if i first rotate the image and undistort it, or if i first undistort and then rotate it.
There is a very small difference at both results... (In the middle of the image it seems to be same, but at the upper and lower borders of the images the difference is higher)

My minimal code is shown below:

Mat camera_matrix, distCoeffs;

char* out_file = "C:\\Users\\Bob\\Documents\\Visual Studio 2013\\Projects\\Samples\\camera.txt";

fs["K"] >> camera_matrix;
fs["D"] >> distCoeffs;

Mat image1 = imread("C:\\Users\\Bob\\Documents\\Visual Studio 2013\\Projects\\Samples\\1.jpg");
Mat image2 = imread("C:\\Users\\Bob\\Documents\\Visual Studio 2013\\Projects\\Samples\\2.jpg");

Mat image1_undistorted, image2_undistorted;
Mat image1_rot, image2_rot, image1_flip, image2_flip;

//First workflow (first undistort image, then turn)
///////////////////////////////////////////////////////////////////////

undistort(image1, image1_undistorted, camera_matrix, distCoeffs);
undistort(image2, image2_undistorted, camera_matrix, distCoeffs);

transpose(image1_undistorted, image1_rot);
flip(image1_rot, image1_undistorted, 0);
transpose(image2_undistorted, image2_rot);
flip(image2_rot, image2_undistorted, 0);

imwrite("image1_undistorted_FIRSTWORKFLOW.jpg", image1_undistorted);
imwrite("image2_undistorted_FIRSTWORKFLOW.jpg", image2_undistorted);

//Second workflow (first turn image, then undistort)
///////////////////////////////////////////////////////////////////////

//Adjusting the camera matrix and distortion coefficients
double fx = camera_matrix.at<double>(0, 0);
double fy = camera_matrix.at<double>(1, 1);
double cx = camera_matrix.at<double>(0, 2);
double cy = camera_matrix.at<double>(1, 2);

camera_matrix.at<double>(0, 0) = fy;
camera_matrix.at<double>(1, 1) = fx;
camera_matrix_new.at<double>(0, 2) = cy;
camera_matrix_new.at<double>(1, 2) = image1.size().width - cx;

double p1 = distCoeffs.at<double>(0, 2);
double p2 = distCoeffs.at<double>(0, 3);

distCoeffs.at<double>(0, 2) = p2;
distCoeffs.at<double>(0, 3) = p1;

transpose(image1, image1_rot);
flip(image1_rot, image1_flip, 0);
transpose(image2, image2_rot);
flip(image2_rot, image2_flip, 0);

undistort(image1_flip, image1_undistorted, camera_matrix, distCoeffs, Mat());
undistort(image2_flip, image2_undistorted, camera_matrix, distCoeffs, Mat());

imwrite("image1_undistorted_SECONDWORKFLOW.jpg", image1_undistorted);
imwrite("image2_undistorted_SECONDWORKFLOW.jpg", image2_undistorted);


The results are shown below:

The first image (both workflow results)

The second image (both workflow results)

---------------------------------------------------------------------------------------------------------------------------------------

And if i calculate the differences of the images resulting from the different workflows, then i get these:

image1_undistorted_FIRSTWORKFLOW - image1_undistorted_SECONDWORKFLOW =

image2_undistorted_FIRSTWORKFLOW - image2_undistorted_SECONDWORKFLOW =

You can see the in the middle of the "difference images" it seems to be there is no difference...
But on the up and down side of the "difference image" there is a bigger difference...

Can someone tell me what im doing wrong? Or why i get different results in both workflows?

edit retag close merge delete

Sort by » oldest newest most voted

I think this is because image distortion is expressed with respect to the center of an image as the position of undistorted pixel is dependent on the parameter r, which is the distance to the image center:

If the image dimensions are odd numbers, then the position of the image center is always in the same point regardless of the orientation. If the numbers are even (like in your case), then the position of the center depends on the image orientation.

In case of your image the dimensions are 526x390. Image center is probably at [263, 195], but these coordinates correspond to two different points when the image is flipped or not, which affects the r parameter for particular pixels.

You see the differences in the corners, because distortion impact is proportional to the distance to the image center. The further from the distance, the more distorted the image is.

If you want to make sure, take some image whose dimensions are both odd numbers, and try your code on it. If there is no difference between the results regardless of the order of operations, you've got the answer.

more

Official site

GitHub

Wiki

Documentation