У меня есть данные облака точек, где, щелкнув точку, я хочу извлечь точки вокруг точки щелчка в радиусе. Я хочу также вытащить извлеченные точки в новое облако. Используя Pointpickingevent, я могу щелкнуть одну точку и вставить ее в облако. Как извлечь набор точек, например, точки вокруг радиуса 0,02 см от точки щелчка и вставить их в новое облако?Как извлечь набор точек в данных облачных точек с помощью PCL?
ответ
Учитывая облако точек:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud
Kdtree Затем генерируется для выполнения эффективного поиска диапазон:
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
kdtree.setInputCloud (cloud);
Тогда, учитывая точку и радиус:
pcl::PointXYZ searchPoint(1,2,3);
float radius = 4;
Вы можете получить все очки, которые находятся на расстоянии радиус от точки Searchpoint:
std::vector<int> pointIdxRadiusSearch; //to store index of surrounding points
std::vector<float> pointRadiusSquaredDistance; // to store distance to surrounding points
if (kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
std::cout << " " << cloud->points[ pointIdxRadiusSearch[i] ].x
<< " " << cloud->points[ pointIdxRadiusSearch[i] ].y
<< " " << cloud->points[ pointIdxRadiusSearch[i] ].z
<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
}
Вы можете напечатать все окружающие точки и их расстояние до Searchpoint проверить функциональную правильность кода.
Наконец, создать облако с найденными точками:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZ>);
for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
cloud_cluster->points.push_back(cloud->points[ pointIdxRadiusSearch[i] ]);
cloud_cluster->width = cloud_cluster->points.size();
cloud_cluster->height = 1;
cloud_cluster->is_dense = true;
Для того, чтобы иметь возможность выбрать точку, которую вы можете использовать PointPickingEvent аналогично this answer.
Декларация класса в вашем .h,
class PCLViewer : public QMainWindow
{
Q_OBJECT
public:
explicit PCLViewer (QWidget *parent = 0);
~PCLViewer();
void pointPickCallback (const pcl::visualization::PointPickingEvent& event, void*);
public slots:
protected:
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
pcl::PointXYZ src_point_;
bool src_point_selected_;
private:
Ui::PCLViewer *ui;
};
В вашем .cpp,
PCLViewer::PCLViewer (QWidget *parent) :
QMainWindow (parent),
ui (new Ui::PCLViewer)
{
ui->setupUi (this);
[...]
viewer.reset (new pcl::visualization::PCLVisualizer ("viewer", false));
viewer->registerPointPickingCallback (&PCLViewer::pointPickCallback, *this);
[...]
}
и дополнительные функции,
void
PCLViewer::pointPickCallback (const pcl::visualization::PointPickingEvent& event, void*)
{
// Check to see if we got a valid point. Early exit.
int idx = event.getPointIndex();
if (idx == -1)
return;
// Get the point that was picked
event.getPoint (src_point_.x, src_point_.y, src_point_.z);
PCL_INFO ("Src Window: Clicked point %d with X:%f Y:%f Z:%f\n", idx, src_point_.x, src_point_.y, src_point_.z);
src_point_selected_ = true;
}
Существует более подробный пример использование его в приложении для регистрации вручную: pcl/apps/src/manual_registration/manual_registration.cpp pcl/apps/include/pcl/apps/manual_registration.h
- 1. Визуализация облачных точек
- 2. Быстрая регистрация облачных точек
- 3. Количество точек в неорганизованном облаке точек
- 4. Как построить крупнозернистый средний набор точек данных?
- 5. Как улучшить производительность просмотра облачных точек
- 6. Производящий набор точек
- 7. Triangulate набор 3D точек
- 8. как рассчитать среднее расстояние точек в облаке точек
- 9. Фильтровать облако точек в реальном времени ... PCL
- 10. Как использовать PCL для фильтрации облака точек данных из
- 11. Получить набор точек данных при масштабировании
- 12. Обратный набор точек в C++
- 13. Найти ближайший набор точек в другой набор
- 14. OpenCV - Установить кривой набор точек
- 15. Набор точек и векторное поле
- 16. Как переставить набор точек с ограничениями?
- 17. .NET и PCL (облачная библиотека точек)
- 18. Как извлечь определенный кластер после фильтрации облака точек?
- 19. Совокупные группы точек данных
- 20. Как найти основные компоненты и ориентацию облака точек с помощью облачной библиотеки точек
- 21. Хранение и добавление облаков прошлых точек из kinect с помощью облачной библиотеки точек и ROS
- 22. Попытка построения точек в R с помощью точек()
- 23. У меня есть 8 точек в данных облачных точек. Как восстановить точки, чтобы сформировать куб данных точечного облака?
- 24. Единичное тестирование облачных конечных точек Google: как использовать BaseDevAppServerTestConfig?
- 25. Как удалить набор точек сетки внутри круга?
- 26. Google - Project Tango - Удаление облачных точек - Скелетное отслеживание
- 27. Установка 3D-поверхности в набор данных точек [R]
- 28. Визуализация облаков точек в проекте Tango из PCL
- 29. Увеличение точек данных в сигнале
- 30. алгоритм вычисления точек максимума в множества точек