3
$\begingroup$

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:

enter image description here

Here is my output image: enter image description here

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:

  1. How I can I include more FOV in the corrected image at the edges, where the information is lost?

  2. How can I reduce the blur effect at the edges?

  3. During calibration, should I cover the entire FOV of the camera so that the corners are present at the edges also?

  4. What is the correct way of showing the patterns while calibration?

  5. 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);
$\endgroup$

0