我试图从点云中得到一个OBB,使用pcl::MomentOfInertiaEstimation方法我得到了一个正确的结果,.I想用CropBox从OBB中提取点,但是我得到的点比原始的点云少得多,也许我的旋转向量有问题:v,我不确定。有谁可以帮我?
struct BoundingBox{
pcl::PointXYZ min_point_OBB;
pcl::PointXYZ max_point_OBB;
pcl::PointXYZ position_OBB;
Eigen::Matrix3f rotational_matrix_OBB;
pcl::PointXYZ center;
pcl::PointXYZ x_axis;
pcl::PointXYZ y_axis;
pcl::PointXYZ z_axis;
};
BoundingBox getOBB(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,BoundingBox OBB )
{
pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
feature_extractor.setInputCloud (cloud);
feature_extractor.compute ();
feature_extractor.getOBB (OBB.min_point_OBB, OBB.max_point_OBB, OBB.position_OBB, OBB.rotational_matrix_OBB);
return OBB;
}
int main(void){
BoundingBox OBB;
OBB=getOBB(Npoints,OBB); //Npoints is a part of the whole cloud
Eigen::Quaternionf quat (OBB.rotational_matrix_OBB);
Eigen::Vector3f position (OBB.position_OBB.x, OBB.position_OBB.y, OBB.position_OBB.z);
pcl::visualization::PCLVisualizer viewer;
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> points_color_handler (cloud, 255, 255, 255);
viewer.addCube (position, quat, OBB.max_point_OBB.x - OBB.min_point_OBB.x, OBB.max_point_OBB.y - OBB.min_point_OBB.y, OBB.max_point_OBB.z - OBB.min_point_OBB.z,"OBB");
viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME,"OBB");
////////////////above result is correct////////////////////
Eigen::Vector4f max_point_OBB(OBB.max_point_OBB.x,OBB.max_point_OBB.y,OBB.max_point_OBB.z,1.0);
Eigen::Vector4f min_point_OBB(OBB.min_point_OBB.x,OBB.min_point_OBB.y,OBB.min_point_OBB.z,1.0);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZ>);
pcl::CropBox<pcl::PointXYZ> boxfilter;
boxfilter.setMax(max_point_OBB);
boxfilter.setMin(min_point_OBB);
Eigen::Vector3f v = quat.vec();
boxfilter.setTranslation(position);
boxfilter.setRotation(v);
boxfilter.setInputCloud(cloud);
boxfilter.filter (*cloudOut);
/////////cloulOut includes much less points than Npoints///////// 寻找答案!
发布于 2022-09-06 11:45:46
//boxfilter.setTranslation(position);
//boxfilter.setRotation(v);
Eigen::Translation3f translation(position_OBB.x, position_OBB.y, position_OBB.z);
Eigen::Matrix3f rotationMatrixOOB = quat.toRotationMatrix();
Eigen::Affine3f affine3f = translation * rotational_matrix_OBB;
boxfilter.setTransform(affine3f.inverse());https://stackoverflow.com/questions/47466220
复制相似问题