C++ 主分量特征向量彼此不垂直
我使用下面的代码获得了簇点云的特征向量C++ 主分量特征向量彼此不垂直,c++,point-cloud-library,eigenvector,C++,Point Cloud Library,Eigenvector,我使用下面的代码获得了簇点云的特征向量 for (size_t j = 0; j < cluster_indices.size (); j++){ static int line=0; Eigen::Vector4f centroid; Eigen::Matrix3f covariance_matrix; // Extract the eigenvalues and eigenvectors Eigen::Vector3f eigen_
for (size_t j = 0; j < cluster_indices.size (); j++){
static int line=0;
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[j],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");
std::cout << "centroid:"<<centroid<<std::endl;
cloud_cluster->points.push_back(centroidToPoints(centroid));
for(int i=0; i<3;i++){
std::cout << "eigenvector "<<i<<":"<<eigen_vectors.col(i)<<std::endl;
cloud_cluster->points.push_back(matrixToPoints(eigen_vectors.col(i)));
_viewer->addLine<pcl::PointXYZRGB> (centroidToPoints(centroid), matrixToPoints(eigen_vectors.col(i)), "line"+line);
line++;
}
}
pcl::PointXYZRGB centroidToPoints(Eigen::Vector4f& c){
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_eigen (new pcl::PointCloud<pcl::PointXYZRGB>);
cloud_eigen->width = 15;
cloud_eigen->height = 1;
cloud_eigen->points.resize (cloud_eigen->width * cloud_eigen->height);
cloud_eigen->points[0].x=c[0];
cloud_eigen->points[0].y=c[1];
cloud_eigen->points[0].z=c[2];
//~ pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZRGB> cloud_handler2 (cloud_eigen, "z");
//~ _viewer->addPointCloud<pcl::PointXYZRGB> (cloud_eigen, cloud_handler2, "second cloud");
//~ _viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "second cloud");
return cloud_eigen->points[0];
for(size_t j=0;j添加线(质心,特征向量,“线”);
标准:出口宽度=15;
云特征->高度=1;
云特征->点.resize(云特征->宽度*云特征->高度);
云特征->点[0].x=ev[0];
云特征->点[0],y=ev[1];
云特征->点[0].z=ev[2];
返回云_特征->点[0];
}
但特征向量不垂直。如下所示(绿点和红点是特征向量)
谁能告诉我出了什么问题吗?它们看起来垂直于我。。。特征向量的成分是什么?计算内积
(v_i,v_j)
,看看i!=j
。如果为零,则它们垂直。@wolfPack88-矩形平面:特征向量0:(0.0464242,0.649373,0.759051)特征向量1:(-0.99191,-0.059905,0.111915)特征向量2:(0.118146,-0.758107,0.641339)因为它是一张2d照片,你可以看到它是垂直的。但它不是。@manjunathredya04:特征向量都是相互正交的。做一个点积就可以自己看了;它们的结果都在10^(-7)左右,这很容易用舍入误差来解释。
pcl::PointXYZRGB EigenToPoints(Eigen::DenseBase<Eigen::Matrix<float, 3, 3> >::ColXpr ev){
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_eigen (new pcl::PointCloud<pcl::PointXYZRGB>);
cloud_eigen->width = 15;
cloud_eigen->height = 1;
cloud_eigen->points.resize (cloud_eigen->width * cloud_eigen->height);
cloud_eigen->points[0].x=ev[0];
cloud_eigen->points[0].y=ev[1];
cloud_eigen->points[0].z=ev[2];
return cloud_eigen->points[0];