Python Opencv全向校准校正

Python Opencv全向校准校正,python,c++,opencv,camera-calibration,fisheye,Python,C++,Opencv,Camera Calibration,Fisheye,我有一个广角镜头(>160度)。我试过针孔和鱼眼模型,它们似乎提供了清晰的校正图像,并牺牲了一点视野。所以我决定尝试一下全向模型 对于全方位模型: double rms = cv::omnidir::stereoCalibrate(Omni_L.RealP, Omni_L.ImageP, Omni_R.ImageP, Omni_L.img.size(), Omni_R.img.size(), K1, xi1, D1, K2, xi2, D2, rvec, tvec, rvecsL, tvecsL

我有一个广角镜头(>160度)。我试过针孔和鱼眼模型,它们似乎提供了清晰的校正图像,并牺牲了一点视野。所以我决定尝试一下全向模型

对于全方位模型:

double rms = cv::omnidir::stereoCalibrate(Omni_L.RealP, Omni_L.ImageP, Omni_R.ImageP, Omni_L.img.size(), Omni_R.img.size(), K1, xi1, D1, K2, xi2, D2, rvec, tvec, rvecsL, tvecsL, flags, critia);
std::cout << "RMS : " << rms << std::endl;
然后我做不失真:

    cv::Mat R = cv::Mat::eye(3, 3, CV_32FC1);
    cv::Mat Mapx, Mapy;
    cv::Mat P(3, 3, CV_32FC1);
    P = K1;
    
    cv::Mat orid = cv::imread("Left\\1.jpg");
    std::cout << orid.size();
    std::cout << "R : "<<R<<std::endl;
    std::cout << "P : " << P << std::endl;
    cv::Size s= orid.size();
    try {
        cv::omnidir::initUndistortRectifyMap(K1, D1, xi1, R, P, s, CV_32FC1, Mapx, Mapy, cv::omnidir::RECTIFY_PERSPECTIVE);// Knew, new_size);
        cv::remap(orid, DC, Mapx, Mapy, cv::INTER_CUBIC);
    }
    catch (cv::Exception & e)
    {
        std::cerr << e.msg << std::endl; // output exception message
    }
    std::string Save_Original = "Distorted_Original" + std::to_string(10) + EXT;
    cv::imwrite(Save_Original, orid);
    std::string Save_Corrected = "Distorted_Corrected" + std::to_string(10) + EXT;
    cv::imwrite(Save_Corrected, DC);
cv::Mat R=cv::Mat::eye(3,3,cv_32FC1);
cv::Mat Mapx,Mapy;
cv::Mat P(3,3,cv_32FC1);
P=K1;
cv::Mat orid=cv::imread(“Left\\1.jpg”);

std::cout首先,我建议您阅读本教程: 回答您的问题:

  • 失真系数取决于您选择的失真模型
  • 查看教程(图像校正部分),如果要保留所有fov,必须更改标志以校正
  • P是校正后图像的“新”摄像机矩阵,R是原始空间和对象空间之间的旋转变换。如果使用cv::omnidir::UNDORTIMAGE取消图像的失真,则可以跳过这两个参数。在教程中查看有关已知的建议值
  • 看第二点的答案 这是我使用Convert_透视法的结果,我不知道为什么Convert_在这种情况下不起作用: 要做到这一点,只需像这样不干扰您的图像:

    cv::Size s = orid.size();
    cv::Mat Knew = cv::Mat(cv::Matx33f(s.width / 4, 0, s.width / 2,
            0, s.height / 4, s.width / 2,
            0, 0, 1));
    cv::MAt undistorted;
    cv::omnidir::undistortImage(orid, undistorted, K1, D1, xi1, cv::omnidir::RECTIFY_PERSPECTIVE, Knew, orid.size());
    
    

    你有一台相机还是一对相机?@Sushi我有一对立体相机。但是我刚刚提供了单摄像机的畸变校正图像,我编辑了上面的文章,还包括了校正的结果。在这个标志中,结果似乎越来越糟糕。您是如何设置函数中的其余参数的?尤其是如何设置已知矩阵中的值?cv::omnidir::UndortiMage()需要“已知”,但当我使用cv::omnidir::InitUndortiConvertyMap()时,是否需要提供已知矩阵?不,如果以这种方式取消失真,则不需要已知矩阵。检查我的最新答案。
    cv::Size s = orid.size();
    cv::Mat Knew = cv::Mat(cv::Matx33f(s.width / 4, 0, s.width / 2,
            0, s.height / 4, s.width / 2,
            0, 0, 1));
    cv::MAt undistorted;
    cv::omnidir::undistortImage(orid, undistorted, K1, D1, xi1, cv::omnidir::RECTIFY_PERSPECTIVE, Knew, orid.size());