使用cv :: undistort取消扭曲和居中图像

时间:2018-08-13 15:48:25

标签: c++ image opencv computer-vision camera-calibration

我有一个畸变的图像,其主要点不在中心。我想使用opencv函数cv::undistort消除失真。此外,我想将图像的主要点移到图像中心[size_x / 2,size_y / 2]的中心。

我目前要做的是:

//Creating the camera matrix with the parameters of the calibration algorithm (they are correct)
 cv::Mat cv_camera_matrix = cv::Mat::zeros(3, 3, CV_64F);
cv_camera_matrix.at<double>(0,0) = projection_parameters[0]; //* incoming_image_ptr_mono8->image.cols;
cv_camera_matrix.at<double>(1,1) = projection_parameters[1]; //* incoming_image_ptr_mono8->image.rows;
cv_camera_matrix.at<double>(0,2) = projection_parameters[2]; //* incoming_image_ptr_mono8->image.cols;
cv_camera_matrix.at<double>(1,2) = projection_parameters[3]; //* incoming_image_ptr_mono8->image.rows;
cv_camera_matrix.at<double>(2,2) = 1;

//filling up of an array with the generated distortion parameters of the calibration algorithm (they are correct)

 cv::Mat distortion_coefficients = cv::Mat::zeros(1, 4, CV_64F);
distortion_coefficients.at<double>(0,0) = undistortion_parameters[0];
distortion_coefficients.at<double>(0,1) = undistortion_parameters[1];
distortion_coefficients.at<double>(0,2) = undistortion_parameters[2];
distortion_coefficients.at<double>(0,3) = undistortion_parameters[3];

cv::undistort(input_image, output_image,cv_camera_matrix, cv::getDefaultNewCameraMatrix(cv_camera_matrix,input_image.size(),true),distortion_coefficients);

不失真已经消除了扭曲,但是我不确定图像的主要点是否移动到中心。我选择函数cv::getDefaultNewCameraMatrix来移动主要点。现在的问题是,中心是否应该位于该位置。

Undistort使用函数:cv::initUndistortRectifyMap(),并且在插入值时,documentation中的数学描述不会产生结果。

现在的问题是:我可以使用GetDefaultNewCameraMatrix来移动主要点吗?还有另一种方法吗?我应该使用哪个功能?

另外,如何检查我的主要点是否移到中心?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

如何检查我的主要点是否移到中心?

您可以在已知位置(例如,在主要点上具有 的中心交点的网格)创建具有已知图案的自己的图像。然后,您通过undistort函数发送此模拟图像,以查看已知图案是否已移至正确位置。

如果您想走得更远,可以使用projectPoints,然后undistort将您期望的失真投影到自己的模拟图像上。然后,您可以控制整个过程,并且可以准确地看到失真系数和原理点如何影响图像。

  

我可以使用GetDefaultNewCameraMatrix来移动主要点吗?还有另一种方法吗?我应该使用哪个功能?

我认为GetDefaultNewCameraMatrix是在此处使用的错误函数。它将覆盖原理点指向图像的中心(例如,尺寸为[400,400]的图像为[200,200])。

如果矩阵projection_parameters已包含主点(例如来自calibrateCamera函数的主点),则将其原样发送到undistort

赞:

cv::undistort(input_image, output_image,cv_camera_matrix, cv_camera_matrix, distortion_coefficients);

undistort函数应正确处理原理点并相应地转换图像。这就是函数的功能。