相机内外参标定

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

1.畸变产生原因

相机畸变主要有径向畸变和切向畸变。

1.1 径向畸变

由于相机透镜的固有特性(凸透镜汇聚光线,凹透镜发散光线)导致成像时直线会变成曲线,所以径向畸变产生原因主要是透镜的几何形状改变了直线的形状。

径向畸变主要包括:桶形畸变(barrel distortion)、枕形畸变(pincushion distortion)、八字胡畸变(mustache distortion)
相机内外参标定,计算机视觉,opencv,计算机视觉,c++
径向畸变矫正
径向畸变模型可以以下低阶多项式模型来表示:
x u n d i s t = x d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y u n d i s t = y d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) 其中 r 2 = x d i s t 2 + y d i s t 2 , ( x d i s t , y d i s t ) 是归一后的相机坐标系的点,即坐标原点已移到主点,并且像素坐标除以焦距。 x d i s t = X Z = u − u 0 f x , y d i s t = Y Z = v − v 0 f y x_{undist}=x_{dist}(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ y_{undist}=y_{dist}(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ 其中r^2=x_{dist}^2 + y_{dist}^2,(x_{dist},y_{dist})是归一后的相机坐标系的点,即坐标原点已移到主点,并且像素坐标除以焦距。\\ x_{dist}=\frac{X}{Z}=\frac{u-u_0}{f_x},y_{dist} = \frac{Y}{Z} = \frac{v-v_0}{f_y} xundist=xdist(1+k1r2+k2r4+k3r6)yundist=ydist(1+k1r2+k2r4+k3r6)其中r2=xdist2+ydist2,(xdist,ydist)是归一后的相机坐标系的点,即坐标原点已移到主点,并且像素坐标除以焦距。xdist=ZX=fxuu0,ydist=ZY=fyvv0
其中 k 1 、 k 2 、 k 3 k_1、k_2、k_3 k1k2k3是径向畸变参数

1.2 切向畸变

切向畸变由相机senser与透镜不平行导致。
相机内外参标定,计算机视觉,opencv,计算机视觉,c++
切向畸变矫正
切向畸变模型可以用以下低阶多项式模型来表示:
x u n d i s t = x d i s t + [ 2 p 1 x d i s t y d i s t + p 2 ( r 2 + 2 x d i s t 2 ) ] y u n d i s t = y d i s t + [ p 1 ( r 2 + 2 y d i s t 2 ) + 2 p 2 x d i s t y d i s t ] x_{undist} = x_{dist} + [2p_1x_{dist}y_{dist} + p2(r^2 + 2x_{dist}^2)]\\ y_{undist} = y_{dist} + [p_1(r^2 + 2y_{dist}^2) + 2p_2x_{dist}y_{dist}] xundist=xdist+[2p1xdistydist+p2(r2+2xdist2)]yundist=ydist+[p1(r2+2ydist2)+2p2xdistydist]
p 1 、 p 2 为切向畸变参数 p_1、p_2为切向畸变参数 p1p2为切向畸变参数

1.3 总畸变矫正

同时考虑径向畸变和切向畸变:
x u n d i s t = x d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 p 1 x d i s t y d i s t + p 2 ( r 2 + 2 x d i s t 2 ) ] y u n d i s t = y d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ p 1 ( r 2 + 2 y d i s t 2 ) + 2 p 2 x d i s t y d i s t ] x_{undist} = x_{dist}(1 + k_1r^2 + k_2r^4 + k_3r^6) + [2p_1x_{dist}y_{dist} + p_2(r^2 + 2x_{dist}^2)]\\ y_{undist} = y_{dist}(1 + k_1r^2 + k_2r^4 + k_3r^6) + [p_1(r^2 + 2y_{dist}^2) + 2p_2x_{dist}y_{dist}] xundist=xdist(1+k1r2+k2r4+k3r6)+[2p1xdistydist+p2(r2+2xdist2)]yundist=ydist(1+k1r2+k2r4+k3r6)+[p1(r2+2ydist2)+2p2xdistydist]
共有 5 个畸变参数 k 1 、 k 2 、 k 3 、 p 1 、 p 2 ,这 5 个畸变参数与内参矩阵一起,都是需要进行相机标定。 共有5个畸变参数k_1、k_2、k_3、p_1、p_2,这5个畸变参数与内参矩阵一起,都是需要进行相机标定。 共有5个畸变参数k1k2k3p1p2,这5个畸变参数与内参矩阵一起,都是需要进行相机标定。
以上畸变方程由Brown在《Close-Range Camera Calibration》一文中所提出。

2.算法实现

2.1 标定流程

1)在相机视野范围内放置棋盘格,移动棋盘格并取图像,尽量覆盖整个相机的视野范围,且取图数量不少于10张(取图越多覆盖范围越广,标定结果越准确)

2)遍历每一张图像,重复以下算法步骤:图像二值化(非必须,可加快查找棋盘格角点算法处理速度)、查找棋盘格角点、亚像素精确化、记录角点像素坐标和角点世界坐标(角点0的世界坐标为零点,角点1的世界坐标为零点+实际棋盘格物理距离)

3)调用opencv处理计算相机内参和畸变系数计算函数,得出结果文章来源地址https://www.toymoban.com/news/detail-782752.html

2.2 标定代码

    bool success = false;
    try {
        //棋盘格行列角点数
        cv::Size patternSize(6, 4);
        // 棋盘格的边长(单位:mm)
        float squareSize = 30.0;
        cv::Size imageSize(5440,3648);

        // 存储棋盘格图像的角点坐标
        std::vector<std::vector<cv::Point2f>> imagePoints;
        // 存储棋盘格的世界坐标
        std::vector<std::vector<cv::Point3f>> objectPoints;

        // 加载棋盘格图像并提取角点
        for (int i = 0; i < m_imgList.size(); i++) {
            // 读取图像
            cv::Mat image = transmitQImage2cvMat(&m_imgList[i]);
            if (image.empty()) {
                QMessageBox::warning(Q_NULLPTR, tr("Warn"), tr("image index %1 transmitQImage2cvMat fail").arg(i));
                continue;
            }

            cv::Mat binary;
            cv::threshold(image, binary, 75, 255, cv::THRESH_BINARY);
            // 寻找角点
            std::vector<cv::Point2f> corners;
            bool found = cv::findChessboardCorners(binary, patternSize, corners);
            if (found) {
                // 亚像素精确化,使角点更准确
                cv::Mat gray;
                cv::cvtColor(binary, gray, cv::COLOR_BGR2GRAY);
                cv::cornerSubPix(gray, corners, cv::Size(11, 11), cv::Size(-1, -1),
                                 cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.1));

                // 添加角点坐标和世界坐标
                imagePoints.push_back(corners);
                std::vector<cv::Point3f> objectCorners;
                for (int y = 0; y < patternSize.height; y++) {
                    for (int x = 0; x < patternSize.width; x++) {
                        objectCorners.push_back(cv::Point3f(x * squareSize, y * squareSize, 0));
                    }
                }
                objectPoints.push_back(objectCorners);
            } else {
                QString err = tr("iamge index %1 find corners fail").arg(i);
                qWarning() << err;
                QMessageBox::warning(Q_NULLPTR, tr("Warn"), err);
            }
        }

        // 相机内参矩阵和畸变系数
        cv::Mat cameraMatrix, distCoeffs;
        std::vector<cv::Mat> rvecs, tvecs;
        double rms = cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs);

        // 打印标定结果
        qDebug() << "(cameraMatrix):";
        qDebug() << "[" <<cameraMatrix.at<double>(0,0) << "  " << cameraMatrix.at<double>(0,1) << "  " << cameraMatrix.at<double>(0,2);
        qDebug() << cameraMatrix.at<double>(1,0) << "  " << cameraMatrix.at<double>(1,1) << "  " << cameraMatrix.at<double>(1,2);
        qDebug() << cameraMatrix.at<double>(2,0) << "  " << cameraMatrix.at<double>(2,1) << "  " << cameraMatrix.at<double>(2,2) << "]";
        qDebug() << "(distCoeffs):";
        qDebug() << "[" << distCoeffs.at<double>(0,0) << distCoeffs.at<double>(0,1) << distCoeffs.at<double>(0,2)
                 << distCoeffs.at<double>(0,3) << distCoeffs.at<double>(0,4) << "]";
    }
	catch(const cv::Exception& e) {
        qWarning() << QString::fromStdString(e.what());
    }

2.3 使用标定结果

//其中,undist为原图,dist为去畸变后的结果,m_cameraMatrix为上述标定结果的内参矩阵,m_distCoeffs为上述标定结果的畸变矫正矩阵
//注意,dist必须初始化内存跟undist内存大小一致,否则函数调用会失败
cv::Mat undist = take_image_from_camera();
cv::Mat dist = undist.clone();
cv::undistort(undist, dist, m_cameraMatrix, m_distCoeffs);

到了这里,关于相机内外参标定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机视觉之三维重建(二)(摄像机标定)

    标定示意图 标定目标 P ′ = M P w = K [ R   T ] P w P^{\\\'}=MP_w=K[R space T]P_w P ′ = M P w ​ = K [ R   T ] P w ​ 其中 K K K 为内参数, [ R   T ] [R space T] [ R   T ] 为外参数。该式子需要使用至少六对内外点对进行求解内外参数(11个未知参数)。 其中 R 3 × 3 , T 3 × 1 R_{3 times 3}, T_{3 times

    2024年02月12日
    浏览(47)
  • 【计算机视觉】相机

    我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。 成像原理 想要拍一张相片,直接拿胶片对着景物肯定是不行的,因为物体的每一点发出的光线都会到达胶片上的每一点,从而导致胶片上的影像非常模糊,甚至什么都看不出来。因此,我们想建立景

    2024年02月08日
    浏览(40)
  • 计算机视觉的相机选型

    #你一般什么时候会用到GPT?# 目前市面上的工业相机大多是基于CCD(ChargeCoupled Device)或CMOS(Complementary Metal Oxide Semiconductor)芯片的相机。一般CCD制造工艺更加复杂,也会更贵一点! 1、CCD工业相机主要应用在运动物体的图像提取,不过因为CMOS相机的成本低,所以应用也比较广

    2024年02月08日
    浏览(46)
  • 计算机视觉基础(7)——相机基础

    从这一节开始,我们来学习 几何视觉 。中层视觉包括 相机模型、单目几何视觉、对极几何视觉和多目立体视觉等 。在学习几何视觉最开始,我们先来学习一下 相机模型 ,了解相机的基本原理,了解相机如何记录影像。 相机用于生成 二维的图像 ,图像最小的单元被称为

    2024年02月04日
    浏览(48)
  • 计算机视觉:多相机硬件同步拍摄

    目前主要有两种方法来同步不同传感器的信息(帧、IMU数据包、ToF等): 硬件同步(基于硬件信号触发,同步精度较高,需要硬件支持) 软件同步(基于时间戳或序列号同步,同步精度较低,无需硬件支持) 此博客重点介绍硬件同步,它允许在多个相机传感器之间精确同步

    2024年02月13日
    浏览(37)
  • 【计算机视觉】相机基本知识(还在更新)

    面阵相机则主要采用的 连续的、面状扫描光线 来实现产品的检测; 线阵相机即利用 单束扫描光 来进行物体扫描的工作的。 (1)面阵CCD工业相机: 优点 :应用面较广,如面积、形状、尺寸、位置,甚至温度等的测量。面阵CCD的优点是可以获取测量图像直观,二维图像信息

    2024年02月12日
    浏览(58)
  • 计算机视觉:OAK多相机硬件同步拍摄

    目前主要有两种方法来同步不同传感器的信息(帧、IMU数据包、ToF等): 硬件同步(基于硬件信号触发,同步精度较高,需要硬件支持) 软件同步(基于时间戳或序列号同步,同步精度较低,无需硬件支持) 此博客重点介绍硬件同步,它允许在多个相机传感器之间精确同步

    2024年02月09日
    浏览(40)
  • 【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

    在当今技术日益进步的时代,计算机视觉已成为我们生活中不可或缺的一部分。从智能监控到虚拟现实,计算机视觉技术的应用范围日益广泛。在这篇博客中,我们将探索一个特别实用的计算机视觉案例:使用OpenCV实现摄像头测距。这一技术不仅对专业人士有用,也为编程爱

    2024年02月04日
    浏览(45)
  • 计算机视觉算法中的 相机姿态估计(Camera Pose Estimation)

    目录 ​编辑引言 相机姿态估计的基本概念 相机姿态估计的方法 特征点匹配 直接法 基于深度学习的方法 相机姿态估计的应用 增强现实(AR) 机器人导航 三维重建 结论 相机姿态估计是计算机视觉领域的重要任务之一。它涉及到确定相机在三维空间中的位置和朝向,常用于

    2024年02月05日
    浏览(49)
  • 计算机视觉中的三维重建:基于激光雷达与相机的方法

    作者:禅与计算机程序设计艺术 近年来,随着激光雷达、相机等传感器的广泛应用,三维重建技术逐渐成为热门研究方向。三维重建技术可以从多种角度帮助我们理解世界,并进行精准定位、建筑物三维模型化、环境规划、自然现象研究以及各种各样的应用。 但由于三维重

    2024年03月22日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包