基于Open3D的点云处理2-Open3D的IO与数据转换

三维数据类型

  • 点云
    某个坐标系下的点数据集,每个点包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等信息;
    储存格式:pts、LAS、PCD、xyz、asc、ply等;
  • Mesh
    多边形网格,常见的是三角网格,由点,法向,面组成;
    储存格式:obj、stl、ply等;
  • 数模
    三维数字模型是通过三维制作软件通过虚拟三维空间构建出具有三维数据的模型,由几何基元构成;
    储存格式:IGS、part、model、IGES等;

Open3D的IO与数据转换

API

点云的读取和保存

  • 接口
open3d.io.read_point_cloud(filename, format='auto', remove_nan_points=False, remove_infinite_points=False, print_progress=False)
open3d.io.write_point_cloud(filename, pointcloud, write_ascii=False, compressed=False, print_progress=False)

其中,format 包括:
xyz: 三维坐标[x, y, z]
xyzn: 三维坐标 + 归一化坐标 [x, y, z, nx, ny, nz]
xyzrgb: 三维坐标+ 颜色归一化值s [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;

  • 测试用例
import open3d as o3d
pcd = o3d.io.read_point_cloud("bunny.pcd")
o3d.visualization.draw(pcd)
o3d.io.write_point_cloud("copy_bunny.pcd", pcd)

基于Open3D的点云处理2-Open3D的IO与数据转换_第1张图片

mesh的读取和保存

  • 接口
open3d.io.read_triangle_mesh(filename, enable_post_processing=False, print_progress=False)
open3d.io.write_triangle_mesh(filename, mesh, write_ascii=False, compressed=False, write_vertex_normals=True, write_vertex_colors=True, write_triangle_uvs=True, print_progress=False)

其中,可读取format 包括ply、stl、obj、off、gltf/glb;

  • 测试用例
import open3d as o3d
plymesh = o3d.io.read_triangle_mesh("bunny10k.ply")
o3d.visualization.draw(plymesh)
o3d.io.write_triangle_mesh("copy_bunny10k.ply", plymesh)

基于Open3D的点云处理2-Open3D的IO与数据转换_第2张图片

RGBD的读取

  • 接口
#读图片数据
open3d.io.read_image(filename)
#基于rgb图和depth图,生成rgbd图像
o3d.geometry.RGBDImage.create_from_color_and_depth(color, depth, depth_scale=1000.0, depth_trunc=3.0, convert_rgb_to_intensity=True)

基于Open3D的点云处理2-Open3D的IO与数据转换_第3张图片

  • 测试用例
import open3d as o3d
import matplotlib.pyplot as plt

print("Read Redwood dataset")
# 读取rgb图像
color_raw = o3d.io.read_image("00000.jpg")
# 读取深度图像
depth_raw = o3d.io.read_image("00000.png")

# RGBD图像
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
    color_raw, depth_raw)
print(rgbd_image)

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()

# 根据相机内参从深度图计算点云
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])

基于Open3D的点云处理2-Open3D的IO与数据转换_第4张图片
基于Open3D的点云处理2-Open3D的IO与数据转换_第5张图片

你可能感兴趣的:(三维数据处理,python,开发语言,Open3d,3d)