【C++】相机标定源码笔记-相机内参标定类

news2024/11/18 16:48:49

相机内参标定类

该代码是一个关于摄像头内参处理类的实现。它主要做了以下几件事情:

        1. 提供读取和保存相机内参的功能。

        2. 允许用户设置一系列参数(如图像尺寸、棋盘格尺寸等)。

        3. 支持从图像中检测棋盘格角点,并根据检测到的角点及其他参数计算相机位姿。

        4. 提供误差计算和图像去畸变功能。

主要功能包括:

        读取和写入相机内参文件(.yml格式),包括相机矩阵、畸变系数等。

        设置参数,包含文件名、图像大小、标定图案信息、是否为圆形图案、是否使用鱼眼模型、是否使用复

        杂的相机模型等,以预备进行校准作业。

        提供参数的打印功能,便于调试。

        从输入图像中检测棋盘格角点,支持圆形和非圆形棋盘格的检测,并根据检测结果对角点进行处理。

        根据检测到的角点进行相机位姿估计(PNP问题)。

        根据校准得到的参数进行图像的去畸变处理。

        计算位姿估计后的重投影误差,以评估校准质量。

        支持在符合条件的情况下对高重投影误差的数据进行剔除,从而改善校准结果。

总之,这段代码实现了相机内参的读取、保存、设置、位姿估计、去畸变和误差计算等功能,是进行相机校准和图像预处理的重要工具。

公有变量:图像尺寸、棋盘格物理坐标、棋盘格图像角点、内参矩阵、鱼眼相机畸变系数、普通相机畸变系数、棋盘格角点检测结果、是否使用鱼眼相机模型

私有变量:是否使用复杂相机模型、是否已加载标定文件、标定图像文件名列表、角点布局尺寸、角点ROI尺寸、角点之间物理距离、是否使用圆点标定板。标定过程中使用的最大重投影误差、计算得到的重投影误差。

成员函数:默认构造函数、使用内参文件名进行构造、析构函数、从文件中读取相机内参、将相机内参保存到文件、设置计算最大重投影误差、设置用于内参标定的参数、输出所有相机内参和标定结果、计算某张图像的棋盘格外参、执行内参计算对每张标定图像提取角点、判断相机是否已经标定、根据内参对输入的图像进行畸变矫正、根据内参对输入的像素点进行畸变矫正、获取角点布局尺寸、获取角点ROI尺寸、获取角点物理距离。获取图像中的棋盘格角点保存至成员变量。

----------------------------------

默认构造函数: 初始化复杂相机模型为假,初始化最大投影误差,初始化内参载入状态为假,初始化角点ROI大小为5x5

带参构造函数(参数为内参文件路径):初始化角点ROI大小为5X5,初始化复杂相机模型为假,初始化最大投影误差,根据提供的路径读取相机内参。

读取相机内参:获取文件名后缀,确保为.yml。打开.yml文件,如果没打开输出提示返回false。从文件中读取各种内参,如果是鱼眼相机读取鱼眼畸变系数,否则读取普通畸变系数。最后关闭文件。输出提示,设置内参载入状态为真。返回true。

保存相机内参:检查文件名后缀是否为.yml,若不是输出提示返回false。创建写入的.yml文件,将各种内参写入文件,如果是鱼眼相机,写入鱼眼畸变系数,否则写入普通畸变系数。全部写完最后关闭文件。返回true。

设置内参相关参数,注意,这里设置的参数由外部调用者给出:设置是否使用复杂相机模型,清空已有的文件名列表,清空检测结果,清空图像上的校准点,清空世界坐标系中的校准点,设置文件名列表,设置图像尺寸,设置棋盘格尺寸,设置棋盘格大小,设置是否为圆形标志,设置是否用鱼眼相机。

打印所有参数到控制台,用于调试:打印图像尺寸、打印相机矩阵、打印鱼眼相机畸变系数、打印普通相机畸变系数、打印是否使用复杂的相机模型、打印是否加载了相机内参、打印角点布局尺寸、打印两角点之间的物理距离、打印是否使用圆点标定板、打印是否使用鱼眼相机模型、打印最大允许的重投影误差、打印重投影误差。

检测棋盘格角点的方法实现:结果标志位置为false,定义存储找到的角点向量,如果使用的是圆点检测{ 如果没有找到圆点网格,结果置为false并加入角点检测是否成功向量,返回false; 如果找到了圆点网格,绘制找到的角点,标记结果为真并保存到角点检测是否成功向量,保存角点到棋盘格角点向量,返回成功}。如果使用的是棋盘格检测{ 如果没有找到棋盘格角点,标记结果为假并保存到检测结果向量,如果找到了棋盘格角点,转换为灰度图,精细化角点,保存角点到棋盘格角点向量,绘制找到的角点,输出矫正成功信息,返回成功} 。如果检测到了角点且需要可视化,反转灰度图的颜色,显示灰度图,等待100ms,以便视图更新。

10aef182d331fe2c92325f2d321c0d38.png

获取棋盘格相对于相机的位姿: 存放灰度图,获取棋盘格角点,{如果没有成功获取角点,移除检测结果的最后一个元素,适配vector大小,返回失败}。删除掉刚刚添加的检测结果,适配vector大小,获取最后一组角点向量,定义存储校正后的角点向量,移除最后一组角点,适配vector大小,定义世界坐标系的点,生成棋盘格每个角点在世界坐标系中的坐标,定义旋转向量和平移向量,如果是鱼眼相机,对角点进行畸变校正,定义畸变系数全为0,求解外参,如果不是鱼眼相机,直接先求解外参R T的三维向量。定义重投影点向量,对于普通相机和鱼眼相机分别计算重投影点,计算重投影点与检测的角点之间误差,处于角点数得到角点平均误差,打印重投影误差。定义旋转矩阵,将外参r矢量转换为旋转矩阵(Rodrigues变换),输出4X4位姿矩阵。返回true。

3d7f97cf868769bccf477074c718462b.png

cbb9b7f524a4d2c772fcfbbce7da32d6.png

进行相机内参和畸变系数的计算:清空之前的检测结果向量,清空图像点向量,清空世界点向量,根据图像宽度调整角点搜索区域ROI的大小{ 如果图像宽度大于等于1280,设置ROI为11x11, 如果图像宽度小于等于640,设置ROI为5X5,对于中间范围的宽度,设置ROI为7X7. } 。获取待处理的图片数量,遍历所有图片,获取图片文件名,读取图片,定义灰度图,调用之前的函数获取棋盘格角点。 根据检测到的角点数量,生成对应的世界坐标系中的点, 定义存储角度信息的向量,计算检测到的棋盘格角点的角度,标记矫正是否成功为false,while循环当有足够的图像点并且尚未成功矫正时{ 定义旋转向量、平移向量,矫正映射x,y . 如果是鱼眼相机,则使用相应的calibrate和initUndistortRectifyMap方法,设置矫正标志位,包括:重新计算外参、检查输出数据的合理性以及矫正鱼眼相机镜头原有的倾斜,生成矫正映射。如果不是鱼眼相机:定义迭代终止条件,标志位0,如果选择更复杂的相机模型,设置标志(理想模型-两种径向畸变和两种切向畸变 | 相机的图像平面不再和理想的图像平面重合 | 薄棱镜畸变模型 ) 通过cv::calibrateCamera()函数获取校准相机的结果返回后打印总的重投影误差。} 。初始化单个误差、初始化平均误差、初始化总误差,存储重投影的点、存储每张图片的重投影误差,遍历所有棋盘格图片,计算每张图片的重投影误差{ 获取当前图片的世界坐标系中的点,根据是否是鱼眼相机选择不同的投影方式,将重投影的点与实际检测到的图像点进行比较,计算重投影误差,保存当前图片的误差,计算平均误差,累加到总误差 }。计算所有图片的平均重投影误差,如果平均重投影误差小于等于允许的最大误差 标记校正成功。如果平均重投影误差超过允许的最大误差,标记是否基于重投影误差进行筛选,初始化最大误差的位置为-1,如果基于重投影误差进行筛选,找到最大误差的位置,计算最大误差的索引,移除最大误差。 根据误差筛选结果,删除相应的数据,并尝试重新进行校正:删除最大误差对应的世界坐标,删除最大误差对应的图像坐标,更新检测结果。将最大误差对应的检测结果置为失败。打印使用的棋盘格图片数量。返回成功。

df376f757fdfc494ba7e095d89b39a17.png

对输入的图像进行畸变矫正: 判断是否为鱼眼相机,如果是,创建爱你单位矩阵用于初始化,获取图像大小,创建存储X坐标映射的矩阵,创建存储Y坐标映射的矩阵,初始化畸变校正映射,使用映射关系进行畸变校正:对输入图像进行畸变校正,结果输出到output。  如果不是鱼眼相机,直接使用直接使用OpenCV提供的undistort函数进行畸变校正。

对输入的像素点进行畸变校正: 鱼眼相机cv::fisheye::undistortPoints  普通相机undistortPoints。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1864034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每台电脑的ip地址是随机改动的吗

在数字化快速发展的今天,互联网已成为我们生活和工作的重要组成部分。当我们使用电脑上网时,IP地址作为电脑在网络中的唯一标识,起到了至关重要的作用。然而,很多人对于IP地址的分配和变化存在疑问,尤其是关于每台电脑…

上涨至13.6分!当之无愧的顶级期刊,影响因子“狂飙”,门槛较低,2个月可录!

本期解析 1、2024年6月20日,科睿唯安正式公布2024年度《期刊引证报告》。 2、本次主要解析Elsevier旗下一本TOP顶刊,期刊表现优秀,在最新的影响因子更新中由12.8上涨至13.6,是一本妥妥评职高分宝刊!接下来看看它是否…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中,我们通过系统思考仿真演练深入探索决策背后的动因。例如,我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”,这些都是麻省理工MBA学生的必修课。此外,还有更简洁的“红黑游戏”“收获季节”等模拟…

04 Shell编程之正则表达式与文本处理器

1、正则表达式 1.1 正则表达式的定义 正则表达式又称为正规表达式、常规表达式。 正则表达式是使用单个字符来描述、匹配一系列符合某个句法规则的字符串, 简单来说,正则表达式就是一种匹配字符串的方法(通过一些特殊符号,实现…

vant4好玩的新组件

1.Barrage 弹幕 模拟视频弹幕 设置 auto-play 为 false 属性后&#xff0c;需要使用 play() 进行弹幕播放&#xff0c;暂停可以使用 pause() 实现。<van-barrage v-model"list" ref"barrage" :auto-play"false"><div class"video&…

PostgreSQL使用教程

安装 PostgreSQL 您可以从 PostgreSQL 官方网站下载适合您操作系统的安装程序&#xff0c;并按照安装向导进行安装。 启动数据库服务器 安装完成后&#xff0c;根据您的操作系统&#xff0c;通过相应的方式启动数据库服务器。 连接到数据库 可以使用命令行工具&#xff08;如 p…

Spring Cloud Netflix:构建强大微服务生态系统的利器

Spring Cloud Netflix是一组集成框架&#xff0c;它将Netflix的多个开源组件整合到Spring Boot应用程序中&#xff0c;使得构建云原生应用程序变得更加简单。这些组件包括用于服务发现和注册的Eureka&#xff0c;断路器模式的实现Hystrix&#xff0c;用于API网关的Zuul&#xf…

项目管理:如何解决项目延期的那些问题?

在项目管理中&#xff0c;项目延期是一种普遍现象&#xff0c;也管理者最为头疼的一个问题。为了有效地解决项目延期问题&#xff0c;我们需要从多个方面入手&#xff1a; 1、快速识别原因&#xff1a;当项目出现延期迹象时&#xff0c;首要任务是迅速识别并定位导致延期的根…

kettle创建资源库无法登录问题

问题&#xff1a;You dont seem to be getting a connection to the server. Please check the path youre using and make sure the server is up and running. 1. 删除资源库 2.删除数据库中R_开头的表 3.重新创建资源库连接&#xff0c;查看是否成功产生表 4.创建成功&…

[windows] 无拓展名文件设置默认打开方式为记事本

前言 本文是对[windows] 无拓展名文件设置默认打开方式_给无后缀文件添加打开方式选项-CSDN博客 的细节上的补充&#xff0c;对小白更友好。建议对照引用的博客观看。 管理员状态运行cmd 右键左下角开始位置&#xff0c;出现 左键点击打开终端管理员。 进去后直接输入cmd即…

考研选学硕还是专硕?综合考虑哪个更难?

看录取分数&#xff0c;哪个相对容易一些考哪一个。如果未来对读博有想法的话&#xff0c;学硕可能更适合一些。大部分学校的学硕分数还是要高一些的&#xff0c;对于想要上岸一定要抓住数学和专业课。 24数学总体要比23年难不少&#xff0c;主要难在计算量大&#xff0c;尤其…

大模型AI技术实现语言规范练习

人工智能技术可以为语言规范练习提供多种有效的解决方案&#xff0c;帮助学习者更有效地掌握语言规范。以下是一些常见的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 智能纠错 利用自然语言处理技术&#xff0c;可以…

如何为软件工程优化ChatGPT和其他大模型

自ChatGPT发布以来&#xff0c;上至企业、下到软件工程师都在致力于寻找如何通过使用大语言模型&#xff08;LLM&#xff09;&#xff0c;来提高工作效率的方法。虽然大多数LLM都能够为复杂的问题生成代码示例&#xff0c;但是具体如何将其集成到软件开发环境的过程&#xff0c…

2024-6-26 石群电路-30

2024-6-26&#xff0c;星期三&#xff0c;10:38&#xff0c;天气&#xff1a;雨&#xff0c;心情&#xff1a;晴。今天没有什么事情发生&#xff0c;继续学习&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 今日观看了石群老师电路课程的视频…

有两个长方柱,其高、宽、长分别为12,20,25;10,14,20。求它们的体积。编写一个基于对象的程序,在类中用带参数的构造函数对数据成员初始化

在上一篇文章中的构造函数不带参数&#xff0c;在函数体中对数据成员赋初值。这种方式使该类的每一个对象的数据成员都得到同一组初值&#xff08;例中各个对象的数据成员的初值均为0)。但有时用户希望对不同的对象赋予不同的初值&#xff0c;这时就无法使用上面的办法来解决了…

数字化工厂生产管理看板系统如何优化生产流程

在当今高度数字化的时代&#xff0c;制造业正经历着深刻的变革&#xff0c;数字化工厂生产管理看板系统作为一种创新的工具&#xff0c;正在为优化生产流程发挥着关键作用。 数字化工厂生产管理看板系统是一个集数据采集、分析、展示和决策支持于一体的综合性平台。生产管理看板…

第 7 章: 对象关系映射

在第 6 章中&#xff0c;我们大概了解了如何通过 JDBC 来进行简单的数据库操作。通过 SQL 来执行操作虽然不算复杂&#xff0c;但在面向对象的语言中&#xff0c;这类操作多少显得有些格格不入&#xff0c;毕竟我们都是在与“对象”打交道。把对象与关系型数据库关联起来&#…

手机定位技术全解析:原理、发展与应用

1. 引言 背景介绍 最近&#xff0c;神仙姐姐刘亦菲主演的电视剧《玫瑰的故事》中的一段情节引发了广泛讨论。剧中&#xff0c;方协文&#xff08;丈夫&#xff09;对玫瑰&#xff08;妻子&#xff09;的控制欲变本加厉&#xff0c;竟然偷偷在她的手机上安装监控软件&#xff…

软考《信息系统运行管理员》-1.1信息系统概述

1.1信息系统概述 信息的含义 信息是人们关心的事情的消息或知识 信息的分类 按产生信息的客体性质分&#xff1a; 自然信息&#xff1a;声、光、热、电等生物信息&#xff1a;遗传信息&#xff0c;生物体内、生物种群内的信息交流机器信息&#xff1a;自动控制系统社会信息…

一文详解:生产计划和排产管理怎么做?

通过阅读本文&#xff0c;你可以了解以下内容&#xff1a;1、生产计划的制定&#xff1b;2、排产的策略和方法&#xff1b;3、生产计划和排产管理实施&#xff1b;4、生产计划和排产管理的效果评估。 一、生产计划制定 生产计划的本质就是协调企业一切资源“低成本、高质量”…