pcl 计算协方差矩阵的特征值和特征向量精度不高的问题

说明


  • pcl 库依赖 Eigen 第三方库,但是实践表明,Eigen 库的 Eigen::SelfAdjointEigenSolver 求的特征值和特征向量精度并不是很高,所以要换一种方法来求
  • 主要用到了 pcl::eigen33
// pcl
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/common/common.h>
#include <pcl/common/impl/centroid.hpp>

// pcl 计算邻域协方差矩阵的函数
void computeEigenValuesAndEigenVectors(const pcl::PointCloud<pcl::PointXYZ>::Ptr& input_cloud,
										 pcl::PointXYZ search_point,
										 float search_radius){
	pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
	kdtree.setInputCloud(input_cloud);
	std::vector<int> neighbor_index;
	std::vector<float> neighbor_square_distance;
	if(kdtree.radiusSearch(search_point, search_radius, neighbor_index, neighbor_square_distance) > 0){
		Eigen::Matrix<double, 4, 1> centroid;
		pcl::compute3DCentroid(*input_cloud, neighbor_index, centroid);  // 计算质心
		Eigen::Matrix<double, 3, 3> convariance_matrix;  // 协方差矩阵
		pcl::computeCovarianceMatrix(*input_cloud, neighbor_index, centroid, convariance_matrix);
		Eigen::Matrix3d eigenVectors;
		Eigen::Vector3d eigenValues;
		pcl::eigen33(convariance_matrix, eigenVectors, eigenValues);

		// 自带的求解特征值精度不高
		//Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 3, 3>> eigen_solver(convariance_matrix.transpose()*convariance_matrix);
		//eigenValues = eigen_solver.eigenvalues();

		// 求前两个较大的特征值
		Eigen::Vector3d::Index maxRow, maxCol, minRow, minCol;
		eigenValues.maxCoeff(&maxRow, &maxCol);
		eigenValues.minCoeff(&minRow, &minCol);
		// l1 > l2 > l3
		const double& l1 = eigenValues[maxRow];
		const double& l2 = eigenValues[3 - maxRow - minRow]; // 这个是巧算,基于 0 + 1 + 2 = 3
		const double& l3 = eigenValues[minRow];
	}
}
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值