open3d墙面提取代码

阅读: 评论:0

open3d墙面提取代码

open3d墙面提取代码

门窗洞口提取需拍平墙,根据X、Y、Z轴的axsi()值设定,拍平后可以进行下一步处理,方便点云开发者下一步操作。

 

附上代码

import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
from alpha_shapes import Alpha_Shaper, plot_alpha_shapedef extract_walls_pcd(pcd, axis='z', threshold=2e+1000):# 提取墙面的点云points = np.asarray(pcd.points)if axis == 'x':axis_index = 0elif axis == 'y':axis_index = 1elif axis == 'z':axis_index = 2else:raise ValueError("Invalid axis. Must be 'x', 'y', or 'z'.")wall_points = points[abs(points[:, axis_index]) < threshold]wall_pcd = ry.PointCloud()wall_pcd.points = o3d.utility.Vector3dVector(wall_points)return wall_pcddef plane_fit(pcd):# 使用RANSAC平面拟合plane_model, inliers = pcd.segment_plane(distance_threshold=0.5, ransac_n=5, num_iterations=1000)return plane_model, inliersdef plane_projection(pcd, plane_model, inliers):# 将点云投影到拟合的平面上plane_pcd = pcd.select_by_index(inliers)projected_points = np.asarray(plane_pcd.points)plane_params = plane_model[:-1]d = plane_model[-1]array_1 = projected_points.dot(plane_params[:, np.newaxis]) + darray_1_reshaped = np.tile(array_1, (1, 3))# projected_points -= projected_points.dot(plane_params[:, np.newaxis]) + dprojected_points -= array_1_reshapedplane_pcd.points = o3d.utility.Vector3dVector(projected_points)return plane_pcdif __name__ == "__main__":# 读取点云文件pcd = ad_point_cloud(r"C:UserszhaojunzheDesktoppyRANSAC-3D-masterpyRANSAC-3D-mastertestsdataset20230713.pcd")# 提取墙面点云并拍平wall_pcd_x = extract_walls_pcd(pcd, axis='x')flat_wall_pcd_x = plane_projection(wall_pcd_x, *plane_fit(wall_pcd_x))wall_pcd_y = extract_walls_pcd(pcd, axis='y')flat_wall_pcd_y = plane_projection(wall_pcd_y, *plane_fit(wall_pcd_y))wall_pcd_z = extract_walls_pcd(pcd, axis='z')flat_wall_pcd_z = plane_projection(wall_pcd_z, *plane_fit(wall_pcd_z))# 保存平面点云为独立的文件o3d.io.write_point_cloud("flat_wall_pcd_x.pcd", flat_wall_pcd_x)o3d.io.write_point_cloud("flat_wall_pcd_y.pcd", flat_wall_pcd_y)o3d.io.write_point_cloud("flat_wall_pcd_z.pcd", flat_wall_pcd_z)# 创建一个可视化窗口vis = o3d.visualization.Visualizer()ate_window()# 将处理后的点云添加到可视化窗口中# vis.add_geometry(flat_wall_pcd_x)# vis.add_geometry(flat_wall_pcd_y)vis.add_geometry(flat_wall_pcd_z)# 显示点云vis.run()vis.destroy_window()

 

本文发布于:2024-02-05 01:38:11,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170721075761841.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:墙面   代码   open3d
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23