У меня есть облако точек лесного участка, созданное наземным лазерным сканером.Я хотел бы обнаружить упавший грубый древесный мусор (мертвая древесина), используя цилиндрическую сегментацию в библиотеке Python-PCL.Я вырезал облако точек выше 1,3 м, чтобы оставшееся облако точек содержало мертвую древесину и оставшуюся часть стеблей и наземных точек.
Код работает хорошо, однако создает точки цилиндра только на части облака точек, см. В приложении
Мне нужна помощь для улучшения кода, чтобы он мог создавать сегменты в целом графике.Вот код:
import pcl
cloud = pcl.load('input.pcd')
print(cloud.size)
fil = cloud.make_passthrough_filter()
fil.set_filter_field_name("z")
fil.set_filter_limits(0, 1.5)
cloud_filtered = fil.filter()
print(cloud_filtered.size)
seg = cloud_filtered.make_segmenter_normals(ksearch=50)
seg.set_optimize_coefficients(True)
seg.set_model_type(pcl.SACMODEL_NORMAL_PLANE)
seg.set_normal_distance_weight(0.1)
seg.set_method_type(pcl.SAC_RANSAC)
seg.set_max_iterations(100)
seg.set_distance_threshold(0.03)
indices, model = seg.segment()
print(model)
cloud_plane = cloud_filtered.extract(indices, negative=False)
pcl.save(cloud_plane, 'outputPlane.pcd')
cloud_cyl = cloud_filtered.extract(indices, negative=True)
seg = cloud_cyl.make_segmenter_normals(ksearch=50)
seg.set_optimize_coefficients(True)
seg.set_model_type(pcl.SACMODEL_CYLINDER)
seg.set_normal_distance_weight(0.1)
seg.set_method_type(pcl.SAC_RANSAC)
seg.set_max_iterations(10000)
seg.set_distance_threshold(0.99)
seg.set_radius_limits(0, 0.1)
indices, model = seg.segment()
print(model)
cloud_cylinder = cloud_cyl.extract(indices, negative=False)
pcl.save(cloud_cylinder, 'output_cylinder.pcd')