从点云中的质心绘制矢量
Draw a vector from the centroid in point cloud
我找到了一个簇的质心和特征向量。
如何在 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");
3D中的直线方程可以由一个点和一个向量来定义。只需插入质心作为点 (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 的样本值)以确定沿直线的各个点。例如 0 的 S 给你你的质心点,而 S = 1 给你在 (10i, -4j, -3k)
同一条线上的另一个点
您可以绘制一个从质心原点到 eigen_vectors 端点的箭头。但首先你需要将你的 eigen_vectors 和质心映射到依赖于原点(质心)的 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");
我找到了一个簇的质心和特征向量。 如何在 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");
3D中的直线方程可以由一个点和一个向量来定义。只需插入质心作为点 (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 的样本值)以确定沿直线的各个点。例如 0 的 S 给你你的质心点,而 S = 1 给你在 (10i, -4j, -3k)
同一条线上的另一个点您可以绘制一个从质心原点到 eigen_vectors 端点的箭头。但首先你需要将你的 eigen_vectors 和质心映射到依赖于原点(质心)的 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");