c++ PCA边界框PCL

jpfvwuh4  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(185)

我有一个问题,我有一个3D云在PCL pcl::PointXYZI,并希望获得PCA盒。有一些实现正在解释其他职位,但在我的情况下,不同的是,我只关心在XY平面的方向,不考虑Z轴旋转。我手头的问题是一辆汽车在城市里行驶,现在我得到这个:

对于一个驾驶问题,我只想考虑从鸟瞰Angular 看障碍物的方向,因此倾斜的障碍物没有意义。(从http://codextechnicanum.blogspot.com/2015/04/find-minimum-oriented-bounding-box-of.html开始)

template<typename PointT>
BoxQ ProcessPointClouds<PointT>::BoundingBoxQ(typename pcl::PointCloud<PointT>::Ptr cluster)
{
    // Find bounding box for one of the clusters
    BoxQ box;
    Eigen::Vector4f pcaCentroid;
    pcl::compute3DCentroid(*cluster, pcaCentroid);
    Eigen::Matrix3f covariance;
    computeCovarianceMatrixNormalized(*cluster, pcaCentroid, covariance);
    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);
    Eigen::Matrix3f eigenVectorsPCA = eigen_solver.eigenvectors();
    eigenVectorsPCA.col(2) = eigenVectorsPCA.col(0).cross(eigenVectorsPCA.col(1));

    Eigen::Matrix4f projectionTransform(Eigen::Matrix4f::Identity());
    projectionTransform.block<3,3>(0,0) = eigenVectorsPCA.transpose();
    projectionTransform.block<3,1>(0,3) = -1.f * (projectionTransform.block<3,3>(0,0) * pcaCentroid.head<3>());
    typename pcl::PointCloud<PointT>::Ptr cloudPointsProjected (new pcl::PointCloud<PointT>);
    pcl::transformPointCloud(*cluster, *cloudPointsProjected, projectionTransform);
    // Get the minimum and maximum points of the transformed cloud.
    PointT minPoint, maxPoint;
    pcl::getMinMax3D(*cloudPointsProjected, minPoint, maxPoint);
    const Eigen::Vector3f meanDiagonal = 0.5f*(maxPoint.getVector3fMap() + minPoint.getVector3fMap());
    // Final transform
    box.bboxQuaternion =  eigenVectorsPCA; //Quaternions are a way to do rotations https://www.youtube.com/watch?v=mHVwd8gYLnI
    box.bboxTransform = eigenVectorsPCA * meanDiagonal + pcaCentroid.head<3>();
    box.cube_length = std::abs(maxPoint.x-minPoint.x);
    box.cube_width = std::abs(maxPoint.y-minPoint.y);
    box.cube_height = std::abs(maxPoint.z-minPoint.z);
    return box;
}

我猜问题出在最后一行,我分配最小和最大点,但我不知道如何消除倾斜的对象。

xmq68pz9

xmq68pz91#

对于鸟瞰图结果,可以考虑使用最小点和最大点的x,y坐标的2D边界框。
这假定坐标系使用垂直于地平面的z轴。

相关问题