天天看點

PCL:描述三維離散點的ROPS特征(Code)

前言:

       三維點雲為三維歐式空間點的集合。對點雲的形狀描述若使用局部特征,則可分為兩種:固定世界坐标系的局部描述和尋找局部主方向的局部描述,ROPS特征為尋找局部主方向的特征描述。

1.尋找主方向(對XYZ軸經過特定旋轉)LFR:

         <1>.計算法線特征:這一步是非常耗計算量的,若達到可以接受的法線精度,此過程幾乎占據了 整個計算過程的50%;可選擇的方法有 使用空間樹索引建立近鄰域,對近鄰平面拟合,平面的參數方向既是法線一個方向。

         <2>.進行多邊形重建:利用貪婪投影的方法進行三角形重建,這個事一個調參數的過程,沒有可以完全的方法。

                參數有:

gp3.setSearchMethod (treeNor);
         gp3.setSearchRadius (Gp3PolyParam.SearchRadius);// Set 最大搜尋半徑
         gp3.setMu            (Gp3PolyParam.MuTypeValue);// Set typical values 
         gp3.setMaximumNearestNeighbors (Gp3PolyParam.MaximumNearestNeighbors);
         gp3.setMaximumSurfaceAngle  (Gp3PolyParam.MaximumSurfaceAngle); // 45 度
         gp3.setMinimumAngle               ( Gp3PolyParam.MinimumAngle); // 10 度
         gp3.setMaximumAngle                (Gp3PolyParam.MaximumAngle); // 120 度
         gp3.setNormalConsistency      (Gp3PolyParam.NormalConsistency);
           

         <3>.計算整幅圖像的ROPS特征:

           查找PCL官網的tutoriales:http://pointclouds.org/documentation/tutorials/rops_feature.php。

#include <pcl/features/rops_estimation.h>
#include <pcl/io/pcd_io.h>

int main (int argc, char** argv)
{
  if (argc != 4)
    return (-1);

  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
  if (pcl::io::loadPCDFile (argv[1], *cloud) == -1)
    return (-1);

  pcl::PointIndicesPtr indices = boost::shared_ptr <pcl::PointIndices> (new pcl::PointIndices ());
  std::ifstream indices_file;
  indices_file.open (argv[2], std::ifstream::in);
  for (std::string line; std::getline (indices_file, line);)
  {
    std::istringstream in (line);
    unsigned int index = 0;
    in >> index;
    indices->indices.push_back (index - 1);
  }
  indices_file.close ();

  std::vector <pcl::Vertices> triangles;
  std::ifstream triangles_file;
  triangles_file.open (argv[3], std::ifstream::in);
  for (std::string line; std::getline (triangles_file, line);)
  {
    pcl::Vertices triangle;
    std::istringstream in (line);
    unsigned int vertex = 0;
    in >> vertex;
    triangle.vertices.push_back (vertex - 1);
    in >> vertex;
    triangle.vertices.push_back (vertex - 1);
    in >> vertex;
    triangle.vertices.push_back (vertex - 1);
    triangles.push_back (triangle);
  }

  float support_radius = 0.0285f;
  unsigned int number_of_partition_bins = 5;
  unsigned int number_of_rotations = 3;

  pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);
  search_method->setInputCloud (cloud);

  pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
  feature_estimator.setSearchMethod (search_method);
  feature_estimator.setSearchSurface (cloud);
  feature_estimator.setInputCloud (cloud);
  feature_estimator.setIndices (indices);
  feature_estimator.setTriangles (triangles);
  feature_estimator.setRadiusSearch (support_radius);
  feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
  feature_estimator.setNumberOfRotations (number_of_rotations);
  feature_estimator.setSupportRadius (support_radius);

  pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());
  feature_estimator.compute (*histograms);

  return (0);
}
           

文章連結:Rotational Projection Statistics for 3D Local Surface Description and Object Recognition;

A spin image is generated by projecting a local surface onto a 2D plane using a cylindrical parametrization. Similarly, a snapshot is obtained by rendering a local surface from the viewpoint which is perpendicular to the surface. Our RoPS differs from these methods in several aspects. First, RoPS represents a local surface from a set of viewpoints rather than just one view (as in the case of spin image and snapshot). Second, RoPS is associated with a unique and unambiguous LRF, and it is invariant to rotation. In contrast, spin image discards cylindrical angular information and snapshot is prone to rotation. Third, RoPS is more compact than spin image and snapshot since RoPS further encodes 2D matrices with a set of statistics. The typical lengths of RoPS, spin image and snapshot are 135, 225 and 1600, respectively (see Table 2,(Johnson and Hebert 1999)

and Malassiotis and Strintzis 2007)。

特征生成流程圖:

PCL:描述三維離散點的ROPS特征(Code)

繼續閱讀