PCL: Как удалить отклонения из облака точек? - PullRequest
3 голосов
/ 09 января 2020

Я получил облако точек, где большинство точек очень близко друг к другу представляют объект. Это облако точек было получено из сегментации изображения с датчиком глубины. Из-за некоторых неточностей у pointcloud есть также точки с некоторым расстоянием до остальных. как собственный маленький кластер точек. Вы можете видеть эти точки, обведенные красным, здесь:

enter image description here

Теперь я хотел бы удалить эти точки для дальнейшей обработки облака точек. Каков наилучший подход для этого? Я думал о некоторой кластеризации, используя алгоритм кластеризации, такой как k-means. Но при этом мне нужно заранее знать количество кластеров. И поскольку это облако точек получено из датчика, у меня не всегда есть эти точки, которые я хочу стереть. Иногда есть кластер, иногда их больше.

Есть ли какой-нибудь рекомендуемый способ решения этой проблемы?

Я бы хотел получить любую информацию. Спасибо.

PS: я использую c ++ и библиотеку pcl.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Я бы предложил попробовать статистический фильтр выбросов, встроенный в PCL: http://pointclouds.org/documentation/tutorials/statistical_outlier.php

Вы сможете буквально скопировать этот пример в свой код, и он очистит эти редкие точки для вас (после изменения двух жестко закодированных значений, чтобы соответствовать вашей сцене). Если вы всегда будете смотреть на одну и ту же сцену или похожие сцены, этого будет достаточно. Однако, если вам нужно более универсальное решение c, которое будет адаптироваться к переменно-шумным или разреженным облакам точек, я бы посоветовал вам заранее сделать гистограмму ближайшего соседа (в коде), а затем провести простой анализ пиков, чтобы установить стандартное отклонение для фильтр.

После применения этого фильтра кластеризация должна стать тривиальной, поскольку разреженные точки будут удалены, а любые разреженные мосты между кластерами также будут предназначены для удаления.

Хотя существует несколько решений для кластеризации, в этом случае я бы, вероятно, go для извлечения евклидовых кластеров (вам, вероятно, не нужно делать воксельную сетку в качестве предварительного шага, показанного в примере, поскольку ваше облако по своей сути хорошо разнесено из-за вашего датчика): http://www.pointclouds.org/documentation/tutorials/cluster_extraction.php

Переменная допуска кластера позволит вам точно указать, насколько далеко друг от друга точки могут быть включены в один кластер.

0 голосов
/ 09 января 2020

Скажем, у вас есть 1000 очков, начните с первой точки, найдите всех соседей и поместите их в одну группу, включая соседей соседей и так далее. С тем, что осталось, выберите другую точку, создайте другую группу. В конце концов вы разделите все точки на несколько групп, выберете самую большую, отбросите остальные (или будете использовать какой-то порог размера группы, который следует отбросить - это зависит от ваших данных, и вы можете решить это самостоятельно).

...