初步使用
open3d主要用于三维对象绘制,为Python提供了非常友好的接口,加之Intel维护给力,是Python中处理三维对象的首选模块。安装很方便,pip install open3d
即可,装完即用。
比较常见的使用流程是,打开点云数据->处理->可视化,以斯坦福兔子为例,在open3d中打开效果如下。
绘制代码如下
import open3d as o3d
pcd = o3d.io.read_point_cloud("rabbit.pcd")
o3d.visualization.draw_geometries([pcd])
- 1
- 2
- 3
其中,【io】中的【read_point_cloud】,用于读取点云数据;【visualization】中的【draw_geometries】用于显示点云列表。
交互
open3d的点云显示界面提供了诸多交互方法,比如点击拖动可改变视角,正负号可调节点的尺寸,【Ctrl】和正负号调节网格尺寸,左右方括号可用于调节视场角。
鼠标控制则很符合直觉,只需【Shift】、【Ctrl】加上鼠标左键来回拖动,试一下就会明白其操作机理,要比文字描述更直观。
下表列出了open3d图窗中常用的快捷键。
常规指令 | |
---|---|
H | 打印帮助和快捷键信息 |
Q/Esc | 退出窗口 |
R | 重置视点 |
N | 开关点云法线渲染 |
S | 切换平滑或网格平面着色 |
W | 开关网格线框 |
B | 开关背面渲染 |
I | 开关插值中的图像放大 |
T | 切换图像渲染 |
P | 截屏 |
D | 进行深度捕捉 |
O | 捕获当前渲染设置 |
L | 开关照明 |
数字键用于颜色控制,其中单独点击数设置点云颜色;Ctrl+数字设置网格颜色,Shift用于调用内置的伪彩映射
单独数字/Ctrl | Shift | |
---|---|---|
0 | 默认 | 灰度 |
1 | 渲染点颜色 | JET颜色 |
2 | 颜色对应x坐标 | Summer颜色 |
3 | 颜色对应y坐标 | Winer颜色 |
4 | 颜色对应z坐标 | HOT颜色 |
9 | 正常颜色 | - |
数据集
很多新入坑的萌新往往纠结于找不到斯坦福兔子,从而没有一个点云数据进行练习,继续学习也就更无从谈起了。
open3d提供了一个【data】模块,内置了很多数据集,但因为Github经常抽风上不了,所以实际使用体验并不友好。
为了手头有数据,可以直接在Github上下载:下载链接,进入之后向下拉,找到【Open3d Data】,第一页找不到就翻页找,总之可以找到Open3D Data [20220301]和20220201,点开【Assets】,就能看到下载链接了。
如果还是上不去Github,那就直接搜个Github镜像,总会找到能上去的。
下载完成后可直接在本地打开,以【PCDPointCloud】和【PLYPointCloud】为例,这两个点云图像如下
fragment.pcd | fragment.ply |
---|---|
![]() | ![]() |
下表中列出了open3d中的类和文件名的对应关系。
类 | 单个文件 |
---|---|
PCDPointCloud | fragment.pcd |
PLYPointCloud | fragment.ply |
EaglePointCloud | EaglePointCloud.ply |
JuneauImage | JuneauImage.jpg |
KnotMesh | KnotMesh.ply |
ArmadilloMesh | ArmadilloMesh.ply |
BunnyMesh | BunnyMesh.ply |
以 Demo
或 Sample
开头的类
类 | 说明 |
---|---|
DemoColoredICPPointClouds | 包含两个ply格式的点云 |
DemoCropPointCloud | 包含一个点云和 cropped.json |
DemoFeatureMatchingPointClouds | 两个点云分割和对应的FPFH和L32D特性 |
DemoICPPointClouds | 包含三个二进制pcd格式的点云 |
DemoPoseGraphOptimization | 2个json文件 |
SampleFountainRGBDImages | 33个彩色和深度图像 |
SampleNYURGBDImage | NYU_color.ppm 和 NYU_depth.pgm |
SampleRedwoodRGBDImages | 5组彩色深度图像 |
SampleSUNRGBDImage | SUN_color.jpg 和 SUN_depth.png |
SampleTUMRGBDImage | TUM_color.png 和 TUM_depth.png |
从其他网站下载的数据集
LivingRoomPointClouds | 57个ply格式的点云 | |
OfficePointClouds | 53个ply格式的点云 |
读取和清除点云
在Open3d中,除了读取点云文件之外,还可以通过数组来创建点云,其流程如下,其中pcd在创建之初是个空的点云,xyz是 N × 3 N\times3 N×3矩阵。
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(xyz)
- 1
- 2
【pcd.clear()】可清除pcd中的点云数据,以释放内存。
此外,点云类还提供了两个静态方法,【create_from_depth_image】和 【create_from_rgbd_image】,可通过深度图像或rgbd图像来生成点云,下面用一张RGB图像来演示一下这个功能
raw = o3d.io.read_image("test.jpg")
rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth(raw, raw, convert_rgb_to_intensity=False)
inter = o3d.camera.PinholeCameraIntrinsic()
# 此为相机内部参数,是我乱写的 1920x1080为像素尺寸;(600,600)为x,y方向的焦距;(640,360)为相机位置
inter.set_intrinsics(1920, 1080, 600, 600, 640, 360)
pcd = o3d.geometry.PointCloud().create_from_rgbd_image(rgbd, inter)
o3d.visualization.draw_geometries([pcd])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
绘图结果为
感觉很有冲击力。
点云颜色还可以通过paint_uniform_color
来指定,后面会经常用到这个方法。
评论记录:
回复评论: