There are a lot of questions regarding this topic ,but I am trying to get a more clear picture from these questions.
I am trying to calibrate a fish eye camera and I am using OpenCV omnidir class functions to find the camera intrinsics.
I am getting fair results. The problem is ,
At the image edges the objects gets stretched and also I am losing some information at the edges.
Here is my input image:
As you can see, I am losing some information at the edges(left and right) and also the images start stretching at the edges.
My questions are as follows:
How I can I include more FOV in the corrected image at the edges, where the information is lost?
How can I reduce the blur effect at the edges?
During calibration, should I cover the entire FOV of the camera so that the corners are present at the edges also?
What is the correct way of showing the patterns while calibration?
Are there any online tool boxes which provides fish eye calibration.
Here is my code snippet for calibration and testing
//Calibration Mat K, xi, D, idx; int flags=0|omnidir::CALIB_FIX_SKEW | omnidir::CALIB_FIX_K1 | omnidir::CALIB_FIX_K2; TermCriteria critia(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 200, 0.0001); vector<cv::Mat> rvecs, tvecs; double rms = cv::omnidir::calibrate(obj_points, image_points, image_size, K, xi, D, rvecs, tvecs, flags, critia, idx); //Testing Mat R = Mat::eye(3, 3, CV_32F); Mat Mapx, Mapy; Mat New_camera_mat(3,3,CV_32F); //New_camera_mat tries to get entire FOV,but it is losing some information at edges New_camera_mat.at<float>(0, 0) = 100; New_camera_mat.at<float>(0, 1) = 0; New_camera_mat.at<float>(0, 2) = 1280/2; New_camera_mat.at<float>(1, 0) = 0; New_camera_mat.at<float>(1, 1) = 100; New_camera_mat.at<float>(1, 2) = 720/2 ; New_camera_mat.at<float>(2, 0) = 0; New_camera_mat.at<float>(2, 1) = 0; New_camera_mat.at<float>(2, 2) = 1; cv::omnidir::initUndistortRectifyMap(K, D, xi_Right, R, New_camera_mat, image_size, CV_32F, Mapx, Mapy, cv::omnidir::RECTIFY_PERSPECTIVE); remap(distorted_frame, undistorted_out_frame, Mapx, Mapy, INTER_CUBIC);