PCL教程指南-判断点的邻域范围是否为平面
- 用于过滤平面结构或者说判断是否点邻域范围是否为平面
- 两种方法:
- 在某点邻域范围内进行RANSAC
- OBB包围盒坐标值差距
- 以下给出两种方法的核心代码
RANSAC判断邻域范围是否为平面
pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_p (new pcl::SampleConsensusModelPlane<pcl::PointXYZ> (cloud,pointIdxNKNSearch));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_p);
ransac.setDistanceThreshold (0.000000001);
ransac.setMaxIterations(1);
ransac.computeModel();
std::vector<int> inliers;
ransac.getInliers(inliers);
cout<<inliers.size()<<endl;
OBB包围盒判断邻域范围是否为平面
int sum=pointIdxNKNSearch.size();
Eigen::Matrix<float,3,Eigen::Dynamic> kMatrix;
kMatrix.resize(3,sum);
for (int i = 0; i < pointIdxNKNSearch.size(); ++i) {
kMatrix.col(i)=cloud->points[pointIdxNKNSearch[i]].getVector3fMap();
}
Eigen::MatrixXf meanval=kMatrix.rowwise().mean();
kMatrix.colwise()-=(Eigen::VectorXf)meanval;
Eigen::Matrix<float,3,3> covMatrix;
covMatrix=(kMatrix*kMatrix.transpose())/sum;
Eigen::EigenSolver<Eigen::Matrix<float,3,3>> eigen_solver(covMatrix,true);
Eigen::Matrix<float,3,3> eigenVectors=eigen_solver.eigenvectors().real();
Eigen::Matrix<float,3,1> eigenValues =eigen_solver.pseudoEigenvalueMatrix().diagonal();
sortEigenVectorByValues(eigenValues, eigenVectors);
Eigen::Matrix<float,Eigen::Dynamic,3> obbMatrix;
obbMatrix=kMatrix.transpose()*eigenVectors;
double minv=(obbMatrix.colwise().maxCoeff()-obbMatrix.colwise().minCoeff()).minCoeff();
cout<<minv<<endl;
void sortEigenVectorByValues(Eigen::Matrix<float,3, 1>& eigenValues, Eigen::Matrix<float,3,3>& eigenVectors) {
std::vector<std::tuple<double, Matrix<float, 3,1 >>> eigenValueAndVector;
int size = static_cast<int>(eigenValues.size());
eigenValueAndVector.reserve(size);
for (int i = 0; i < size; ++i)
eigenValueAndVector.push_back(std::tuple<double, Matrix<float, 3,1 >>(eigenValues[i], eigenVectors.col(i)));
std::sort(eigenValueAndVector.begin(), eigenValueAndVector.end(),
[&](const std::tuple<double, Matrix<float, 3,1 >>& a, const std::tuple<double, Matrix<float, 3,1 >>& b) -> bool {
return std::get<0>(a) > std::get<0>(b);
});
for (int i = 0; i < size; ++i) {
eigenVectors.col(i).swap(std::get<1>(eigenValueAndVector[i]));
}
}