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];