Open3D学习笔记:将4通道RGBD图像转换为双通道的灰度深度图,并将其用照相机转化为点云。点云的体素化
1、将4通道RGBD图像转换为双通道的灰度深度图
Redwood格式=深度图+RGB图,其中深度信息存储在16-bit的单通道图像中。整数值表示以毫米为单位的深度测量值。
print("Read Redwood dataset")
color_raw = o3d.io.read_image("../../TestData/RGBD/color/00000.jpg")3通道
depth_raw = o3d.io.read_image("../../TestData/RGBD/depth/00000.png")1通道
Open3D默认转换功能为:从一对彩色和深度图像创建一个RGBDImage。即彩色图像被转换为灰度图像,存储float在[0,1]范围内。深度图像存储在另一个float中,以米为单位表示深度值。
RGBDImage of size
Color image : 640x480, with 1 channels.
Depth image : 640x480, with 1 channels.
最后把转换后的两张单通道图画出来,这里没有用黑白,而用的是黄蓝,仅仅是因为好看。结果如下图:
plt.subplot(1, 2, 1) 第一张位置
plt.title('Redwood grayscale image') 第一张名字
plt.imshow(rgbd_image.color)
plt.subplot(1, 2, 2) 第二张位置
plt.title('Redwood depth image') 第二张名字
plt.imshow(rgbd_image.depth)
2、给定一组相机参数,可以将RGBD图像转换为点云。
使用函数 o3d.geometry.PointCloud.create_from_rgbd_image()将RGBD图像转化为点云,在这里,我们使用PinholeCameraIntrinsicParameters.PrimeSenseDefault默认的相机参数。它的图像分辨率为640x480,焦距(fx,fy)=(525.0,525.0),光学中心(cx,cy)=(319.5,239.5)。结果如下图。
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
记得翻转它,否则则是倒着的点云
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.visualization.draw_geometries([pcd])
读取相机固有的参数
pinhole_camera_intrinsic = o3d.io.read_pinhole_camera_intrinsic(
"../../TestData/camera_primesense.json")
print(pinhole_camera_intrinsic.intrinsic_matrix)
这样就产生了相机的矩阵参数:
[[ 525. 0. 319.5]
[ 0. 525. 239.5]
[ 0. 0. 1. ]]
RGBD摄像机?
3、点云的体素化(包含下采样)
体素下采样使用常规体素网格从输入点云创建统一下采样的点云。它通常用作许多点云处理任务的预处理步骤。该算法分为两个步骤:
-点被存储到体素中。
-每个占用的体素通过平均内部的所有点来生成精确的一个点。
这里直接采用函数pcd.voxel_down_sample(voxel_size=0.05),将pcd点云格式转化为体素格式,并且以0.05米的单位进行下采样。
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd])
下图展示了下采样后的结果: