2015-04-14 4 views
0

Я хочу удалить все точки под признанной таблицей. Как мне это сделать? У меня есть следующий функциональный код для сегмента/удалить таблицу из облака точек:PCL удалить точки под сегментированный стол

std::cout << "(II) segmenting table plane ..." << std::endl; 
    pcl::PointCloud<pcl::PointXYZ>::Ptr segmented_scene(new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::PointIndices::Ptr inliers(new pcl::PointIndices()); 
    ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); 
    SACSegmentation<PointXYZ> segmentation; 
    segmentation.setInputCloud(downsampledScene); 
    segmentation.setModelType(pcl::SACMODEL_PLANE); 
    segmentation.setMethodType(pcl::SAC_RANSAC); 
    segmentation.setDistanceThreshold(threshold); 
    segmentation.setOptimizeCoefficients(true); 
    segmentation.setMaxIterations(1000); 
    //PointIndices inlierIndices; 
    segmentation.segment(*inliers, *coefficients); 
    ExtractIndices<PointXYZ> extract; 
    extract.setInputCloud(downsampledScene); 
    extract.setIndices(inliers); 
    extract.setNegative(true); 
    extract.filter(*segmented_scene); 
    //copyPointCloud<pcl::PointXYZ>(*downsampledScene, inlierIndices, *segmented_scene); 
    copyPointCloud(*segmented_scene, *outputCloud); 

Или как я могу установить начало системы координат на столе, чтобы использовать транзитный фильтр для фильтрации всех точек при Таблица?
Я проверил это с помощью следующего кода, но я думаю, что это не правильно:

Eigen::Affine3f transform_1 = Eigen::Affine3f::Identity(); 
    cout << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << endl; 
    transform_1.translation() << coefficients->values[0], coefficients->values[1], coefficients->values[2]; 
    transformPointCloud(*segmented_scene, *segmented_scene, transform_1); 

ответ

0

Я решил проблему так:

Создать Эйген :: Vector3D п коэффициентов (0,1,2).
Рассчитать угол между вектором и осью z.
инвертировать n, коэффициенты.значение (3) и угол, если угол> 0, поскольку пределы фильтра z [setFilterLimits (FLT_MIN, FLT_MAX); ]
Создать Eigen :: Affine3d t (Eigen :: Translation3d (n * values.values ​​(3)));
Вычислить г AngelAxisd (угол, ось)
Вычислить преобразование г * т
превратить точку Облако
использовать Passthrough фильтра и установить пределы.
А затем обратное преобразование

0

Самый простой способ, вероятно, чтобы создать выпуклую оболочку вокруг плоских точек, которые вы извлекли, и проецировать его вниз, чтобы создать призма ниже этой выпуклой оболочки, удаляя точки внутри этой призмы. Это легко сделать с помощью облачной библиотеки точек, используя класс pcl::ExtractPolygonalPrismData.

Учебное пособие по использованию этого класса можно найти here.

+0

Спасибо за ваш ответ. Я уже тестировал этот учебник, но я ошибся со следующей ошибкой: «[pcl :: ConvexHull :: выполнитьReconstrution2D] ОШИБКА: qhull не смог вычислить выпуклую оболочку для данного облака точек (53493)! [pcl :: ExtractPolygonalPrismData :: segment] Недостаточно точек (0) в корпусе! '. Мой HeightLimits ist установлен на: 'prism.setHeightLimits (0.0f, 500.0f);' потому что у меня есть PointClound в мм. (например: -2906.6528 -3386.3918 8212). Объект на столе имеет высоту ок. 10 см. – DripleX

+0

Похоже, он думает, что в выпуклой оболочке нет точек (т. Е. Таблицы). Не знаю, почему. Во всяком случае, у вас есть решение. –

+0

Это я или ссылка на учебник мертв? – Bono