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可以通过文件扩展名自动推断文件类型,下面是支持的点云文件类型。

FormatDescription
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这个格式可以包含点云和网格数据,可以参考链接
pcdPoint 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显示效果:
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐