pcl案例2 叶片与根茎的分离step2

1,半径滤波,打散茎与叶片

2,聚簇按距离分离

3,按x轴外包围abb的最大值选出茎

4,旋转obb进行cropbox分离整个茎体

效果是这样的

//step2 begin
	//半径滤波
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_rem = radius_remove_filter < pcl::PointXYZ >(cloud_trans1, 0.002, 75);
	show_pointcloud<pcl::PointXYZ>(cloud_rem, 1, 0);

	//距离聚簇,在halcon3d里是connection_object_model_3d  别人封装好的就是好使
	vector < pcl::PointCloud <pcl::PointXYZ>::Ptr> cloud_ptr_vector = connection_cloud<pcl::PointXYZ>(cloud_rem, 0.001, 1000, 9999999);
	cout << cloud_ptr_vector.size() << endl;

	//根据特征 x方向的高度,选择出出茎部的位置
	float a = 0;
	int index = 0;
	//pcl::PointXYZ p_min, p_max;
	for (int i=0;i<cloud_ptr_vector.size();i++)
	{
		//show_pointcloud<pcl::PointXYZ>(cloud_ptr_vector[i], 1, 0);
		pcl::getMinMax3D(*cloud_ptr_vector[i], p_min, p_max);
			if (p_max.x -p_min.x >a)
			{
				a = p_max.x - p_min.x;
				index = i;
			}
	}

	//show_pointcloud < pcl::PointXYZ >(cloud_ptr_vector[index], 4, 0);


	//下采样,计算obb包围盒
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_down1 = down_sample<pcl::PointXYZ>(cloud_ptr_vector[index], 0.5);
	//show_pointcloud < pcl::PointXYZ >(cloud_down1, 4, 0);
	pcl::PointXYZ center;
	Eigen::Affine3f trans_matrix2 = get_trans_obb<pcl::PointXYZ>(cloud_down1, p_min, p_max, center);
	
	p_min.x = p_min.x - 0.2;
	p_min.y = p_min.y *1.2;
	p_min.z = p_min.z *1.2 ;
	p_max.x = p_max.x + 0.2;
	p_max.y = p_max.y * 1.2;
	p_max.z = p_max.z * 1.2;

	pcl::PointCloud<pcl::PointXYZ>::Ptr plant_stem(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::CropBox<pcl::PointXYZ> crop_box;
	//crop_box.setInputCloud(cloud_trans1);
	
	crop_box.setInputCloud(cloud_trans1);
	crop_box.setMin(p_min.getArray4fMap());
	crop_box.setMax(p_max.getArray4fMap());
	crop_box.setTransform(trans_matrix2); //这里输入的矩阵就是将点云转正的矩阵。也可以理解为在crop时,是将点云以0bb矩阵转到00点后根军p_min和p_max进行裁剪的。
	crop_box.filter(*plant_stem);
	cout << plant_stem->points.size() << endl;
	show_pointcloud<pcl::PointXYZ>(plant_stem, 3, 0);
	//setp2 end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值