本文主要是介绍点云去质心 pcl,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
日期:2021/12/2
参考链接:http://it.ckcest.cn/article-3992715-1.html
代码
网上公开的点云去质心的程序比较少,此处结合实际应用对参考程序进行修改,代码如下:
#include <pcl/io/pcd_io.h>
#include <pcl/common/centroid.h>
#include <iostream>#include <vtkAutoInit.h>
#include <pcl/io/io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h> //loadPolygonFileOBJ所属头文件;
#include <pcl/visualization/pcl_visualizer.h>using namespace std;int main()
{//加载点云,此处输入为.obj文件std::string fileName = "/home/sun/Fast_RNRR/data/test/source.obj"; //输入文件地址; pcl::PolygonMesh meshData; //读取原始数据pcl::io::loadPolygonFile(fileName,meshData);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in;cloud_in.reset(new pcl::PointCloud<pcl::PointXYZ>);pcl::fromPCLPointCloud2(meshData.cloud, *cloud_in);//将obj数据转换为点云数据// if (pcl::io::loadPCDFile(fileName, *cloud_in) < 0)// {// PCL_ERROR("该点云文件不存在!");// return -1;// }//计算输入点云质心Eigen::Vector4f centroid_in;pcl::compute3DCentroid(*cloud_in, centroid_in);cout << "质心坐标为:" << "core_x:" << centroid_in[0] << endl << "core_y:" << centroid_in[1] << endl << "core_z:" << centroid_in[2] << endl;/*-----执行去质心-----*///方式1:调用demeanPointCloud()函数pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out1(new pcl::PointCloud<pcl::PointXYZ>);pcl::demeanPointCloud(*cloud_in, centroid_in, *cloud_out1);//计算去质心后点云质心Eigen::Vector4f centroid_out1;pcl::compute3DCentroid(*cloud_out1, centroid_out1);cout << "方式1去质心后质心坐标为:" << "core_x:" << centroid_out1[0] << endl << "core_y:" << centroid_out1[1] << endl << "core_z:" << centroid_out1[2] << endl;//方式2:循环实现pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out2(new pcl::PointCloud<pcl::PointXYZ>);*cloud_out2 = *cloud_in;for (size_t i = 0; i < cloud_in->size(); ++i){cloud_out2->points[i].x = cloud_in->points[i].x - centroid_in[0];cloud_out2->points[i].y = cloud_in->points[i].y - centroid_in[1];cloud_out2->points[i].z = cloud_in->points[i].z - centroid_in[2];}//计算去质心后点云质心Eigen::Vector4f centroid_out2;pcl::compute3DCentroid(*cloud_out2, centroid_out2);cout << "方式2去质心后质心坐标为:" << "core_x:" << centroid_out2[0] << endl << "core_y:" << centroid_out2[1] << endl << "core_z:" << centroid_out2[2] << endl;//两种去质心方式的比较cout << "两种去质心方式的差值:" << endl;cout << "delt_x=" << centroid_out1[0] - centroid_out2[0] << endl << "delt_y=" << centroid_out1[1] - centroid_out2[1] << endl << "delt_z=" << centroid_out1[2] - centroid_out2[2] << endl;//保存去质心后点云if (!cloud_out1->empty()){//保存的文件名为cloud0.pcd,默认保存位置为build文件夹下pcl::io::savePCDFileBinary("cloud0.pcd", *cloud_out1); }return 0;
}
运行结果
程序运行结果如下:
结果分析
根据理论分析,点云去质心之后的质心坐标应该是(0,0,0),可是实际的结果却不是零,而是一个接近零的数,这是合理的,因为计算机的结果是数值解,会存在截断误差。
这篇关于点云去质心 pcl的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!