首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用cv::Fisheye :un变形图像消除fisheye图像

使用cv::Fisheye :un变形图像消除fisheye图像
EN

Stack Overflow用户
提问于 2020-11-18 23:30:29
回答 1查看 2.5K关注 0票数 1

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

以下是代码:

代码语言:javascript
运行
复制
#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;
}

代码输出:

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

EN

回答 1

Stack Overflow用户

发布于 2020-11-19 06:20:07

我无法准确地找到代码中真正的问题所在。当我阅读“文档”时,我看到了这一点:

函数简单地是鱼眼::initUndistortRectifyMap(具有单位R)和重新映射(用双线性插值)的组合。

当我深入研究如何使用这两个函数组合(initUndistortRectifyMapremap)而不是使用undistortImage时,我发现了@Micka回答的这个职位。我试了一下,工作得很好,下面是代码和结果:

代码语言:javascript
运行
复制
#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;
}

输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64903037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档