Как спроецировать облако точек на основную плоскость и перенести его в 2D-изображение (OpenCV Mat) в библиотеке облака точек?

Я хочу разбить камни на землю и посчитать площадь камней следующим образом:

Я писал OpenCV в течение 2 лет и обнаружил, что сегментировать камни очень сложно, только используя изображение OpenCV RGB, поэтому я использую Kinect Fusion для сканирования земли и получения облака точек, в котором камни выше земли.
Я использую библиотеку облака точек, чтобы сегментировать плоскость земли (зеленого цвета) следующим образом:

Теперь я пытаюсь спроецировать остальные точки на основную плоскость и получить 2D-изображение в формате OpenCV Mat (высота исходной точки становится значением проецируемой точки на наземном 2D-изображении), которая получается серой. Матовый рисунок. Но это очень сложно для меня, и не могли бы вы дать мне несколько советов?

Если мне удастся получить мой новый серый мат, то я смогу сделать сегментацию на нем, что довольно легко для меня.

Кстати, есть ли средство просмотра облака точек, в котором я вижу координаты (x, y, z) точек?

Это мой основной код:

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

pcl::io::loadPLYFile ("MeshedReconstruction.ply", *cloud);

pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers_groud (new pcl::PointIndices);
// Create the segmentation object
pcl::SACSegmentation<pcl::PointXYZ> seg;
// Optional
seg.setOptimizeCoefficients (true);
// Mandatory
seg.setModelType (pcl::SACMODEL_PLANE);
seg.setMethodType (pcl::SAC_RANSAC);
seg.setDistanceThreshold (0.01);//1cm

seg.setInputCloud (cloud);
seg.segment (*inliers_groud, *coefficients);

if (inliers_groud->indices.size () == 0)
{
    PCL_ERROR ("Could not estimate a planar model for the given dataset.");
    return (-1);
}

std::cerr << "Model coefficients: " << coefficients->values[0] << " " 
    << coefficients->values[1] << " "
    << coefficients->values[2] << " " 
    << coefficients->values[3] << std::endl;

std::cerr << "Model inliers_groud: " << inliers_groud->indices.size () << std::endl;

// Create the filtering object
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud (cloud);
extract.setIndices (inliers_groud);
extract.setNegative(false);

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

extract.filter (*cloud_groud);//get the ground plane

std::cerr << "Ground cloud after filtering: " << std::endl;
std::cerr << *cloud_groud << std::endl;

pcl::PCDWriter writer;
writer.write<pcl::PointXYZ> ("samp11-utm_ground.pcd", *cloud_groud, false);

Мой ответ:

Посмотрите на этот PCL API:http://docs.pointclouds.org/1.7.2/a02405.html#ga4375e99ec2ae368eec9379f506568611

Я успешно решил эту проблему!

И результат отличный (фиолетовый самолет - это исходная земля, а зеленый - трансформированная земля, которая является плоскостью X-O-Y):

Теперь, если pcl :: PointXYZ равен (x0, y0, z0), то точка на Mat (x0, y0) равна z0. Результат:

Ответы на вопрос(1)

Ваш ответ на вопрос