Как визуализировать дескрипторы и ключевые точки из необработанного pointcloud? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь извлечь ключевые точки NARF и дескрипторы для необработанных данных pointcloud, используя pcl::NarfKeypoint, pcl::NarfDescriptor.

В процессе визуализации я могу просто отобразить свои ключевые точки вместе с изображением диапазона, сгенерированным из исходного облака ponitcl.

Проблема, однако, касается визуализации дескрипторов вместе с ключевыми точками. Насколько я понял, Нарф вычисляет все индексы для ключевых точек и, используя getVector3fMap(), можно просто визуализировать их с помощью pcl::visualization.

Когда дело доходит до дескрипторов, выходные данные будут x, y, z, roll, pitch, yaw и, что более важно, descriptors[36].

Кто-нибудь знает, как визуализировать дескрипторы с ключевыми точками в PCL?

Действительно ли нам нужно использовать эти 36 пунктов в descriptors[36] для решения этой проблемы?

Мой пример кода:

  // --------------------------------
  // -----Extract NARF keypoints-----
  // --------------------------------
  clock_t begin = clock();
  pcl::RangeImageBorderExtractor range_image_border_extractor;
  pcl::NarfKeypoint narfKp (&range_image_border_extractor);


  narfKp.setRangeImage (&range_image);
  narfKp.getParameters().support_size = support_size;
  narfKp.getParameters().calculate_sparse_interest_image = true; 
  narfKp.getParameters().use_recursive_scale_reduction = true;

  pcl::PointCloud<int> keyPoIdx;

  narfKp.compute (keyPoIdx);


  cout << "range image = " << range_image << "\n \n";
  cout << "keypoint = "<< keyPoIdx <<"\n";
  cout << "time to compute NARF keyPoints = " << (float)(clock() - begin) / CLOCKS_PER_SEC << " [sec] \n";

  // --------------------------------
  // ----Extract NARF descriptors----
  // --------------------------------
  vector<int> desIdx;
  desIdx.resize(keyPoIdx.points.size());

  for (unsigned int i = 0; i < desIdx.size(); i++)
  {
    desIdx[i] = keyPoIdx.points[i];
  }

  pcl::NarfDescriptor narfDes (&range_image, &desIdx);

  narfDes.getParameters().support_size = support_size;
  narfDes.getParameters().rotation_invariant = true; // cause more descriptors than keypoints

  pcl::PointCloud<pcl::Narf36> outputNarfDes;
  narfDes.compute(outputNarfDes);

  cout << "Extracted "<< outputNarfDes.size() <<" descriptors for " << keyPoIdx.points.size() << " keypoints.\n";


  //------------------------------------------------------------------ //
 //-----------------------Visualization-------------------------------//
// ----------------------------------------------------------------- //

  // ----------------------------------------------
  // -----Show keypoints in range image widget-----
  // ----------------------------------------------
  //for (size_t i=0; i<keyPoIdx.points.size (); ++i)
    //range_image_widget.markPoint (keyPoIdx.points[i]%range_image.width,
                                  //keyPoIdx.points[i]/range_image.width);

  // ---------------------------------------
  // -----Show Descriptors in 3D viewer-----
  // ---------------------------------------
  pcl::PointCloud<pcl::PointXYZ>::Ptr descriptors_ptr (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointXYZ>& desVIZ = *descriptors_ptr;


  desVIZ.points.resize(outputNarfDes.size());

  cout << "descriptor index size = " << desVIZ.points.size() << "\n"; 

    for (size_t i=0; i < desVIZ.points.size(); ++i) 
    //for (size_t i=0; i<desIdx.size(); ++i)
    {
           // ??????????????? MY PROBLEM ???????????????????
            desVIZ.points[i].getVector3fMap () = range_image.points[outputNarfDes.points[i]].getVector3fMap ();
          // ??????????????? MY PROBLEM ???????????????????
    }
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> des_color_handler (descriptors_ptr, 200, 0, 50);
  viewer.addPointCloud<pcl::PointXYZ> (descriptors_ptr, des_color_handler, "descriptors");
  viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "descriptors");

  // -------------------------------------
  // -----Show keypoints in 3D viewer-----
  // -------------------------------------
  pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints_ptr (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointXYZ>& keyPo = *keypoints_ptr;

  keyPo.points.resize(keyPoIdx.points.size());

    for (size_t i=0; i<keyPoIdx.points.size(); ++i)
    {
        keyPo.points[i].getVector3fMap () = range_image.points[keyPoIdx.points[i]].getVector3fMap ();
    }

  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> keypoints_color_handler (keypoints_ptr, 0, 200, 0);
  viewer.addPointCloud<pcl::PointXYZ> (keypoints_ptr, keypoints_color_handler, "keypoints");
  viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "keypoints");

  //--------------------
  // -----Main loop-----
  //--------------------
  while (!viewer.wasStopped ())
  {
    range_image_widget.spinOnce ();  // process GUI events
    viewer.spinOnce ();
    pcl_sleep(0.01);
  }

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете визуализировать roll / pitch / yaw , преобразовав его в вектор. За подробностями обращайтесь к этому ответу . Этот вектор может быть использован как нормаль каждой точки - таким образом, для каждого вида, только ключевые точки, имеющие одинаковую ориентацию, будут иметь цвет. В качестве альтернативы вы можете попытаться нарисовать стрелки в положении ключевых точек.

Для визуализации дескриптора вы можете проецировать его в трехмерное пространство , используя PCA . Затем его можно использовать для задания цвета ваших ключевых точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...