#include #include <pcl/io/ply_io.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/point_types.h> #include <pcl/visualization/cloud_viewer.h>

void stemDiameter() { // 导入点云文件 pcl::PointCloudpcl::PointXYZRGB::Ptr cloud(new pcl::PointCloudpcl::PointXYZRGB); pcl::io::loadPLYFilepcl::PointXYZRGB("D:\DIANYUNWENJIANJIA\test_ply.ply", *cloud);

// 提取索引号为43的点的y值
float y = cloud->points[43].y;

// 取y值大于这个点的5cm的所有点
pcl::PointCloud<pcl::PointXYZRGB>::Ptr filteredCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
for (size_t i = 0; i < cloud->points.size(); ++i) {
	if (cloud->points[i].y > (y + 0.05)) {
		filteredCloud->points.push_back(cloud->points[i]);
	}
}
filteredCloud->width = filteredCloud->points.size();
filteredCloud->height = 1;

// 将筛选出的茎点云数据分为八个切片
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> slices;
for (float thickness = 0.02; thickness <= 0.1; thickness += 0.01) {
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr slice(new pcl::PointCloud<pcl::PointXYZRGB>);
	for (size_t i = 0; i < filteredCloud->points.size(); ++i) {
		if (filteredCloud->points[i].y > (y + thickness - 0.01) && filteredCloud->points[i].y < (y + thickness)) {
			slice->points.push_back(filteredCloud->points[i]);
		}
	}
	slice->width = slice->points.size();
	slice->height = 1;
	slices.push_back(slice);
}

// 对每个切片上的点云数据进行投影到X-Z平面
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> projectedClouds;
for (size_t i = 0; i < slices.size(); ++i) {
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr projectedCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	for (size_t j = 0; j < slices[i]->points.size(); ++j) {
		pcl::PointXYZRGB point;
		point.x = slices[i]->points[j].x;
		point.y = 0;
		point.z = slices[i]->points[j].z;
		projectedCloud->points.push_back(point);
	}
	projectedCloud->width = projectedCloud->points.size();
	projectedCloud->height = 1;
	projectedClouds.push_back(projectedCloud);
}

// 可视化
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Stem Diameter"));
viewer->setBackgroundColor(0, 0, 0);
viewer->initCameraParameters();

for (size_t i = 0; i < projectedClouds.size(); ++i) {
	pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(projectedClouds[i]);
	viewer->addPointCloud<pcl::PointXYZRGB>(projectedClouds[i], rgb, "cloud" + std::to_string(i));
}

while (!viewer->wasStopped()) {
	viewer->spinOnce(100);
	boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}

}

int main() { stemDiameter(); return 0; }

PCL点云数据处理:茎直径计算和可视化

原文地址: https://www.cveoy.top/t/topic/p2j8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录