我试着用OpenCV去扭曲鱼眼图像。从摄像机内部存储器中提取摄像机矩阵和畸变系数。我认为它们是准确的。正如您在下面的代码中所看到的,我使用的是简历::鱼眼::不失真图像。我发现这个GitHub发行帖子声称它应该工作,但是,不失真的图像帧看起来不对!所以,很明显有些事情不起作用。
以下是代码:
#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;
}代码输出:

如果你想亲自尝试,这里是原来的鱼眼图像:

发布于 2020-11-19 06:20:07
我无法准确地找到代码中真正的问题所在。当我阅读“文档”时,我看到了这一点:
函数简单地是鱼眼::initUndistortRectifyMap(具有单位R)和重新映射(用双线性插值)的组合。
当我深入研究如何使用这两个函数组合(initUndistortRectifyMap和remap)而不是使用undistortImage时,我发现了@Micka回答的这个职位。我试了一下,工作得很好,下面是代码和结果:
#include <opencv2/highgui.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main()
{
cv::Mat cameraMatrix = cv::Mat(3,3, cv::DataType<double>::type);
cv::Mat distortionCoeffs = cv::Mat(4,1, cv::DataType<double>::type);
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>(1,0) = 0.04842806980013847;
distortionCoeffs.at<double>(2,0) = -0.04542399942874908;
distortionCoeffs.at<double>(3,0) = 0.008737384341657162;
cv::Mat E = cv::Mat::eye(3, 3, cv::DataType<double>::type);
cv::Mat input_frame = cv::imread("fishEye.png");
cv::Size size = { input_frame.cols, input_frame.rows };
cv::Mat map1;
cv::Mat map2;
//cv::fisheye::undistortImage(input_frame,output_frame,cameraMatrix,distortionCoeffs, E, cv::Size(input_frame.cols,input_frame.rows));
cv::fisheye::initUndistortRectifyMap(cameraMatrix, distortionCoeffs, E, cameraMatrix, size, CV_16SC2, map1, map2);
cv::Mat undistort;
cv::remap(input_frame, undistort, map1, map2, cv::INTER_LINEAR,
CV_HAL_BORDER_CONSTANT);
cv::imshow("Input Image", input_frame);
cv::imshow("Output Image", undistort );
cv::waitKey(-1);
return 0;
}输出:

https://stackoverflow.com/questions/64903037
复制相似问题