欢迎访问个人网络日志🌹🌹知行空间🌹🌹
基础介绍
Open3D是英特尔公司于2015年发布的开源3D视觉算法库,截至2023年03月已经更新到了0.17.0版本。基于MIT协议开源许可。
其后端使用C++11实现,经过了高度优化,使用OpenMP并行运算优化。通过Python Pybinding,其提供前端Python API。
Open3D的介绍论文发布在http://www.open3d.org/wordpress/wp-content/paper.pdf。更多详细的介绍可以参考这里。
值得一提的是在另外一个大名鼎鼎的3D视觉算法库是Point Cloud Library(PCL),PCL由Willow Garage实验室开源于2011年,与Robot Operating System(ROS)同出一源。关于PCL的介绍可以参考这里https://pointclouds.org/assets/pdf/pcl_icra2011.pdf。在Open3D的介绍论文中,作者指出,PCL作为较早出现的3D视觉算法库,经过一段时间的开源维护后,代码变的臃肿,且更新维护频率比较低。
Open3D的更新历史https://github.com/isl-org/Open3D/tags
PCL的更新历史https://github.com/PointCloudLibrary/pcl/tags
作为Open3D和PCL的使用者,客观的讲Open3D的Python接口更好用,维护更新做的也更好。
Open3D读取文件
使用的测试数据可以从这里下载。
物体的3D表示可以使用点云/Mesh/Model。

Open3D支持的Mesh类型有:

Open3D支持的点云类型有:

- 读取
ply格式的Mesh
filename = "dragon_recon/dragon_vrip_res2.ply"
dragon_mesh = o3d.io.read_triangle_mesh(filename)
print(dragon_mesh)
dragon_mesh.compute_vertex_normals()
print(np.asarray(dragon_mesh.triangles).shape)
print(np.asarray(dragon_mesh.vertices).shape)
o3d.visualization.draw_geometries([dragon_mesh]) # 可视化Mesh
# TriangleMesh with 100250 points and 202520 triangles.
# (202520, 3)
# (100250, 3)

- 读取
pcd格式的点云 - 保存点云:
write_point_cloud(filename, pointcloud, write_ascii=False, compressed=False, print_progress=False)
Function to write PointCloud to file - 可视化点云:
-
draw_geometries(geometry_list, window_name='Open3D', width=1920, height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)Function to draw a list of geometry.Geometry objects。
使用OpenGL进行渲染。
- 2.
draw_geometries_with_key_callbacks参考自callback
-
dragon_pc = dragon_mesh.sample_points_uniformly(number_of_points=20000)
save_file = "dragon_recon/dragon_vrip_res2.pcd"
o3d.io.write_point_cloud(save_file, dragon_pc)
o3d.visualization.draw_geometries([dragon_pc]) # 可视化点云 +/-可调点云的大小
def rotate_callback(vis):
ctr = vis.get_view_control()
ctr.rotate(10.0, 0.0)
return False
key_to_callback = dict()
key_to_callback[ord("r")] = rotate_callback
o3d.visualization.draw_geometries_with_key_callbacks([dragon_pc], key_to_callback)

Voxel降采样
刚刚随机采样生成点云时,number_of_points设置的是20000,点太多了的时候,可以使用体素Voxel来降采样。
voxel_down_sample(self, voxel_size)
Function to downsample input pointcloud into output pointcloud with a voxel. Normals and colors are averaged if they exist.
-
o3d.visualization.read_selection_polygon_volume 通过空间多边形和最大最小距离来裁剪点云数据
-
compute_convex_hull(…) method of open3d.cpu.pybind.geometry.PointCloud instance,计算点云的凸包
-
estimate_normals 计算点云的法向量

最低0.47元/天 解锁文章
936





