1. open3d简介、安装与测试
Open3D是一个开源库,支持快速开发和处理3D数据。Open3D在c++和Python中公开了一组精心选择的数据结构和算法。后端是高度优化的,并且是为并行化而设置的。Open3D的核心功能包括:
- 3D 数据结构
- 3D 数据处理算法
- 场景重建
- 表面对齐
- 3D 可视化
- 基于物理渲染 (PBR)
- 支持使用 PyTorch 和 TensorFlow 的 3D 机器学习
- 内核 3D 操作的 GPU 加速
- 在C ++ 和 Python 中可用
- 安装
python版本的open3d安装很简单,直接执行下列命令即可(使用了镜像安装)
pip3 install open3d -i https://pypi.tuna.tsinghua.edu.cn/simple
- 测试
直接运行下列命令测试是否安装成功,如果没有报错,则安装成功!
python -c "import open3d as o3d; print(o3d)"
2. 读写点云数据并可视化
open3d可以通过文件扩展名自动推断文件类型,下面是支持的点云文件类型。
Format | Description |
---|---|
xyz | 每一行包括 [x,y,z] 三个值,x,y,z 是三维坐标 |
xyzn | 每一行包括 [x,y,z,nx,ny,nz] 六个值,其中nx,ny,nz 是法线 |
xyzrgb | 每一行包括 [x,y,z,r,g,b] 六个值,这里r,g,b的范围在[0,1]的浮点数 |
pts | 第一行是一个整数,表示点的个数,之后的每一行可以是下列格式之一:[x, y, z, i, r, g, b], [x, y, z, r, g, b], [x, y, z, i] or [x, y, z],其中x,y,z和i是double类型,r,g,b是uint8类型。 |
ply | 这个格式可以包含点云和网格数据,可以参考链接 |
pcd | Point Cloud Data |
也可以显示的指定文件类型,这样将会忽略文件扩展名。
#忽略.txt格式,读取的格式为xyz
pcd =o3d.io.read_point_cloud("../../my_points.txt",format='xyz')
下列代码功能:读取一个pcd文件,并显示,同时将读取的pcd文件进行写入,生成copy_of_fragment.pcd文件。
import open3d as o3d
pcd = o3d.io.read_point_cloud("../test_data/fragment.pcd") # 读取pcd文件
print(pcd) #只是简单的打印信息:PointCloud with 113662 points.
#显示,zoom等信息是一些可选项
o3d.visualization.draw_geometries([pcd])
# o3d.visualization.draw_geometries([pcd], zoom=0.3412,
# front=[0.4257, -0.2125, -0.8795],
# lookat=[2.6172, 2.0475, 1.532],
# up=[-0.0694, -0.9768, 0.2024])
# 在同级目录下写入 copy_of_fragment.pcd文件
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
显示效果:
3. 读写网格(mesh)数据并可视化
与点云的数据结构相比,网格(mesh)数据具有定义三维曲面的三角形。默认情况下,Open3D尝试通过文件扩展名推断文件类型。支持以下网格文件类型:
格式 | 描述 |
---|---|
ply | 同点云 |
stl | 请查看链接 |
obj | 请查看链接 |
off | 请查看链接 |
gltf | 请查看链接 |
代码举例:
import open3d as o3d
mesh = o3d.io.read_triangle_mesh("../test_data/knot.ply")
print(mesh) #打印简单的信息:TriangleMesh with 1440 points and 2880 triangles.
# 写入(这里是复制)一份新数据
o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh)
#显示
o3d.visualization.draw_geometries([mesh])
输出显示效果:
4. 读写图像(rgbd)数据并可视化
下面的程序先读入jpg的普通图片和png的深度图片,然后合成rgbd的深度图像。
import open3d as o3d
color_raw = o3d.io.read_image("../test_data/RGBD/color/00000.jpg")
depth_raw = o3d.io.read_image("../test_data/RGBD/depth/00000.png")
#创建一个rgbd图像
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color_raw, depth_raw)
print(rgbd_image)
#使用matplotlib显示图像
import matplotlib.pyplot as plt
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)
plt.show()
#rgbd 转==》pcd ,并显示
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
# Flip it, otherwise the pointcloud will be upside down
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.visualization.draw_geometries([pcd])
# image的读取与写入
img = o3d.io.read_image("../test_data/lena_color.jpg")
print(img)
'''
输出:
Image of size 512x512, with 3 channels.
Use numpy.asarray to access buffer data.
'''
# 写入(这里是拷贝)一份新的image数据
o3d.io.write_image("copy_of_lena_color.jpg", img)
输出:
RGBDImage of size
Color image : 640x480, with 1 channels.
Depth image : 640x480, with 1 channels.
Use numpy.asarray to access buffer data.
matplotlib显示图像效果:
RGBD转PCD显示效果: