#include #include <pcl/io/ply_io.h> #include <pcl/point_types.h> #include <pcl/common/pca.h> #include <pcl/segmentation/sac_segmentation.h> #include <pcl/visualization/cloud_viewer.h>

using namespace std;

int main() { //------------------------------输入点云----------------------------------- pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); if (pcl::io::loadPLYFilepcl::PointXYZ("D:\DIANYUNWENJIANJIA\newkruskal2_ply.ply", *cloud) < 0) { PCL_ERROR("读取文件错误"); return -1; } //---------------------------------PCA------------------------------------- pcl::PCApcl::PointXYZ pca; pca.setInputCloud(cloud);

// 获取特征值对应的特征向量
Eigen::RowVector3f V1 = pca.getEigenVectors().col(0);
Eigen::RowVector3f V2 = pca.getEigenVectors().col(1);
Eigen::RowVector3f V3 = pca.getEigenVectors().col(2);

//---------------------------直线的点向式---------------------------------
float m = V1[0], n = V1[1], p = V1[2];
float x0 = pca.getMean()[0], y0 = pca.getMean()[1], z0 = pca.getMean()[2];
cout << "直线的方向向量为:" << V1 << "\n"
    << "\n直线上一点的坐标为:" << pca.getMean().head<3>().transpose() << endl;

//---------------------------直线的一般式---------------------------------
Eigen::Matrix<float, 2, 3> A;
A.row(0) = V2;
A.row(1) = V3;
Eigen::Vector3f sigma = pca.getMean().head<3>();
Eigen::Vector2f b = A * sigma;

cout << "\n直线的一般式为:\n"
    << V2[0] << "x+(" << V2[1] << "y)+(" << V2[2] << "z)=" << b[0] << "\n"
    << V3[0] << "x+(" << V3[1] << "y)+(" << V3[2] << "z)=" << b[1] << endl;

//----------------------------点云可视化----------------------------------
pcl::visualization::PCLVisualizer viewer;
viewer.addPointCloud(cloud, "cloud");  // 加载比对点云
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> line_color(cloud, 255, 0, 0);
viewer.addPointCloud(cloud, line_color, "line");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "line");

//--------------------------拟合直线可视化--------------------------------
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
//获取直线模型系数
coefficients->values.push_back(x0);
coefficients->values.push_back(y0);
coefficients->values.push_back(z0);
coefficients->values.push_back(m);
coefficients->values.push_back(n);
coefficients->values.push_back(p);

//可视化拟合出来的直线
viewer.setWindowName("最小二乘拟合空间直线");
viewer.addLine(*coefficients, "line");
viewer.spin();

//----------------------------输出点云-----------------------------------
pcl::io::savePLYFile("D:\\DIANYUNWENJIANJIA\\最小二乘法拟合直线_ply.ply", *cloud);

return 0;
#include iostream#includepcliopcd_ioh#includepclpoint_typesh#includepclcommonpcah#include pclsegmentationsac_segmentationh#include pclvisualizationcloud_viewerhusing namespace std;int main	-----------

原文地址: https://www.cveoy.top/t/topic/ihBr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录