我有一个问题,我有一个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;
}
我猜问题出在最后一行,我分配最小和最大点,但我不知道如何消除倾斜的对象。
1条答案
按热度按时间xmq68pz91#
对于鸟瞰图结果,可以考虑使用最小点和最大点的x,y坐标的2D边界框。
这假定坐标系使用垂直于地平面的z轴。