从点云中的质心绘制一个矢量

Draw a vector from the centroid in point cloud

本文关键字:一个 绘制      更新时间:2023-10-16

我已经找到了聚类的质心和特征向量。如何在pcl可视化工具中从质心绘制矢量。

    Eigen::Vector4f centroid;
    Eigen::Matrix3f covariance_matrix;
    // Extract the eigenvalues and eigenvectors
    Eigen::Vector3f eigen_values;
    Eigen::Matrix3f eigen_vectors;
    pcl::compute3DCentroid(*cloud_filtered,cluster_indices[i],centroid);
    // Compute the 3x3 covariance matrix
    pcl::computeCovarianceMatrix (*cloud_filtered, centroid, covariance_matrix);
    pcl::eigen33 (covariance_matrix, eigen_vectors, eigen_values);
    _viewer->addLine<pcl::PointXYZRGB> (centroid, eigen_vectors, "line");

您可以绘制一个从质心orgin到本征向量端点的箭头。但首先你需要将你的本征向量和质心映射到一个依赖于组织(质心)的PointXYZ中:

Eigen::vector < PointXYZ > centroidXYZ_value, Point1_value,....;
PointXYZ centroidXYZ;
centroidXYZ.getVector4fMap() = centroid;
PointXYZ Point1 = PointXYZ((centroid(0) + eigen_vectors.col(0)(0)), (centroid(1) + eigen_vectors.col(0)(1)), (centroid(2) + eigen_vectors.col(0)(2)));

对其他导演也这样做然后:

centroidXYZ_value.push_back(centroidXYZ);
Point1_value.push_back(Point1);

现在你可以画了:

_viewer->addArrow(Point1_value.at(i), centroidXYZ_value.at(i), 0.5, 0.5, 0.5, false, "Arrow1");
_viewer->addArrow(Point2_value.at(i), centroidXYZ_value.at(i), 0.5, 0.5, 0.5, false, "Arrow2");

三维直线方程可以由点和矢量定义。只需将质心插入点(x,y,z),将特征向量插入向量(i,j,k)。。。。例如

point1 at (3, 2, -5)  # your centroid
vectorA of (7i, -6j, 2k)  #  your eigenvector

可以定义直线的方程式

r = (3i, 2j, -5k) + S(+7i, -6j, 2)

其中变量S连续自由变化(样本值S=-4.9或S=0.03),以确定沿线的各个点。例如,S为0会给你质心点,而S=1会给你在(10i,-4j,-3k)的同一条线上的另一个点