多相机坐标转换_使用KITTI数据集实现坐标转换

c3d9e9b4721244f7c1fc846505f32bf4.png

本文的主要内容,是讨论如何将KITTI激光雷达的点云数据,映射到图像中去。

KITTI数据集是怎么采集的

下面这幅图是车的俯视图,可以看到,用到了2个彩色相机,2个灰度相机,1个激光雷达。1个GPS/IMU。

d83696eb9ce481fa3ba1c312c4c6040b.png
图1 KITTI车俯视图

KITTI标系是怎么定义的

比较值得注意的是,蓝字部分标注的Velodyne激光雷达的坐标系中, X坐标是向前的。也就意味着激光雷达数据中的X数据,给的是物体的距离信息。这点在我的代码中的时候会有体现。

c4158c9c885cb3b53fb24b383e7e7a2b.png
KITTI车传感器坐标定义

KITTI怎么从点云映射到图像?

我看了Kitti官方论文《Vision meets Robotics: The KITTI Dataset》,要想把点云映射到图像,核心的公式就是

e92d06e98caddd09ad86a18fc0188236.png
图2 点云坐标x映射到图像坐标y

先说说映射流程流程。

  • 首先经过
    矩阵映射。经过这一步,点云坐标被映射到了0号相机坐标系里。
  • 然后经过
    矩阵映射。这一步我也没太搞懂。比较奇怪的是,不管像映射到哪个编号的相机,似乎都需要左乘
    矩阵。而且这个
    矩阵看上去仅仅是一个内参矩阵……
  • 最后经过
    矩阵映射,被变换到了i号相机所在的图像坐标系。

再说说各部分长什么样。

  • 是点云数据的齐次坐标形式,一个4行1列的列向量,
  • 是4*4的矩阵。它并非是平移矩阵,而是标定得到的激光雷达和相机的外参矩阵。包括了旋转矩阵
    和平移矩阵
    两部分, 如下

= |
|

|

|
  • 是4*4的矩阵,最后一行为
    ,是从3*3矩阵扩展来的。
  • 是3*4的矩阵。
  • 是最终映射得到的图像坐标,是一个3行1列的列向量,
    。为了变换成齐次坐标的形式,需要做一个归一化,除以

KITTI怎么获取上述映射矩阵?

公式中:

为点云数据,使用.bin二进制文件储存,可以使用c++读取。里面包括了三维坐标信息和反射率。

对于几个转换矩阵,KITTI提供了三类标定文件,分别叫

  • calib_cam_to_cam.txt: 相机之间的坐标转换矩阵
  • calib_imu_to_velo.txt: IMU和激光雷达的坐标转换
  • calib_velo_to_cam.txt: 相机和激光雷达之间的坐标转换

本文中要将激光雷达的点云数据,映射到图像中去。因此用到的是calib_cam_to_cam.txt和calib_velo_to_cam.txt。

就是calib_cam_to_cam.txt中的P_rect_0i。

是由calib_cam_to_cam.txt的3*3的R_rect_00矩阵扩展一个维度而来。

由calib_velo_to_cam.txt中的R和T,扩展出来的。

在这些标定txt文件中,所有的数据都是按行存储的,也就是P_rect的1-4个数据,是矩阵

的第一行。

怎么显示出映射后融合效果?

通过上述公式,我们已经可以把3维点云数据映射至图像坐标了。可以直接在图像上标记出这些点。

但是,为了更酷炫的显示这个效果,我们可以根据点云的x坐标给这些点上色。用x坐标的原因,也就是刚刚上面提到的因为激光雷达的坐标系x轴是朝前的,实际上坐标x就是物体距离。

一般使用各大编程语言的colormap里的JET色彩就能实现渐变效果,距离远的点是蓝色的,距离近的点是红色的。

映射后的效果图如下:

aaf30ba13b359685f52460c2c4eb4d0d.png

Kitti官方提供了 MATLAB代码run_demoVelodyne.m。这份代码里,为了显示融合效果,用到了几个tricks:

  1. 把x<5的点去掉了。物理意义就是,距离小于5的范围可能处于相机的盲区,拍不到。去掉这些点可以提高速度。
  2. 点云中,每5个点取一个点。也是为了提高计算速度。
  3. 在实现远距离是蓝色,近距离是红色时,kitti官方代码将距离映射成0-63的整数,每个整数对应一个颜色,实现方式很有趣。
col_idx = round(64*5/velo(i,1));

这里velo(i,1)就是距离。由于他把x<5的点去掉了,所以5/velo(i,1)范围在(0,1]之间。64*5/velo(i,1)就到了(0,64]之间。取整之后,就变成了0-63的整数。

c++代码

依据官方代码,我实现了c++版本的。

https://gitee.com/cuiry/learn3D/tree/master/learnKitti​gitee.com
ed5b20c3825cbec6f94e191d33ec820f.png

里面有1张kitti彩色图像,和对应的点云bin文件、标定txt文件。

代码实现了bin文件和标定txt数据的读取、从点云坐标转换成图像坐标、以及融合效果的显示。

代码运行在Ubuntu18.04,需要opencv4.4.0和PCL库。

参考资料

kitti数据集坐标转换_冯子材的博客-CSDN博客​blog.csdn.net
e79c49dd0ddf722b73c0cf899b0a8ed8.png
https://github.com/ZouCheng321/fusion_kitti/blob/master/run_demoVelodyne.m​github.com

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

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

相关文章

内部类-----Java

内部类-----Java 内部类是一类特殊的类&#xff0c;指的是定义在一个类的内部的类&#xff0c;在Java中内部类主要分为非静态内部类、静态内部类、局部 内部类、匿名内部类。 非静态内部类&#xff0c;作为类的成员存在&#xff0c;和成员变量、构造方法、代码块并列。因为是…

api数据加密的定义_API 设计基础规范

首先&#xff0c;请务必记住 API 设计和使用的一个重要法则 Postels Law(又称作稳健性原则):Be liberal in what you accept, be conservative in what you send下面是关于 API 设计的一些基本问题API First将 API 视作产品&#xff0c;并向产品开发一样设计和维护 API在代码实…

MySQL表级约束和列级约束

MySQL中只要支持六种完整性约束&#xff0c;如表所示&#xff1a;其中check约束是MySQL8中提供的支持。 约束条件 约束描述 primary key 主键约束&#xff0c;约束的值可唯一的标识对应的记录 not null 非空字段的值不能为空 unique 唯一约束&#xff0c;约束1字段的值是…

MySQL外键约束

MySQL外键约束 外键约束&#xff08;FOREIGN KRY&#xff0c;缩写FK&#xff09;是用来实现数据库表的参照完整性约束的。 外键约束可以是两张表紧密的结合起来&#xff0c;特别是针对修改或者删除的级联操作时&#xff0c; 会保证数据的完整性。 &#xff08;注&#xff1…

zookeeper 密码_Dubbo、ZooKeeper介绍

dubbo是一个分布式架构的服务框架&#xff0c;一般结合maven的模块式开发使用。传统的单架构项目&#xff0c;不方便维护和升级&#xff1b;通过maven的模块式开发&#xff0c;就可以把一个单架构的工程&#xff0c;拆封成一个一个的小模块&#xff0c;包括(jar和war)&#xff…

异常--java

java默认的异常处理机制 优点&#xff1a;发生异常后、会给出异常类型、异常提示信息、异常出现的位置 缺点&#xff1a;出现异常后&#xff0c;后续语句不执行了&#xff1b;提示信息太专业&#xff0c;可读性差 解决&#xff1a;try-catch-finally 处理异常&#xff1b;th…

192.168.8.1手机登陆_高端机型都在鼓吹的ufs3.1是什么?对于手机使感受明显吗?...

最近很多朋友留言问&#xff0c;ufs3.1是什么&#xff0c;很重要吗&#xff1f;下面就由小编来给大家介绍一下手机上的ufs3.1是什么&#xff01;ufs是高端安卓手机&#xff0c;常用的储存协议&#xff0c;就好像我们电脑里的固态硬盘一样&#xff0c;速度越快&#xff0c;打开软…

代码合并工具_11个代码质量审核和管理工具,程序员必备!

「 读者福利&#xff01;2 TB 各类技术资源免费赠送 」如今&#xff0c;代码质量分析和审核已成为每个企业的基本流程。随着开源代码库使用的增加&#xff0c;安全性和代码质量对于构建高质量软件至关重要。不良的代码不仅会影响代码的可维护性&#xff0c;而且还会在某些情况下…

异常体系----java

一、异常体系 1、error error类层次描述了java运行时系统内部错误和资源耗尽错误&#xff0c;一般指与jvm或动态加载等相关的问题&#xff0c; 如&#xff1a;虚拟机错误&#xff0c;动态链接失败&#xff0c;系统崩溃等。 2、exception 所有异常类的父类&#xff0c;其子…

xy坐标正负方向_【笛卡尔坐标系】

【壹】笛卡尔坐标系(Cartesian coordinates)就是直角坐标系和斜坐标系的统称。相交于原点的两条数轴&#xff0c;构成了平面放射坐标系。如两条数轴上的度量单位相等&#xff0c;则称此放射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系&#xff0c;称为笛卡尔直角坐标…

throw和throws的使用

throw和throws的使用 public class Person {private String name;private int age;public Person(){}Person(String name,int age){this.name name;this.age age;}public int getAge() {return age;}public String getName() {return name;}public void setName(String name…

为什么需要包装类?

1、某些方法的参数必须是对象&#xff0c;为了让基本数据类型的数据能作为参数&#xff0c;提供包装类。 2、包装类还可以提供更多的功能 3、其他特别重要的功能&#xff1a;比如可以实现字符串和基本数据类型之间的转换 认识一下包装类吧&#xff01; package demo05;impor…

一句话概括自动装箱/拆箱

自动装箱过程是通过调用包装类的valueOf&#xff08;&#xff09;方法实现的&#xff0c;二自动拆箱过程是通过调用包装类的xxxValue&#xff08;&#xff09;方法实现的&#xff08;xxx代表对应的基本数据类型&#xff0c;如intValue&#xff0c;doubleValue等&#xff09;。 …

2021-05-24

String类的使用 package demo07;import java.util.Locale; import java.util.function.BiConsumer;public class TestString {public static void main(String[] args) {//1.创建一个String对象String str "abcDEfghijkL";//2.操作该String对象//2.1最简单的方法Sy…

StringBuffer和StringBuild

StringBuffer和StringBuild两个类的区别主要是&#xff1a; StringBuffer JDK1.0提供的类&#xff0c;线程安全&#xff0c;做线程同步检查&#xff0c;效率较低。 StringBuild JDK1.5提供的类&#xff0c;线程不安全&#xff0c;不做线程同步检查&#xff0c;因此效率较高。…

Date类练习

package demo09;import java.util.Date;public class TestDate {public static void main(String[] args) {//获取当前时间Date now new Date();//输出当前时间System.out.println(now.toString());System.out.println(now.toLocaleString());System.out.println(now.getYear(…

全连接层的作用_python构建计算图2——全连接层

&#xff08;好久不更~&#xff09;前文中&#xff0c;参照tensorflow的方式实现了简单的自动求导。接下来要在自动求导的基底&#xff08;模板&#xff09;上搭建简单的bp神经网络。计算图前文曾多次提到计算图&#xff0c;关于什么是计算图&#xff0c;有很多种说法。既然它被…

DateFormat类

DateFormat是一个抽象类&#xff0c;一般使用它的子类SimpleDateFormat类来实现。主要作用就是把时间队形转化成指定格式的字符串 反之&#xff0c;把指定格式的字符串转化成时间对象。 package demo10;import java.text.DateFormat; import java.text.ParseException; impor…

免费CDN:jsDeliver+Github使用方法

免费CDN&#xff1a;jsDeliverGithub使用方法 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户…

教你如何使用github+jsDelivr搭建免费图床

前言 之前写了一篇文章&#xff0c;教你如何使用TyporaPicGo实现图片自动上传到图床 。 这里我用的是七牛图床&#xff0c;七牛图床有一定的免费使用量&#xff08;没记错的话应该是10个G&#xff09;&#xff0c;如果你的存储量超过这个大小就需要付费使用了。除此之外&…