I am trying to undistort a fisheye image using OpenCV. I obtained the camera matrix and the distortion coefficients from the internal memory of the camera. I'm assuming them to be accurate. As you can see in the below code, I'm using cv::fisheye::undistortImage. I found this GitHub Issue post claiming that it should work, however, the undistorted image frame doesn't look right! So, clearly something isn't working.
Here is the code:
#include <opencv2/highgui.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/core/mat.hpp>
int main()
{
cv::Mat cameraMatrix = cv::Mat(3,3, CV_64F, double(0));
cv::Mat distortionCoeffs = cv::Mat(1,4, CV_64F, double(0));
cameraMatrix.at<double>(0, 0) = 286.7037963867188;
cameraMatrix.at<double>(0, 1) = 0;
cameraMatrix.at<double>(0, 2) = 413.3463134765625;
cameraMatrix.at<double>(1, 0) = 0;
cameraMatrix.at<double>(1, 1) = 286.7817993164062;
cameraMatrix.at<double>(1, 2) = 397.1785888671875;
cameraMatrix.at<double>(2, 0) = 0;
cameraMatrix.at<double>(2, 1) = 0;
cameraMatrix.at<double>(2, 2) = 1;
distortionCoeffs.at<double>(0,0) = -0.01078350003808737;
distortionCoeffs.at<double>(0,1) = 0.04842806980013847;
distortionCoeffs.at<double>(0,2) = -0.04542399942874908;
distortionCoeffs.at<double>(0,3) = 0.008737384341657162;
cv::Mat input_frame = cv::imread("fisheye_input.png");
cv::Mat output_frame;
cv::fisheye::undistortImage(input_frame,output_frame,cameraMatrix,distortionCoeffs, cv::noArray(), cv::Size(input_frame.cols,input_frame.rows));
cv::imshow("Input Image", input_frame);
cv::imshow("Output Image", output_frame);
cv::waitKey(-1);
return 0;
}
Code output:
In case you want to try it yourself here is the original fisheye image: