要做的是这个样子的

2_1,
1)随机先下采样
2)对下采样点云计算obb矩阵
3)将点云旋转到00点
4)点云沿x正方向平移
5)直通滤波去除花底

int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 加载bun0.pcd文件,加载的文件在 PCL的测试数据中是存在的 pcl::io::loadPLYFile("D:\\Desktop\\pacl_learning\\case2plant\\plant.ply", *cloud);//先下采样,数据太大,计算obb矩阵会特别慢。cloud_down只用于伴随计算pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_down = down_sample<pcl::PointXYZ>(cloud,0.02);cout << cloud_down->points.size() << endl;//1,先进行转正pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_trans0 (new pcl::PointCloud<pcl::PointXYZ>);Eigen::Affine3f trans_matrix = get_trans_obb<pcl::PointXYZ>(cloud_down);pcl::transformPointCloud(*cloud_down, *cloud_down, trans_matrix);//移动palant全部到x的00点以上pcl::PointXYZ p_min, p_max;pcl::getMinMax3D(*cloud_down, p_min, p_max);Eigen::Affine3f trans_x = Eigen::Affine3f::Identity();//过0点后往下移了高度的0.2float plant_height = p_max.x - p_min.x;float x_trans = 0 - p_min.x + 0.2;trans_x.translate(Eigen::Vector3f (x_trans,0, 0) );pcl::transformPointCloud(*cloud_down, *cloud_down, trans_x);//把整个点云移过来,并记住这个trans_all,以后可以旋转回去Eigen::Affine3f trans_all = trans_x * trans_matrix;pcl::transformPointCloud(*cloud, *cloud_trans0, trans_all);//show_pointcloud<pcl::PointXYZ>(cloud_trans0, 0.1);//去掉根部pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_trans1(new pcl::PointCloud<pcl::PointXYZ>);pcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud_trans0);pass.setFilterLimits(0, (p_max.x - p_min.x) * 0.7+0.2);pass.setFilterFieldName("x");pass.filter(*cloud_trans1);cout << "花的高度在x轴是——" << plant_height << endl;show_pointcloud<pcl::PointXYZ>(cloud_trans1, 1,0);
}