三维数据类型
- 点云
某个坐标系下的点数据集,每个点包括三维坐标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)
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)
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)
- 测试用例
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])