資源簡介
利用PCL開源庫編寫代碼FPFH+ICP算法實現點云高精度配準,并計算配準誤差!基于PCL庫版本1.9!

代碼片段和文件信息
#include?//采樣一致性
#include?
#include?
#include?
#include?
#include?
#include?
#include?//
#include?//
#include?//icp配準
#include?//可視化
#include?//時間
using?pcl::NormalEstimation;
using?pcl::search::KdTree;
typedef?pcl::PointXYZ?PointT;
typedef?pcl::PointCloud?PointCloud;
//點云可視化
void?visualize_pcd(PointCloud::Ptr?pcd_src?PointCloud::Ptr?pcd_tgt?PointCloud::Ptr?pcd_final)
{
//創建初始化目標
pcl::visualization::PCLVisualizer?viewer(“registration?Viewer“);
pcl::visualization::PointCloudColorHandlerCustom?src_h(pcd_src?0?255?0);
pcl::visualization::PointCloudColorHandlerCustom?tgt_h(pcd_tgt?255?0?0);
pcl::visualization::PointCloudColorHandlerCustom?final_h(pcd_final?0?0?255);
viewer.setBackgroundColor(255?255?255);
viewer.addPointCloud(pcd_src?src_h?“source?cloud“);
viewer.addPointCloud(pcd_tgt?tgt_h?“tgt?cloud“);
viewer.addPointCloud(pcd_final?final_h?“final?cloud“);
while?(!viewer.wasStopped())
{
viewer.spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
}
//由旋轉平移矩陣計算旋轉角度
void?matrix2angle(Eigen::Matrix4f?&result_trans?Eigen::Vector3f?&result_angle)
{
double?ax?ay?az;
if?(result_trans(2?0)?==?1?||?result_trans(2?0)?==?-1)
{
az?=?0;
double?dlta;
dlta?=?atan2(result_trans(0?1)?result_trans(0?2));
if?(result_trans(2?0)?==?-1)
{
ay?=?M_PI?/?2;
ax?=?az?+?dlta;
}
else
{
ay?=?-M_PI?/?2;
ax?=?-az?+?dlta;
}
}
else
{
ay?=?-asin(result_trans(2?0));
ax?=?atan2(result_trans(2?1)?/?cos(ay)?result_trans(2?2)?/?cos(ay));
az?=?atan2(result_trans(1?0)?/?cos(ay)?result_trans(0?0)?/?cos(ay));
}
result_angle?<
cout?<“x軸旋轉角度:“?< cout?<“y軸旋轉角度:“?< cout?<“z軸旋轉角度:“?<}
int?main(int?argc?char**?argv)
{
//加載點云文件
PointCloud::Ptr?cloud_src_o(new?PointCloud);//原點云,待配準
pcl::io::loadPCDFile(“E:/vs13/pcldata/bun/rabbit.pcd“?*cloud_src_o);
PointCloud::Ptr?cloud_tgt_o(new?PointCloud);//目標點云
pcl::io::loadPCDFile(“E:/vs13/pcldata/bun/rabbit_1.pcd“?*cloud_tgt_o);
clock_t?start?=?clock();
//去除NAN點
std::vector?indices_src;?//保存去除的點的索引
pcl::removeNaNFromPointCloud(*cloud_src_o?*cloud_src_o?indices_src);
std::cout?<“remove?*cloud_src_o?nan“?<
std::vector?indices_tgt;
pcl::removeNaNFromPointCloud(*cloud_tgt_o?*cloud_tgt_o?indices_tgt);
std::cout?<“remove?*cloud_tgt_o?nan“?<
//下采樣濾波
pcl::VoxelGrid?voxel_grid;
voxel_grid.setLeafSize(0.012?0.012?0.012);
voxel_grid.setInputCloud(cloud_src_o);
PointCloud::Ptr?cloud_src(new?PointC
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????8813??2019-03-04?20:04??fpfh+icp.cpp
-----------?---------??----------?-----??----
?????????????????8813????????????????????1
- 上一篇:制作護照內容的字體庫文件
- 下一篇:基于H.265的RTP封裝
評論
共有 條評論