一、什么是深度图
目前深度图像的获取方法有激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法等等,针对深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基于不同视点的多幅深度图像的配准技术,基于深度数据的三维重建技术,基于三维深度图像的三维目标识别技术,深度图像的多分辨率建模和几何压缩技术等等,在PCL 中深度图像与点云最主要的区别在于 其近邻的检索方式的不同,并且可以互相转换。
深度图像(Depth Images)也被称为距离影像(Range Image),是指将从图像采集器到场景中各点的距离值作为像素值的图像,它直接反应了景物可见表面的几何形状,利用它可以很方便的解决3D目标描述中的许多问题,深度图像经过点云变换可以计算为点云数据,有规则及有必要信息的点云数据可以反算为深度图像数据。
二、点云转深度图 PointCloud->Range Image
本节演示了如何从点云和一个给定的传感器位姿创建一个深度图像。以下代码创建了一个矩形点云的示例,它浮动在观察者的前面。具体注释非常详细。
#include <pcl/range_image/range_image.h> // 深度图头文件
int main () {
pcl::PointCloud<pcl::PointXYZ> pointCloud; // 点云
// 创造矩形点云数据,0.01分辨率
for (float y=-0.5f; y<=0.5f; y+=0.01f) {
for (float z=-0.5f; z<=0.5f; z+=0.01f) {
pcl::PointXYZ point;
point.x = 2.0f - y;
point.y = y;
point.z = z;
pointCloud.push_back(point);
}
}
pointCloud.width = pointCloud.size();
pointCloud.height = 1;
// 利用以上创造的矩形体点云,创造一个1度角分辨率的深度图像
float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); // 1角度转弧度
float maxAngleWidth = (float) (360.0f * (M_PI/180.0f)); // 360角度转弧度
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); // 180角度转弧度
Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f); // 传感器位姿roll = pitch = yaw = 0(6DOF视角位姿)
// 深度图所使用的坐标系
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
float noiseLevel=0.00;
float minRange = 0.0f;
int borderSize = 1;
pcl::RangeImage rangeImage; // 深度图对象
// 从以上的点云和设置的参数来创建深度图
// ================================下面函数参数解释如下======================================
// [in] 点云、角分辨率1°、
// [in]maxAngleWidth = 360和maxAngleHeight = 180表示我们正在模拟的深度传感器具有完整的360度周围视图。(注:深度图像将仅裁剪为自动观察到某些内容的区域)。也可以通过减少值来节省一些计算。例如,对于180度视图朝前的激光扫描仪,可以观察到传感器后面没有点,maxAngleWidth = 180就足够了。
// [in]sensorPose将虚拟深度传感器的6DOF位置定义为roll = pitch = yaw = 0的原点。
// [in]coordinate_frame = CAMERA_FRAME告诉系统x面向右,y向下,z轴向前。另一种选择是LASER_FRAME,x面向前方,y位于左侧,z位于上方。
// [in]对于noiseLevel = 0,沿Z轴剖分创建深度图像。然而,想平均落在同一个单元格中的点数,可以使用更高的值。比如0.05表示所有与最近点的最大距离为5cm的点用于计算深度。
// [in]minRange 如果minRange大于0,所有靠近虚拟深度传感器的点将被忽略。
// [in]borderSize,当裁剪图像时,如果borderSize大于0将在图像四周留下未观察到的点的边界。
// [return]rangeImage 深度图
//=========================================================================================
rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight,
sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
std::cout << rangeImage << "\n";
}
以上代码执行结果如下:
header:
seq: 0 stamp: 0 frame_id:
points[]: 1360
width: 40
height: 34
sensor_origin_: 0 0 0
sensor_orientation_: 0 0 0 1
is_dense: 0
angular resolution: 1deg/pixel in x and 1deg/pixel in y.
深度图像是从PointCloud类派生出来的,它的点类有成员x,y,z和range。有三种可能形式,被观测点有一个大于零的实际深度range。未观测到的点有x=y=z=NAN和range=-INFINITY。远距离点有x=y=z=NAN和range=INFINITY。
三、利用深度图提取点云边缘
本节演示了如何从深度图像中提取边界(即从前景到背景的分割)。我们感兴趣的是三种不同的点集:
物体边界点,即仍
7724




被折叠的 条评论
为什么被折叠?



