【C++】相机标定源码笔记- 标定工具库测试

标定工具库测试

一、计算相机内参:对两个相机进行内参标定,并将标定结果保存到指定的文件中

6e8dc4c6de2ff63b5f918c16dc56a9a8.png

采集图像:相机1-16张  相机2-17张

定义保存相机1/2内参的文件(.yml)路径。
定义相机1/2采集的图片文件夹路径。


定义相机1/2存储文件名的向量


获取文件夹中所有的文件名(存入向量)。


定义需要筛选的文件后缀。
筛选文件名1/2向量中以指定后缀结尾的文件名。


定义相机内参对象1/2。


定义图像尺寸,定义标定板尺寸,定义标定板格子的实际尺寸。


定义标定参数:是否圆点标定板、是否鱼眼相机、是否复杂相机模型。
设置第一个相机的标定参数,计算第一个相机的内参,保存第一个相机的内参。
设置第2个相机的标定参数,计算第2个相机的内参,保存第2个相机的内参。

相机1内参文件

e8b2cf36caf7f081701db7c70b2103ea.png

2. 对立体相机(左右相机)进行标定,并将标定结果保存到指定的文件中

定义立体标定对象
定义左右相机的内参对象
定义保存左右相机内参和立体相机模型的文件路径


定义标定图片文件夹路径


定义存储文件名的向量(左右相机图片文件名向量、所有文件名向量)
获取文件夹中的所有文件名
定义做相机和有相机图片文件名前缀
定义标定参数(是否圆点标定板、是否鱼眼相机、是否复杂相机模型)
从所有文件名向量中筛选出左右相机的图片文件名向量


定义图像尺寸


定义标定板的尺寸
定义标定格子的实际尺寸


为了获取角点信息必须重新标定左/右相机:做相机内参对象-设置重投影误差、设置参数、执行计算、保存参数。


设置立体相机的左右相机
打印左右相机所有参数


计算立体标定
保存立体相机模型

3db1bdb9354b8d71a1f15b1306337241.png

3. 对立体相机拍摄的左右相机图像进行立体矫正,并将矫正后的图像保存到指定的文件夹中

定义保存左右相机内参和立体相机模型的文件路径
定义所有测试图片文件夹和校正后图片保存文件夹路径
创建矫正后图片保存文件夹
定义存储文件名的向量(测试图片文件名向量,所有相机图片向量)
定义左右相机图片文件名前缀


获取所有测试图片文件名向量
获取左右相机图片文件名向量
根据保存的内参路径和立体模型路径初始化立体标定对象
遍历左右相机图片文件名,进行矫正
{ 
  定义校正后的左右相机图像Mat
  定义临时左右相机图像Mat
  读取左右相机图像
  对左右相机图像进行矫正,第五个参数会否剪裁图像
  定义路径解析变量
  解析左相机文件路径,生成矫正后的文件名
  解析有相机文件路径,生成矫正后的文件名
  保存矫正后的左右相机图像
}

6601d23259c3f5ca9fd720d9b8f2e75b.png

4. 进行RGB和ToF相机的标定,并利用标定结果生成彩色点云

所有图像文件名向量(存储红外图像文件名的向量、存储RGB图像文件名的向量、
                  存储点云数据文件名向量、存储深度图像文件名向量)
循环遍历27个文件夹(每个文件夹下包括四个图像)
{
  使用字符串流构建文件夹路径
  构建第i个文件夹路径
  存储第i个文件夹中文件名的向量
  获取第i个文件夹下所有文件名
  
  (是否找到)红外图像标志位、RGB图像标志位、点云数据标志位、深度图像标志位
  
  当前红外图像文件名、当前RGB图像文件名、当前点云数据文件名、当前深度图像文件名
  
  遍历当前文件夹下所有文件
  {
    如果所有类型的图像都已找到,则退出循环
    根据文件名中的特定字符串识别不同类型的图像,并更新标志位和文件名
  }
  如果在当前文件夹中找到了所有类型的图像,则将文件名添加到对应向量中
}
输出各类型图像文件的数量


开始标定
创建一个RGBTOF校准类图像
定义标定参数文件的路径
尝试加载标定参数,如果失败则执行以下操作
{
  定义棋盘格的尺寸
  定义棋盘格每个格子的物理尺寸
  设置棋盘格参数
  定义RGB图像的尺寸
  设置RGB相机的参数
  定义ToF图像的尺寸
  设置ToF相机的参数
  执行相机标定
  计算标定结果
  保存标定参数到文件
}


测试集处理
定义测试集文件夹路径
定义存储文件夹中文件名的向量
获取测试集文件夹中的所有文件名
初始化图像标志位
定义当前处理的文件名变量
遍历测试集文件夹中的所有文件
{
  如果所有类型的图像都已找到,则退出循环
  如果还未找到红外图像
  {
    在当前文件名中查找"_ir.png",如果找到则认为是红外图像
    {
      记录红外图像文件名
      更新红外图像标志位
      跳过当前循环,进入下一次循环
    }
  }
  如果还未找到RGB图像
  {
    在当前文件名中查找"_rgb.jpg",如果找到则认为是RGB图像
    {记录RGB图像文件名,更新RGB图像标志位,跳过当前循环,进入下一次循环} 
  }
  如果还未找到点云数据
  {  
    在当前文件名中查找"_points.pcd",如果找到则认为是点云数据
    {记录点云数据文件名,更新点云数据标志位,跳过当前循环,进入下一次循环}
  }
  如果还未找到深度图像
  {
    在当前文件名中查找"_depth.png",如果找到则认为是深度图像
    {记录深度图像文件名,更新深度图像标志位,跳过当前循环,进入下一次循环}
  }
}
如果在测试集文件夹中找到了所有类型的图像,则将文件名添加到对应的向量中
读取RGB图像和深度图像
定义保存点云的文件名
定义输出的点云对象
使用标定对象和读取的图像生成彩色点云,并保存到文件

这个函数的主要功能是进行RGB和ToF相机的标定,并利用标定结果生成彩色点云。首先,函数遍历指定文件夹中的图像,根据文件名中的标识符筛选出IR图像、RGB图像、点云数据和深度图像的文件名,并将这些文件名分别存储。接着,如果无法加载已有的标定参数文件,则重新进行标定操作,包括设置标定板参数、相机参数,并执行标定计算,最后将标定结果保存到文件中。

在完成标定后,函数使用标定结果对测试集中的RGB图像和深度图像进行处理,生成彩色点云,并将点云数据保存为PCD文件。这一过程涉及到图像处理、文件操作、标定计算和点云生成等多个步骤,是RGB和ToF相机标定及其应用的一个完整示例。

5. 将点云标定到地面

定义点云文件名
实例化线点工具类
设置点云文件
定义变换矩阵
获取点云调整到地面的变换矩阵
输出变换矩阵

6. 测试通过点云计算激光线夹角

定义点云文件名
定义点云对象
读取点云文件
定义点云指针和滤波后点云指针
复制点云数据到指针
定义直通滤波器
设置输入点云
设置过滤字段为y轴
设置过滤范围
过滤点云得到滤波后点云


定义角度变量
计算夹角
输出夹角


修改过滤范围,进行第二次滤波和夹角计算,输出夹角

7. 测试平面点云平面度

定义点云文件名
定义点云对象
读取点云文件
定义异常点百分比
定义最大距离和最小距离变量
计算平面度

作者陈晓永:智能装备专业高级职称,软件工程师,机械设计中级职称,机器人与自动化产线仿真动画制作 

The End

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

作为图形渲染API,OpenGL和Direct3D的全方位对比。

当你在网页看到很多美轮美奂的图形效果,3D交互效果,你知道是如何实现的吗?当然是借助图形渲染API了,说起这个不就不得说两大阵营,OpenGL和Direct3D,贝格前端工场在本文对二者做个详细对比。 一、什么是图形…

26.5 Django模板层

1. 模版介绍 在Django中, 模板(Templates)主要用于动态地生成HTML页面. 当需要基于某些数据(如用户信息, 数据库查询结果等)来动态地渲染HTML页面时, 就会使用到模板.以下是模板在Django中使用的几个关键场景: * 1. 动态内容生成: 当需要根据数据库中的数据或其他动态数据来生…

推动能源绿色低碳发展,风机巡检进入国产超高清+AI时代

全球绿色低碳能源数字转型发展正在进入一个重要窗口期。风电作为一种清洁能源,在碳中和过程中扮演重要角色,但风电场运维却是一件十足的“苦差事”。 传统的风机叶片人工巡检方式主要依靠巡检人员利用高倍望远镜检查、高空绕行下降目测检查(蜘蛛人)、叶…

校园水质信息化监管系统——水质监管物联网系统

随着物联网技术的发展越来越成熟,它不断地与人们的日常生活和工作深入融合,推动着社会的进步。其中物联网系统集成在高校实践课程中可以应用到许多项目,如环境气象检测、花卉种植信息化监管、水质信息化监管、校园设施物联网信息化改造、停车…

Qt6 qcustomplot在图表上画一条直线

完整代码如下: 主要注意的是Qt中的QHBoxLayout等Qt类对象在被引用的情况下是可以使用局部变量的,典型的如setLayout这类型的函数接口,都可以使用局部变量,而不是new对象。 另外一点就是qcustomplot中的replot就相当于Qt中的update,由于qcustomplot是属于绘图类的接口库,…

如何用Python向PPT中批量插入图片

办公自动化办公中,Python最大的优势是可以批量操作,省去了用户粘贴、复制、插入等繁琐的操作。经常做PPT的朋友都知道,把图片插入到PPT当中的固定位置是一个非常繁琐的操作,往往调整图片时耗费大量的时间和精力。如何能省时省力插…

新型200V预稳压器可简化故障容受型电源的设计

讨论几种设计故障容受型电源的方法,其中包括新的预稳压器拓扑结构,该结构可简化电路设计及元件选择。 对抗相位故障 如果交流电源到电表之间出现错误连接故障,或是像空调或电磁炉等采用三相电源工作的大功率负载在两个相位之间的连接错误&a…

微信小程序 canvas 处理图片的缩放移动旋转问题

这里使用到了一个插件&#xff0c;canvas-drag&#xff0c;来实现大部分功能的 上效果 直接上代码吧~ wxml <div class"container"><canvas-drag id"canvas-drag" graph"{{graph}}" width"700" height"750" ena…

[漏洞分析] CVE-2024-6387 OpenSSH核弹核的并不是很弹

文章目录 漏洞简介漏洞原理补丁分析漏洞原理 漏洞利用漏洞利用1: SSH-2.0-OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3 (Debian 3.0r6, from 2005) [无ASLR无NX]漏洞利用原理漏洞利用关键点 漏洞利用2: SSH-2.0-OpenSSH_4.2p1 Debian-7ubuntu3 (Ubuntu 6.06.1, from 2006) [无ASLR…

[C++][设计模式][组合模式]详细讲解

目录 1.动机(Motivation)2.模式定义3.要点总结4.代码感受 1.动机(Motivation) 软件在某些情况下&#xff0c;客户代码过多地依赖于对象容器复杂的内部实现结构&#xff0c;对象容器内部实现结构(而非抽象结构)的变化引起客户代码的频繁变化&#xff0c;带来了代码的维护性、扩…

Hi3861 OpenHarmony嵌入式应用入门--wifi sta

鸿蒙WiFi STA模式相关的API接口文件路径 foundation/communication/interfaces/kits/wifi_lite/wifiservice/wifi_device.h 所使用的API接口有&#xff1a; API 接口说明 WifiErrorCode EnableWifi(void); 开启STA WifiErrorCode DisableWifi(void); 关闭STA int IsWif…

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

大数据期末复习——hadoop、hive等基础知识

一、题型分析 1、Hadoop环境搭建 2、hadoop的三大组件 HDFS&#xff1a;NameNode&#xff0c;DataNode&#xff0c;SecondaryNameNode YARN&#xff1a;ResourceManager&#xff0c;NodeManager &#xff08;Yarn的工作原理&#xff09; MapReduce&#xff1a;Map&#xff0…

点云处理实操 点云平面拟合

目录 一、什么是平拟合 二、拟合步骤 三、数学原理 1、平面拟合 2、PCA过程 四、代码 一、什么是平拟合 平面拟合是指在三维空间中找到一个平面,使其尽可能接近给定的点云。最小二乘法是一种常用的拟合方法,通过最小化误差平方和来找到最优的拟合平面。 二、拟合步骤…

Kafka 为何如此之快?深度解析其背后的秘密

目录 前言 一、生产者 1. 异步发送 2. 多分区并行 3. 消息批量发送 4.支持消息压缩 二、存储端 1. 分区和副本 2. 页缓存 3. 磁盘顺序写入 4. 零拷贝技术 5. 稀疏索引 三、消费端 1. 消费者群组 2. 批量拉取 3. 高效的偏移量管理 4. 并行消费 总结 前言 Kafk…

观测云赋能「阿里云飞天企业版」,打造全方位监控观测解决方案

近日&#xff0c;观测云成功通过了「阿里云飞天企业版」的生态集成认证测试&#xff0c;并荣获阿里云颁发的产品生态集成认证证书。作为监控观测领域的领军者&#xff0c;观测云一直专注于提供统一的数据视角&#xff0c;助力用户构建起全球范围内的端到端全链路可观测服务。此…

SwanLinkOS首批实现与HarmonyOS NEXT互联互通,软通动力子公司鸿湖万联助力鸿蒙生态统一互联

在刚刚落下帷幕的华为开发者大会2024上&#xff0c;伴随全场景智能操作系统HarmonyOS Next的盛大发布&#xff0c;作为基于OpenHarmony的同根同源系统生态&#xff0c;软通动力子公司鸿湖万联全域智能操作系统SwanLinkOS首批实现与HarmonyOS NEXT互联互通&#xff0c;率先攻克基…

Appium adb 获取appActivity

方法一&#xff08;最简单有效的方法&#xff09; 通过cmd命令&#xff0c;前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …

Java中反射的使用

无参构造器 方法的调用 package com.studio;import java.lang.reflect.Method;class User {private String name;/*无参构造器*/public User() {}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic String toString…

PHP景区旅游多商户版微信小程序系统源码

解锁景区新玩法&#xff01;​ 引言&#xff1a;一站式旅行新体验 厌倦了传统景区的单调游览&#xff1f;想要一次旅行就能体验多种风情&#xff1f;那么&#xff0c;“景区旅游多商户版”绝对是你的不二之选&#xff01;这个创新模式将景区内多个商户资源整合&#xff0c;为…