Роль точек переднего плана в pcl :: MinCutSegmentation

Я пытаюсь понять, как MinCutSegmentation работает в PCL. Я устанавливаю некоторые точки в качестве точек переднего плана, но независимо от того, какие точки я выбрал в качестве точек переднего плана, я получаю один и тот же результат. Сегментация в основном обрезает некоторую часть моего облака точек и возвращает оставшуюся часть как «передний план».

Насколько я понял после прочтения статьи для MinCut, точки, которые я выбрал в качестве переднего плана, обязательно должны быть помечены как передний план в конечном кластере, однако я вижу, что этого не происходит. Ниже приведены некоторые скриншоты, чтобы объяснить, что происходит:

Исходное облако точек

Исходное облако точек

Я устанавливаю точки внутри красной рамки в качестве точек на переднем плане

Я устанавливаю точки внутри красной рамки в качестве точек на переднем плане

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

Кроме того, и, возможно, в связи с первым вопросом, я не понимаю, как я теряю некоторые очки во время алгоритма mincut. Насколько я понимаю, все облако точек делится на две части — передний план и фон, но, похоже, это не тот случай, когда я пробую алгоритм. Есть указатели?

Ниже приведен фрагмент кода, который я использую:

  //xmin,xmax,ymin,ymax represent the extremeties of the red box

float xmin = startX - delta;
float xmax = startX + delta;
float ymin = startY - delta;
float ymax = startY + delta;
float zmin = startZ - delta;
float zmax = startZ + delta;

pcl::CropBox<pcl::PointXYZRGB> boxFilter;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr filteredCloud (new pcl::PointCloud<pcl::PointXYZRGB>) ;
boxFilter.setMin(Eigen::Vector4f(xmin, ymin, zmin, 0.0));
boxFilter.setMax(Eigen::Vector4f(xmax, ymax, zmax, 0.0));
boxFilter.setInputCloud(cloud_target);
boxFilter.filter(*filteredCloud);
// For this code, mode is always "mincut".
// I am using the crop mode to just test what points are selected by the boxfilter
if(mode == "crop")
{

viewer->removePointCloud("sample cloud");
viewer->addPointCloud<pcl::PointXYZRGB>(filteredCloud, "sample cloud");
viewer->spinOnce(1);
}
else if(mode == "mincut")
{
pcl::IndicesPtr indices (new std::vector <int>);
pcl::PassThrough<pcl::PointXYZRGB> pass;
pass.setInputCloud (cloud_target);
pass.setFilterFieldName ("z");
pass.setFilterLimits (0.0, 1.0);
pass.filter (*indices);

pcl::MinCutSegmentation<pcl::PointXYZRGB> seg;
seg.setInputCloud (cloud_target);
seg.setIndices (indices);
seg.setForegroundPoints (filteredCloud);

seg.setSigma (0.15);
seg.setRadius (10);
seg.setNumberOfNeighbours (14);
seg.setSourceWeight (0.3);

std::vector <pcl::PointIndices> clusters;

std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
seg.extract (clusters);
std::chrono::steady_clock::time_point end= std::chrono::steady_clock::now();

std::cout << "Time taken to segment = " << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() <<std::endl;std::cout << "Maximum flow is " << seg.getMaxFlow () << std::endl;

pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = seg.getColoredCloud ();viewer->removePointCloud("sample cloud");
viewer->addPointCloud<pcl::PointXYZRGB>(colored_cloud, "sample cloud");
viewer->spinOnce(1);

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]