相机和激光雷达的外参标定 - 无标定板版本

1. 实现的效果

通过本软件实现求解相机和LiDAR的外参,即2个传感器之间的三维平移[x, y, z]和三维旋转[roll, pitch, yaw]。完成标定后,可将点云投影到图像,效果图如下:

本软件的优势:(1)无需特制的标定板(2)开箱即用,无需繁琐的开发环境配置(3)标定速度快,只需手工选择6个点对,即可完成标定。

2. 运行前准备

(1)相机内参

可使用opencv或者matlab进行标定;一般相机厂家也会提供,可联系厂家获取。

相机矩阵格式为:

\begin{bmatrix} fx& 0& cx\\ 0& fy& cy\\ 0& 0&1 \end{bmatrix}​ 

镜头畸变格式为:

​ [k1, k2, p1, p2, k3, k4, k5, k6]

k3k4k5k6​这几个参数如果没有,可以不提供。

在本程序中,存在camera_config.json的配置文件,相机内参在里面修改,如下图所示:

{
    "camera_matrix": [ //相机矩阵
        [1189.8516705838,0.0,958.9487412898],
        [0.0,1189.8896522849,538.5150082596],
        [0,0,1]
    ],
    "distortion_coefficients": [ //镜头畸变
        4.2219264042,1.0156623421,9.72633e-05,9.40934e-05,-0.0139758468,4.6602774064,2.6717043123,0.0850373937
    ],
    "tvec":[0,0,0], //初始[x, y, z]平移,单位:米,默认全为0
    "rvec":[0,0,0] //初始[roll, pitch, yaw]旋转,单位:度,默认全为0
}

(2)数据准备

采集多组图像和点云,图像保存为png格式;点云保存为pcd格式注意每组图片和点云的文件名必须完全一致,如下图蓝框和红框所示。另外,camera_config.json文件必须和这些数据在同一个文件夹下,否则程序会出错。

pcd采用ASCII码格式存储,如下图所示,每个点包含[x y z intensity ring timestamp]6个元素,其中,[x y z]是必须有的,其他元素如果没有,用0填充。另外文件头的WIDTH和POINTS均设置为该pcd文件包含的总点数。

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity ring timestamp
SIZE 4 4 4 4 2 8
TYPE F F F F U F
COUNT 1 1 1 1 1 1
WIDTH 144000
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 144000
DATA ascii

(3)数据采集注意事项

标记物要选取角点明显的物体,比如下图中的黄色纸箱子。纸箱子排放尽量做到左右远近,均匀分布。可以一次性排放多个箱子。

标记物除了纸箱子,也可以在淘宝上买指引牌,如下图所示,建议买大一些的。

3. 软件操作

3.1 点击“设置数据路径”按钮,选择数据文件夹

3.2 正常加载点云和图片

 3.3 各区域操作

区域

操作

功能

图像区域

鼠标滚轮

放大/缩小图片

ctrl+鼠标左键

在图像上加点

ctrl+鼠标右键

删除上一个点

鼠标右键

弹出菜单,保存数据或删除上一个点

鼠标中键并移动鼠标

平移图像

点云区域

ctrl+鼠标左键

在点云上加点(必须选中点云,点击空白区域无效)

ctrl+鼠标右键

删除上一个点

鼠标滚轮

放大/缩小

按住鼠标左键并移动

旋转视角

按住鼠标中键并移动

平移视角

↑↓←→按键

旋转视角

- 键

选中点尺寸变小

+ 键

选中点尺寸变大

数据列表区

鼠标左键

切换图片

3.4 在图像中选点

注意点:必须选择明显的角点,如果角点不够,可以如下图所示放纸箱子,然后点击纸箱子的角点,如0和1号。另外也可以选择建筑物的角点,如2号。

3.5 在点云中选点

注意点:点云中的点序号是P0、P1这样的格式,P0对应图像中的0号点,其他依次类推。必须做到图像和点云中的点数量、位置、编号完全对应,否则标定会失败。在点云中可以旋转平移视角,帮助选择到正确位置的点。

3.6 执行标注

注意点:点云和图像中的点对必须大于等于6,才能进行标注;如果当前帧不够6对,切换到下一帧数据,继续选点,所有帧上选择的点对之和超过6即可。

点击“执行标定”,如果一切正常的话,会输出重投影误差,超过10可以认为标定不成功;但小于10也并不能保证标定成功。需要进一步将点云投影到图像上进行检查。

3.7 点云投影到图像

如下图所示,点击“在图像上显示点云”,即可看到可视化。

如果出现下图所示,点云和图像错乱的现象,这个是由于图像和点云的重叠FOV没有设置对,重复下图中1,2两个步骤进行调整。

这里的样例相机水平视角是100°,所以调整到100°左右,如下图所示位置,即可正确显示。

4. 软件下载链接

链接: https://pan.baidu.com/s/1BH_ic4uw4OGDFMVmo9Z4OQ?pwd=uqm7 提取码: uqm7 

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

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

相关文章

Github出现复杂问题 无法合并 分支冲突太多 如何复原

目录 问题再现 解决思路 当然我所指的是在 main 分支开一个新的分支 删除本地文件夹 重新克隆 开一个新分支 切换分支 下载远程分支 文件覆盖 合并到主分支 ​​​​​​​问题再现 太复杂了 无法更改 编译器现状 全部崩溃了 无法更改 即使创建一个新的分支也无济于…

uniapp使用chooseLocation安卓篇

本文章全部以高德地图为例 代码 <view class"bottom"><button click"choose">定位</button> </view> choose() {uni.chooseLocation({success: function(res) {console.log(位置名称&#xff1a; res.name);console.log(详细地…

设计模式-结构型-组合模式

1. 什么是组合模式&#xff1f; 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说&#xff0c;组合模式允…

AI多模态论文解读:LLaVA-CoT:让视觉语言模型逐步推理

本文作者&#xff1a;AIGCmagic社区 猫先生 一、简 介 LLaVA-CoT引入了四个不同的阶段&#xff08;摘要、标题、推理和结论&#xff09;&#xff0c;使模型能够独立进行系统化的多阶段推理&#xff0c;显著提高了在推理密集型任务上的准确性。 编译了LLaVA-CoT-100k数据集&am…

FreeROTS学习 内存管理

内存管理是一个系统基本组成部分&#xff0c;FreeRTOS 中大量使用到了内存管理&#xff0c;比如创建任务、信号量、队列等会自动从堆中申请内存&#xff0c;用户应用层代码也可以 FreeRTOS 提供的内存管理函数来申请和释放内存 FreeRTOS 内存管理简介 FreeRTOS 创建任务、队列…

JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名

项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…

【Uniapp-Vue3】computed计算属性用法及方法对比

如果我们想要将两个响应式变量进行某种运算&#xff0c;就可以使用computed计算属性。 比如下面这个例子中&#xff0c;输入名和姓合成全名&#xff0c;可以用直接显示的方法&#xff1a; 我们也可以使用computed属性&#xff1a; import {computed} from "vue"; le…

【Linux】模拟Shell命令行解释器

一、知识补充 1.1 snprintf snprintf() 是 C语言的一个标准库函数&#xff0c;定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串&#xff0c;并将结果存储在指定的字符数组中。该函数的原型如下&#xff1a; int snprintf(char *str, size_t size, con…

逆向 易九批 最新版 爬虫逆向 x-sign ......

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

LeetCode:108.将有序数组转换为二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;108.将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff…

双因素身份验证技术在NPI区域邮件安全管控上的解决思路

在制造业中&#xff0c;NPI&#xff08;New Product Introduction&#xff0c;新产品导入&#xff09;区域是指专门负责新产品从概念到市场推出全过程的部门或团队。NPI 的目标是确保新产品能够高效、高质量地投入生产&#xff0c;并顺利满足市场需求。在支撑企业持续创新和竞争…

基于 GEE 下载逐年 MODIS 地表温度 LST 数据

目录 1 地表温度&#xff08;LST&#xff09; 2 数据准备 3 代码实现 3.1 加载研究区与数据集 3.2 数据预处理与标准化 3.3 逐年批量导出 3.4 可视化结果 4 运行结果 5 完整代码 1 地表温度&#xff08;LST&#xff09; 在遥感领域&#xff0c;地表温度&#xff08;L…

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法

目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html 通过js代码 标签属性等手段进行一个过滤 不允许出现css的payload 前端过滤 我可以在抓包工具里面修改 抓包工具是不受前端的防御 也 就是浏览器 服务端过滤…

4G、5G移远模块SIM卡热插拔问题解决

4G、5G移远模块SIM卡热插拔问题解决 1、开发环境2、问题阐述3、开启模块热插拔功能4、问题解决5、quectelCM工具(热插拔)6、思路1、开发环境 系统: ubuntu20.04 拨号工具:quectelCM 模块型号:ec20、rm500u 开发平台:RK35XX系列 2、问题阐述 SIM卡热插拔功能已开启,拔掉…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…

GelSight Mini视触觉传感器凝胶触头升级:增加40%耐用性,拓展机器人与触觉AI 应用边界

马萨诸塞州沃尔瑟姆-2025年1月6日-触觉智能技术领军企业Gelsight宣布&#xff0c;旗下Gelsight Mini视触觉传感器迎来凝胶触头的更新。经内部测试&#xff0c;新Gel凝胶触头耐用性提升40%&#xff0c;外观与触感与原凝胶触头保持一致。此次升级有效满足了客户在机器人应用中对设…

使用 Docker 安装 Maven 私服 Nexus3

在现代软件开发中&#xff0c;私有仓库是企业管理和分发内部依赖的重要工具&#xff0c;能够提高开发效率、加强依赖管理并确保构建的稳定性。Nexus Repository Manager 作为市场上常见的私服解决方案&#xff0c;不仅支持 Maven&#xff0c;还支持 npm、PyPI 等多种格式&#…

opencv 学习(3)

文章目录 画直线画圆画矩形画多边形文字绘制画板 本部分图形绘制 本节内容比较简单 直接上代码 画直线 import cv2 import numpy as np## 本节画直线## line 参数介绍 ## image 在那个图像上面 画线 ## 开始点借宿点 指定先的开始和结束的位置 ## 颜色 线宽 线性 ## shift…

Java-数据结构-栈与队列(StackQueue)

一、栈(Stack) ① 栈的概念 栈是一种特殊的线性表&#xff0c;它只允许固定一端进行"插入元素"和"删除元素"的操作&#xff0c;这固定的一端被称作"栈顶"&#xff0c;对应的另一端就被称做"栈底"。 &#x1f4da; 栈中的元素遵循后…