コード
#include "stdafx.h"
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
pcl::PointCloud<pcl::PointNormal> Smoothing(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);//Kdtreeの作成
pcl::PointCloud<pcl::PointNormal> mls_points;//出力する点群の格納場所を作成
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
mls.setComputeNormals (true);//法線の計算を行うかどうか
// 各パラメーターの設定
mls.setInputCloud (cloud);
mls.setPolynomialFit (true);
mls.setSearchMethod (tree);
mls.setSearchRadius (0.03);
mls.process (mls_points);//再構築
return mls_points;//出力
}
int _tmain(int argc, _TCHAR* argv[])
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::io::loadPCDFile (argv[1], *cloud);
std::stringstream Filename;
string name = argv[1];
name.erase(name.length() - 4);
Filename << name << "_smoothed.pcd";
std::cout << Filename.str() << std::endl;
pcl::io::savePCDFile (Filename.str(), Smoothing(cloud));
return (0);
}
実行結果
このスムージング処理を行った後の点群データを使用すると平面の検出をより精度よく行うことができるが構造が複雑なものに対して行うと、その物体の構造を崩してしまうので必要に応じて点群を切り分けるなどの処理が必要である。
0 件のコメント:
コメントを投稿