PCL点云数据处理:茎直径计算和可视化
#include
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; }
原文地址: https://www.cveoy.top/t/topic/p2j8 著作权归作者所有。请勿转载和采集!