Есть ли какая-нибудь функция для извлечения индексов, сгенерированных из кропбокса - PullRequest
0 голосов
/ 14 июня 2019

Я попробовал pcl :: cropbox и отфильтровал облако по минимальным и максимальным значениям x, y, z, заданным для cropbox.Я получаю новое облако, которое содержит только точку в пределах границ.К сожалению, мне не нужно отдельное облако, но нужны индексы, которые находятся внутри коробки.Примечание. Я получаю удаленные индексы из старого облака, но не те индексы, которые находятся внутри кропбокса.

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile ("D:\ism_test.pcd", *cloud);


pcl::PointCloud<pcl::PointXYZ>::Ptr bodyFiltered (new pcl::PointCloud<pcl::PointXYZ>);

pcl::CropBox<pcl::PointXYZ> boxFilter(true);
boxFilter.setMin(Eigen::Vector4f(minX, minY, minZ, 1.0));
boxFilter.setMax(Eigen::Vector4f(maxX, maxY, maxZ, 1.0));
boxFilter.setInputCloud(cloud);
boxFilter.FilterIndices(*bodyFiltered);
pcl::IndicesConstPtr removedIndices = boxFilter.getRemovedIndices();
pcl::IndicesConstPtr actualindices = boxFilter.getIndices();

//blocks until the cloud is actually rendered
pcl::visualization::CloudViewer filteredviewer("Filtered Viewer");
filteredviewer.showCloud(bodyFiltered);

1 Ответ

0 голосов
/ 20 июня 2019

pcl :: CropBox унаследовал filter (std::vector< int > &indices), поэтому вы должны иметь возможность вызывать его, чтобы получить индексы, которые лежат в рамке , см. Здесь для справки

pcl::CropBox<pcl::PointXYZ> boxFilter;
...
#
std::vector<int> indices_inside;
boxFilter.filter(indices_inside);

Если вам нужны точки вне коробки, вы можете получить их с помощью std :: set_difference , например

std::vector<int> all_points(cloud.size());
std::iota(all_points.begin(), all_points.end()) // fill with 0, 1, 2, ..., n
std::vector<int> indices_inside = ...(from previous);
std::vector<int> indices_outside;

// process: indices_outside = all_points - indices_inside 
std::set_difference(all_points.begin(), all_points.end(),
                    indices_inside.begin(), indices_inside.end(), 
                    std::inserter(indices_outside, indices_outside.begin()));
...