pcl里面的RoPs特征(Rotational Projection Statistics)
這次我們將使用pcl::ROPSEstimation這個(gè)類來導(dǎo)出點(diǎn)的特征。
下面是這個(gè)方法的特征提取方式。有一個(gè)網(wǎng)格和一個(gè)點(diǎn)集可以讓我們來執(zhí)行一些簡(jiǎn)單的操作。第一步,對(duì)于一個(gè)給定的興趣點(diǎn)局部的表面將會(huì)被削平。局部表面包含了在半徑內(nèi)的點(diǎn)和三角形。對(duì)于給定的局部表面LRF將被計(jì)算。LRF是向量的3個(gè)組之一。真正重要的是使用那些具有旋轉(zhuǎn)不變的向量。為了做到這一點(diǎn),我們把感興趣的點(diǎn)作為原點(diǎn)來做轉(zhuǎn)換,再這之后我們旋轉(zhuǎn)局部表面,以至于LRF向量關(guān)于Ox,Oy,Oz坐標(biāo)軸對(duì)稱。完成這些后,我們開始了特征導(dǎo)出。對(duì)于每個(gè)Ox,Oy,Oz坐標(biāo)軸,我們會(huì)把這些這些坐標(biāo)軸作為當(dāng)前的坐標(biāo)軸。
1.局部表面通過一個(gè)給定的角度在當(dāng)前的坐標(biāo)軸進(jìn)行旋轉(zhuǎn)。
2.把局部表面投影成3個(gè)平面XY,XZ和YZ.
3.對(duì)于每個(gè)投影分布矩陣,這個(gè)矩陣將展示怎么樣把把點(diǎn)分到不同的容器里面。容器的數(shù)量代表了矩陣的維度和算法的參數(shù)。
4.每個(gè)分布矩陣的中心矩將會(huì)被計(jì)算。M11,M12,M21,M22,E。E是信息熵。
5.計(jì)算值將會(huì)組成子特征。
?
我們把上面這些步驟進(jìn)行多次迭代。不同坐標(biāo)軸的子特征將組成RoPS描述器。
下面是代碼
我們首先要找到目標(biāo)模型
points 包含點(diǎn)云
indices 點(diǎn)的下標(biāo)
triangles包含了多邊形
#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); }?
上面是指定下標(biāo)點(diǎn)的RoPS特征計(jì)算的地方
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);}上面是加載關(guān)于多邊形的信息的。你可以取代信息用下面的代碼來進(jìn)行三角劃分,如果你只有點(diǎn)云沒有網(wǎng)格圖。
float support_radius = 0.0285f;unsigned int number_of_partition_bins = 5;unsigned int number_of_rotations = 3;上面的這些代碼定義了重要的算法參數(shù),局部表面裁剪支持的半徑,以及用于組成分布矩陣的容器的數(shù)量和旋轉(zhuǎn)的次數(shù)。最后的參數(shù)將影響描述器的長(zhǎng)度。
pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method (new pcl::search::KdTree<pcl::PointXYZ>);search_method->setInputCloud (cloud);
上面設(shè)置了搜索方法。
上面是實(shí)例化類的地方。它包含了兩個(gè)參數(shù)
PointInT:輸入點(diǎn)的類型
PointOutT:輸出點(diǎn)的類型
最終我們需要進(jìn)行特征計(jì)算
pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms (new pcl::PointCloud <pcl::Histogram <135> > ());feature_estimator.compute (*histograms);然后運(yùn)行
./rops_feature points.pcd indices.txt triangles.txt?
總結(jié)
以上是生活随笔為你收集整理的pcl里面的RoPs特征(Rotational Projection Statistics)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【youcans 的 OpenCV 例程
- 下一篇: java定时任务中使用多线程_java项