点云的应用
点云(Point Cloud)就是一堆带 3D 坐标的点集合,本质是三维世界的数字化表达。
- 配准→ 把多帧点云拼成完整环境
- 分割→ 把环境分成不同东西
- 检测→ 找到感兴趣目标(车、人)
- 补全→ 让残缺物体变完整,方便识别 / 抓取
点云数据
- 无序性:只是点,排列顺序不影响
- 近密远疏:扫描与视角不同导致
- 非结构化数据,直接CNN有点难
- 要解决的任务就是如何对点云数据进行特征提取
open3D的IO与数据转换
open3D点云的读取和保存
import open3d as o3d # 读取点云 pcd = o3d.io.read_point_cloud("./data/coalYard.pcd") o3d.visualization.draw_geometries([pcd]) # 保存 o3d.io.write_point_cloud("./data/copy_coalYard.pcd", pcd)open3D中rgbd的读取
colar_raw=o3d.io.read_image("./data/00000.jpg") depth_raw=o3d.io.read_image("./data/00000.png") rgbd_iamge=o3d.geometry.RGBDImage.create_from_color_and_depth(colar_raw,depth_raw) plt.subplot(1,2,1) plt.title("color") plt.imshow(rgbd_iamge.color) plt.subplot(1,2,2) plt.title("depth") plt.imshow(rgbd_iamge.depth) plt.show() pcd=o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_iamge,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中mesh的读取和保存
plymesh=o3d.io.read_triangle_mesh("./data/bunny10k.ply") o3d.visualization.draw_geometries([plymesh]) o3d.io.write_triangle_mesh("./data/copy_bunny10k.ply",plymesh)简单可视化
o3d.visualization.draw_geometries(geometry_list,window_name='Open3D',width=1920,height=1080,left=50,top=50,point_show_normal=False)
- geometry_list:带显示的所有实体组成的列表[1,1]
- window_name:待显示窗体的名字
- width:窗体的宽度
- height:窗体高度
- left:窗体左边缘的宽度
- top:窗体上边缘的宽度
- point_show_normal:是否显示法向量
paint_uniform_color([0,0,1]):设置点云颜色
ply=o3d.io.read_point_cloud("./data/tree.ply") ply.paint_uniform_color([1,0,1]) o3d.visualization.draw_geometries([ply])设置索引点颜色
ply=o3d.io.read_point_cloud("./data/tree.ply") ply.paint_uniform_color([0,0,1]) #将点云颜色数据转化为numpy类型 color=np.array(ply.colors) #获取需要修改颜色的索引 inlier=[i for i in range(0,color.shape[0]) if i%2==0] color[inlier]=[1,0,0] #再将颜色转回原来的类型 ply.colors=o3d.utility.Vector3dVector(color[:,:]) o3d.visualization.draw_geometries([ply])可视化法线
ply=o3d.io.read_point_cloud("./data/tree.ply") ply.paint_uniform_color([0,0,1]) #计算法线,搜索半径0.01m,只考虑领域内的30个点 ply.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01,max_nn=30)) o3d.visualization.draw_geometries([ply],point_show_normal=True)隐藏点移除
hidden_point_removal(camera_location,radius)
pcd=o3d.io.read_point_cloud("./data/building.ply") # o3d.visualization.draw_geometries([pcd]) _,pt_map=pcd.hidden_point_removal([0,0,0.25],25) pcd=pcd.select_by_index(pt_map) o3d.visualization.draw_geometries([pcd])pcd=o3d.io.read_point_cloud("./data/building.ply") # o3d.visualization.draw_geometries([pcd]) _,pt_map=pcd.hidden_point_removal([0,0,0.25],25) pcd=pcd.select_by_index(pt_map,invert=True) o3d.visualization.draw_geometries([pcd])其他(坐标系,点云大小)
pcd=o3d.io.read_point_cloud("./data/bunny.pcd") #可视化句柄 viewer=o3d.visualization.Visualizer() viewer.create