2、将图像转换为点云

1、它是后面处理地图的基础,最简单的点云地图就是把不同位置的点云进行拼接得到的。

2、由于从RGB-D相机里可以采集到两种形式的数据:彩色图像和深度图像。如果有kinect和ros,那么可以运行如下

roslaunch openni_launch openni.launch

来使Kinect工作。如果PC机连上Kinect,那么彩色图像和深度图像会发布在/camera/rgb/image_color 和 /camera/depth_registered/image_raw 中;可以通过运行如下

rosrun image_view image_view image:=/camera/rgb/image_color

来显示彩色图像,或者也可以在Rviz里看到图像与点云的可视化数据。

3、rgb图像与对应的深度图像,如下

这两张图是来自于数据集nyuv2:http://cs.nyu.edu/~silberman/datasets/ 原图格式是ppm和pgm的,目前格式是png。

在实际的Kinect里(或其他rgb-d相机里)直接采到的RGB图和深度图可能会有些小问题,比如

1)有一些时差(约几到十几个毫秒)。这个时差的存在,会产生“RGB图已经向右转了,深度图还没转”的感觉。

2)光圈中心未对齐。因为深度毕竟是靠另一个相机获取的,所以深度传感器和彩色传感器参数可能不一致。

3)深度图里有很多“洞”。因为RGB-D相机不是万能的,它有一个探测距离的限制啦!太远或太近的东西都是看不见的呢。关于这些“洞”,我们暂时睁一只眼闭一只眼,不去理它。以后我们也可以靠双边bayes滤波器去填这些洞。但是!这是RGB-D相机本身的局限性。软件算法顶多给它修修补补,并不能完全弥补它的缺陷。

在以上给出的图当中,都进行了预处理,可以认为“深度图就是彩色图里每个像素距传感器的距离“。

4、现在需要把这两个图转成点云,因为计算每个像素的空间点位置,是后面配准、拼图等一系列事情的基础,比如:在配准时,必须知道特征点的3D位置,这时候就需要用到这里讲的东西。

5、从2D到3D(数学部分)

上面两张图像给出了机器人外部世界的一个局部信息,假设这个世界由一个点云来描述:X={x1,x2,...xn}。其中每一个点由六个分量组成:r,g,b,x,y,z,分别表示该点的颜色与空间位置;颜色方面,主要由彩色图像记录;而空间位置,可由图像和相机模型、姿态一起计算出来。

对于常规相机,SLAM里使用针孔相机模型(图来自http://www.comp.nus.edu.sg/~cs4243/lecture/camera.pdf ):

一个空间点[x,y,z]和它在图像中的像素坐标[u,v,d](d指深度数据)的对应关系式这样的:

其中,fx,fy指相机在x,y两个轴上的焦距,cx,cy指相机的光圈中心,s指深度图的缩放因子。

上面的公式是从(x,y,z)推导到(u,v,d),反之,也可以已知(u,v,d),推导到(x,y,z)的方式,推导如下

那么就可以根据上式构建点云了。

通常把fx,fy,cx,cy这四个参数定义为相机的内参矩阵C,也就是相机做好之后就不会变得参数。相机的内参可以用很多方法来标定,详细的步骤比较繁琐;在给定内参之后,每个点的空间位置与像素坐标就可以用简单的矩阵模型来表示了:

其中,R和t是相机的姿态。R代表旋转矩阵,t代表位置矢量。目前我们做的是单幅图像的点云,故认为相机没有旋转和平移;所以把R射程单位矩阵I,把t设成了零。s是scaling factor,即深度图里给的数据与实际距离的比例。由于深度图给的都是short (mm单位),s通常为1000。

如果相机发生了位移和旋转,那么只要对这些点进行位移和旋转操作即可。

6、从2D到3D (编程部分)

完成从图像到点云的转换,在上一节讲到的代码根目录/src/ 文件夹中新建一个generatePointCloud.cpp文件:

touch src/generatePointCloud.cpp

在一个工程里可以有多个main函数,因为cmake允许你自己定义编译的过程,我们会把这个cpp也编译成一个可执行的二进制,只要在cmakelists.txt里作相应的更改便行了,更改如下

然后在新建的文件generatePointCloud.cpp里面编写如下代码

时间: 2024-10-10 00:18:16

2、将图像转换为点云的相关文章

matlab练习程序(图像投影到点云)

最近接触点云比较多,如果把图像投影到点云应该挺有意思. 首先需要载入图像,然后做个球或其他什么形状的点云,这里可以参考球坐标公式. 最后通过pcshow将像素输出到点云上即可. 原图: 投影后的点云: 代码如下: clear all; close all; clc; img = imread('lena.jpg'); [m,n,d]=size(img); I=reshape(img,[],d); R=1; x=zeros(m*n,1); y=zeros(m*n,1); z=zeros(m*n,1

图像转换为二维数组存入DSP6748

 本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 这篇博客主要是要讲怎么把一张图片存成一个二进制的文件,直接存到DSP中来做处理,而不用考虑DSP与图像采集模块,或者上位机之间的数据通信使得我们更加专注于算法的开发研究和处理功能的实现. 这是最近在做的一样工作,主要开发对雷达图像处理的目标检测算法.思路是先把现成的雷达图片转化为一个数组,然后以头文件的

c语言实现BMP图像转换为灰度图

当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了很久图片的知识才弄明白 BMP文件包括以下几部分(具体结构在程序中说明): 位图文件头 位图信息头 调色板 位图数据 结构体内存对齐原则 每个成员存储的起始位置要从该成员大小的整数倍开始 成员是结构体时相对与起始偏移是其内部最大元素大小的整数倍 结构体的总大小是其内部最大成员的整数倍 因此在定义头结

Python如何将RGB图像转换为Pytho灰度图像?

我正尝试使用matplotlib读取RGB图像并将其转换为灰度.在matlab中,我使用这个: 1 img = rgb2gray(imread('image.png')); 在matplotlib tutorial中他们没有覆盖它.他们只是在图像中阅读 1 2 import matplotlib.image as mpimg img = mpimg.imread('image.png') 然后他们切片数组,但是这不是从我所了解的将RGB转换为灰度. 1 lum_img = img[:,:,0]

一起做RGB-D SLAM (2)

第二讲 从图像到点云 本讲中,我们将带领读者,编写一个将图像转换为点云的程序.该程序是后期处理地图的基础.最简单的点云地图即是把不同位置的点云进行拼接得到的. 当我们使用RGB-D相机时,会从相机里读到两种数据:彩色图像和深度图像.如果你有Kinect和ros,可以运行: 1 roslaunch openni_launch openni.launch 使Kinect工作.随后,如果PC连接上了Kinect,彩色图像与深度图像就会发布在 /camera/rgb/image_color 和 /cam

基于三个kinect的人体建模

单个kinect的人体重建,在Kinect SDK 1.8中,Kinect Fusion的效果已经很不错了.其缺点显而易见,一是扫描时间长,重建对象也需要长时间保持静态:二是需要人体或者kinect转动以实现全方位扫描,操作起来繁琐.而运用三个kinect来进行人体重建,只需要将三个kinect按照一定方位(比如两两相距120°角度)固定位置,人体即使不动也能实现对人体的全身扫描,相比之下时间花销短. 基于三个kinect的人体重建,首先要对三个kinect相机进行标定,得到相机内外参数.这样每

视觉slam十四讲ch5 joinMap.cpp 代码注释(笔记版)

1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 #include <opencv2/core/core.hpp> 5 #include <opencv2/highgui/highgui.hpp> 6 #include <Eigen/Geometry> 7 #include <boost/format.hpp> // for formating st

python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波

有许多滤波器设计用于灰度图像但是不能用于彩色图像.为了简化创建函数,使其能够用于RGB图像,scikit-image图像处理库提供了adapt_rgb装饰器. 实际使用adapt_rgb装饰器,你必须决定如何调整RGB图像以使灰度滤波器能够用于RGB图像.有两个预定义的处理方式: "每个通道": 传输RGB的每个通道给滤波器,处理后,将它们按照rgb顺序整合到RGB图像. "hsv_value": 转换RGB图像到HSV图像并传输明度通道的值给滤波器.滤波的结果被插

调用阿里云api获取阿里云数据同步服务(DTS)并且作图发送邮件的整个流程

前言 在https://rorschachchan.github.io/2018/02/24/阿里云获取DTS服务延迟的脚本/ 文章里已经写过,领导现在要求"每天查看阿里云dts同步的延迟情况和同步速率情况",并且在https://rorschachchan.github.io/2018/02/27/使用matplotlib画图的一个脚本/ 里面也放了一个使用python matplotlib画图的demo,这篇文章的目的就是把整个过程实现,并且把dts图形以每日邮件的形式发送给领导的