Open3D基础知识和点云体素


介绍

我在毕业研究中接触过Open3D,但是当我第一次接触Open3D时,由于日语信息太少而遇到麻烦,因此我将对其进行一些总结。

大多数开始接触Open3D的人都可能会访问的网站→Open3D:http://lang.sist.chukyo-u.ac.jp/classes/Open3D/
这是官方教程的日语翻译,但是除了教程之外,您还可以做很多事情。
如果您有需要做的事情,通常可以找到官方文档(英文)。

研究活动包括"从RGB-D摄像机图像生成点云","消除异常值"和"点云对齐"。
我所做的其他事情是"点云的体素化"和"使用RANSAC进行平面估计"。

这次,我将介绍Open3D和"点云的体素化"的基础知识(尽管它只是功能的介绍)。

环境

  • Open3D 0.9.0
  • Python 3.6

请注意,Open3D的规格因版本而异。
在本文中,它被描述为与v0.9.0兼容,但是由于我也使用v0.7.0进行研究,因此我仅检查了v0.9.0的最小操作。

Open3D基础

从RGB-D图像生成点云并进行可视化,读取和写入pcd文件

从RGB-D图像

生成点云

box.png
右上方是从RealSense采集的图像,左上方是生成的点云(在研究中,点云是在剪切图像后生成的。)

1
2
3
4
5
6
7
8
9
10
import open3d as o3d

"""
Open3DにRGB-D画像入力
"""
color = o3d.Image(color_numpy) # numpy配列から変換
depth = o3d.Image(depth_numpy)
rgbd = o3d.geometry.RGBDImage.create_rgbd_image_from_color_and_depth(color, depth, convert_rgb_to_intensity=False)
pcd = o3d.geometry.PointCloud.create_point_cloud_from_rgbd_image(rgbd, pinhole_camera_intrinsic)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) # 見やすくするための回転

Pinhole_camera_intrinsic可以通过RealSense的以下方法获得。
诸如RealSense设置之类的处理被省略。

1
2
3
4
5
import pyrealsense2 as rs

# camera intrinsics取得
intr = profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics()
pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(intr.width, intr.height, intr.fx, intr.fy, intr.ppx, intr.ppy)

点云可视化

1
o3d.visualization.draw_geometries([pcd])

除点云外,它还用于可视化体素和网格。

读取和写入pcd文件

1
2
3
4
5
# バイナリでの書き込み
o3d.io.write_point_cloud("hoge.pcd", pcd)

# asciiでの書き込み
o3d.io.write_point_cloud("hoge.pcd", pcd, True)

可以输出

pcd文件以外的文件。
因为很容易看到,所以输出ascii很方便。

阅读

1
pcd = o3d.io.read_point_cloud("./hoge.pcd")

点云体素化

1
2
voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.03) # ボクセルのサイズ指定
o3d.visualization.draw_geometries([voxel])

2020-02-25 (2).png

Open3D刚接触它时,我为点云创建了体素化功能,但似乎它是最初准备的。 .. ..

结论

这次,我总结了Open3D的基础知识。
如果有时间,我想用RANSAC总结我的研究和飞机评估,但我可能不会。