相机标定小工具(单目+双目)技术分享

这篇具有很好参考价值的文章主要介绍了相机标定小工具(单目+双目)技术分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相机标定小工具(单目+双目)技术分享,c++,qt,相机,相机标定

void stereo_Calibrate::calibrateStereo()
{

    int current = 1;
    QDir dirL(imgsrcDirPathl+"/left");
    QDir dirR(imgsrcDirPathl+"/right");
    QStringList imagelistL;
    QStringList imagelistR;
    imagelistL<<"*.jpg"<<"*.bmp"<<"*.png";
    imagelistR<<"*.jpg"<<"*.bmp"<<"*.png";
    dirL.setNameFilters(imagelistL);
    dirR.setNameFilters(imagelistR);
    int imagecuont =dirL.count();
    framenumber=dirL.count();
    std::string dirpathL =imgsrcDirPathl.toStdString();
    std::string dirpathR =imgsrcDirPathl.toStdString();
    int success_n=0;
        for(int i=0;i<imagecuont;i++)
        {

        std::string imagenameL =dirpathL+"/left/"+dirL[i].toStdString();
        imageL = cv::imread(imagenameL);
        cv::cvtColor(imageL,grayimageL,cv::ColorConversionCodes::COLOR_BGR2GRAY);

        std::string imagenameR =dirpathR+"/right/"+dirR[i].toStdString();
        imageR = cv::imread(imagenameR);

        cv::cvtColor(imageR, grayimageR, cv::ColorConversionCodes::COLOR_BGR2GRAY);

        bool foundL, foundR;

        foundL = cv::findChessboardCorners(imageL,boardsize,cornerL);
        foundR = cv::findChessboardCorners(imageR, boardsize, cornerR);

        if (foundL == true && foundR == true)
        {
        cv::cornerSubPix(grayimageL,cornerL,cv::Size(11,11),cv::Size(-1,-1),cv::TermCriteria(cv::TermCriteria::MAX_ITER|cv::TermCriteria::EPS, 30, 1e-6));
        cv::cornerSubPix(grayimageR, cornerR, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, 30, 1e-6));
        cv::drawChessboardCorners(imageL,boardsize,cornerL,foundL);
        cv::drawChessboardCorners(imageR, boardsize, cornerR, foundR);
        cv::Mat Tg;
        cv::hconcat(imageL,imageR,Tg);
        cv::imshow("F", Tg);
        cv::moveWindow("F", 500, 100);
        cv::waitKey();

        imagepointL.push_back(cornerL);
        imagepointR.push_back(cornerR);
        success_n++;
        std::cout << "The image  " << current << "  is good" <<  std::endl;

        }
        else
        {
            std::cout << "The image is bad please try again" <<  std::endl;
        }
        current++;
    }
//===========================================================================================================================================单目标定矩阵写入

        cv::Size square_size = cv::Size(cellSize_width, cellSize_height);
        std::vector<std::vector<cv::Point3f>> object_pointsL; /* 保存标定板上角点的三维坐标 */
        std::vector<cv::Mat> tvecsMatL;  /* 每幅图像的旋转向量 */
        std::vector<cv::Mat> rvecsMatL;  /* 每幅图像的平移向量 */
        std::vector<cv::Point3f> realPointL;

        std::vector<std::vector<cv::Point3f>> object_pointsR; /* 保存标定板上角点的三维坐标 */
        std::vector<cv::Mat> tvecsMatR;  /* 每幅图像的旋转向量 */
        std::vector<cv::Mat> rvecsMatR;  /* 每幅图像的平移向量 */
        std::vector<cv::Point3f> realPointR;

 if(success_n!=0)
{
    for(int i=0;i<success_n;i++)
   {
        for (int i = 0; i < boardhight; i++)
        {
            for (int j = 0; j < boardwidth; j++)
            {
                cv::Point3f tempPointL;
                /* 假设标定板放在世界坐标系中z=0的平面上 */
                tempPointL.x = i * square_size.width;
                tempPointL.y = j * square_size.height;
                tempPointL.z = 0;
                realPointL.push_back(tempPointL);
            }

        }

        object_pointsL.push_back(realPointL);
        realPointL.clear();
    }
    for(int i=0;i<success_n;i++)
   {
        for (int i = 0; i < boardhight; i++)
        {
            for (int j = 0; j < boardwidth; j++)
            {
                cv::Point3f tempPointR;
                /* 假设标定板放在世界坐标系中z=0的平面上 */
                tempPointR.x = i * square_size.width;
                tempPointR.y = j * square_size.height;
                tempPointR.z = 0;
                realPointR.push_back(tempPointR);
            }

        }

        object_pointsR.push_back(realPointR);
        realPointR.clear();
    }
    cv::calibrateCamera(object_pointsL, imagepointL, imageL.size(), L_cameraMatrix, L_distCoeffs, rvecsMatL, tvecsMatL,
                           cv::CALIB_FIX_K3, cv::TermCriteria(cv::TermCriteria::EPS+cv::TermCriteria::COUNT, ITER,accuracy));//---------------------------


    cv::calibrateCamera(object_pointsR, imagepointR, imageR.size(), R_cameraMatrix, R_distCoeffs, rvecsMatR, tvecsMatR,
                           cv::CALIB_FIX_K3, cv::TermCriteria(cv::TermCriteria::EPS+cv::TermCriteria::COUNT, ITER,accuracy));//-----


//======================================================================================================================================单目标定矩阵写入
    QMessageBox mesbox;
    mesbox.setText("start stereoCalibrate!");
    mesbox.exec();
    worldpoint();
    double err = cv::stereoCalibrate(objpoint, imagepointL, imagepointR, L_cameraMatrix, L_distCoeffs, R_cameraMatrix, R_distCoeffs, imagesize, R, T, E, F,
        cv::CALIB_USE_INTRINSIC_GUESS, cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 30, 1e-6));

    qDebug()<< "The err = " << err ;

    cv::stereoRectify(L_cameraMatrix,L_distCoeffs, R_cameraMatrix,R_distCoeffs,imagesize,R,T,R1,R2,P1,P2,Q, cv::CALIB_ZERO_DISPARITY, -1, imagesize, &validROIL, &validROIR);

    cv::initUndistortRectifyMap(L_cameraMatrix,L_distCoeffs,R1,P1,imagesize, CV_32FC1,maplx,maply);
    cv::initUndistortRectifyMap(R_cameraMatrix,R_distCoeffs,R2,P2,imagesize,CV_32FC1,maprx,mapry);
    outputparam();
 }
 else
 {
     QMessageBox mesbox;
     mesbox.setText("calibrate faile!");
     mesbox.exec();

 }



}

以上就是软件的主要代码,相信大家都可以做出来了。加油!文章来源地址https://www.toymoban.com/news/detail-622240.html

到了这里,关于相机标定小工具(单目+双目)技术分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 相机标定和双目相机标定标定原理推导及效果展示

    相机标定和双目相机标定标定原理推导及效果展示

      参考了一些大佬的文章,整理了一下相机标定和双目标定的原理和推导。   摄像机成像就是空间场景投影至二维图像平面的空间变换过程。摄像机标定的要解决两个问题:首先确定三维空间点与像素平面像素点间的转换关系,即求解相机内外参;然后确定相机成像过程中

    2023年04月09日
    浏览(11)
  • pnp单目相机标定测距

    参考:opencv 单目相机pnp测距(Cpp)-CSDN博客

    2024年02月08日
    浏览(10)
  • 单目相机的标定(matlab)

    单目相机的标定(matlab)

                     从世界坐标系变换到中心在相机光学中心的坐标系统,其变换参数称为相机的外部参数,也叫相机的位姿(位置和姿态)。从相机坐标系统变换到计算机图像坐标系统的变换参数称为相机内参,即相机的自身参数。         相机外参需要标定的参

    2024年02月08日
    浏览(6)
  • 基于Matlab的双目相机标定

    基于Matlab的双目相机标定

    第一步,打开matlab 输入stereoCameraCalibrator ,进入工具箱  第二步:点击add images 第三步:添加图片路径,并且修改尺寸(根据格子边长) 工具箱会弹窗告诉你一共识别到多少组照片,多少组可以用,多少组被工具箱拒绝了。 我这里一共20张图片,都可以  第四步:点击 运行完

    2024年02月04日
    浏览(11)
  • 普通单目相机标定——准备工作

    普通单目相机标定——准备工作

            这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。         已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。 1)

    2024年02月15日
    浏览(7)
  • 【双目相机】基于matlab的参数标定2-使用matlab标定

    【双目相机】基于matlab的参数标定2-使用matlab标定

    使用双目相机拍照并分割图片: 【双目相机】基于matlab的参数标定1-使用双目相机拍照 照片拍摄好后,进入matlab标定工具箱,如下图所示。可以使用matlab2020a版本。 进入工具箱以后,选择Add Images。 选择左右相机照片的路径,Size of checkerboard square为棋盘中每一个方格的长度,

    2024年02月15日
    浏览(9)
  • 白学立体视觉(3): 单目相机标定

    白学立体视觉(3): 单目相机标定

    小伙伴们,第一个理论加实践的小结来啦。本小节将会在白学立体视觉(2): 相机内外参数与坐标系的基础上,介绍一下鼎鼎有名的张正友标定法。 我们如果想重建出一台相机的成像过程的数学模型,相机的参数是最基本的。相机参数又分为内参和外参。那么内参和外参就是

    2024年02月06日
    浏览(9)
  • Python OpenCV 单目相机标定、坐标转换相关代码(包括鱼眼相机)

    Python OpenCV 单目相机标定、坐标转换相关代码(包括鱼眼相机)

      本文不讲原理,只关注代码,有很多博客是讲原理的,但是代码最多到畸变矫正就结束了,实际上就是到 OpenCV 官方示例涉及的部分。   在官方示例中使用黑白棋盘格求解了相机的内外参和畸变系数,并对图像做了畸变矫正,但在实际使用时还缺少很多功能,以下是本

    2024年02月02日
    浏览(13)
  • 基于OpenCV的单目相机标定与三维定位

    基于OpenCV的单目相机标定与三维定位

           相机是产生图像数据的硬件,广泛应用于消费电子、汽车、安防等领域。围绕着相机衍生出一系列的研究与应用领域,包括传统的图像处理和基于深度学习的智能应用等。目前大火的自动驾驶中相机也是重要的硬件组成,如环视用鱼眼相机,adas用周视相机。    

    2024年02月09日
    浏览(12)
  • 使用opencv做双目测距(相机标定+立体匹配+测距)

    使用opencv做双目测距(相机标定+立体匹配+测距)

    最近在做双目测距,觉得有必要记录点东西,所以我的第一篇博客就这么诞生啦~ 双目测距属于立体视觉这一块,我觉得应该有很多人踩过这个坑了,但网上的资料依旧是云里雾里的,要么是理论讲一大堆,最后发现还不知道怎么做,要么就是直接代码一贴,让你懵逼。 所以

    2024年01月20日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包