my plan is to segment a building or a flat into rooms. As a basis I have a ply file and python 3.11. Now I have a segmentation which does not end at the walls. I hope this works or maybe someone has a better solution.
import open3d as o3d
import numpy as np
from sklearn.cluster import KMeans
import os
point_cloud = o3d.io.read_point_cloud("fox_valley_single_1cm - Cloud.ply")
points = np.asarray(point_cloud.points)
num_clusters = 6 # Number of rooms or areas
kmeans = KMeans(n_clusters=num_clusters)
kmeans.fit(points)
cluster_labels = kmeans.labels_
room_colors = { [1, 0, 0],[0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1],}
point_colors = [room_colors[label] for label in cluster_labels]
colored_point_cloud = o3d.geometry.PointCloud()
colored_point_cloud.points = o3d.utility.Vector3dVector(points)
colored_point_cloud.colors = o3d.utility.Vector3dVector(point_colors)
o3d.visualization.draw_geometries([colored_point_cloud])
plane_model, inliers = point_cloud.segment_plane(distance_threshold=0.01, ransac_n=3,/ num_iterations=1000)
outlier_cloud = point_cloud.select_by_index(inliers, invert=True)
ceiling_model, ceiling_inliers = outlier_cloud.segment_plane(distance_threshold=0.01,ransac_n=3,num_iterations=1000)
ceiling_cloud = outlier_cloud.select_by_index(ceiling_inliers)
outlier_cloud = outlier_cloud.select_by_index(ceiling_inliers, invert=True)
walls = outlier_cloud
output_folder = "output"
if not os.path.exists(output_folder):
os.makedirs(output_folder)
o3d.io.write_point_cloud(os.path.join(output_folder, "walls.ply"), walls)