PCL 1.8.1 中 CloudViewer 类 spin() 函数报错的解决方法
"在PCL 1.8.1中,pcl::visualization::CloudViewer类没有spin()成员函数,因此在代码中使用会导致报错。\n\n解决方法是使用pcl::visualization::PCLVisualizer类来替代pcl::visualization::CloudViewer类,并使用pcl::visualization::PCLVisualizer::spin()函数来实现可视化。\n\n以下是修改后的代码:\n\ncpp\nvoid stemDiameter() {\n // 导入点云文件\n pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);\n pcl::io::loadPLYFile<pcl::PointXYZRGB>("D:\\DIANYUNWENJIANJIA\\test_ply.ply", *cloud);\n\n // 提取索引号为43的点的y值\n float y = cloud->points[43].y;\n\n // 取y值大于这个点的5cm的所有点\n pcl::PointCloud<pcl::PointXYZRGB>::Ptr filteredCloud(new pcl::PointCloud<pcl::PointXYZRGB>);\n for (size_t i = 0; i < cloud->points.size(); ++i) {\n if (cloud->points[i].y > (y + 0.05)) {\n filteredCloud->points.push_back(cloud->points[i]);\n }\n }\n filteredCloud->width = filteredCloud->points.size();\n filteredCloud->height = 1;\n\n // 将筛选出的茎点云数据分为八个切片\n std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> slices;\n for (float thickness = 0.02; thickness <= 0.1; thickness += 0.01) {\n pcl::PointCloud<pcl::PointXYZRGB>::Ptr slice(new pcl::PointCloud<pcl::PointXYZRGB>);\n for (size_t i = 0; i < filteredCloud->points.size(); ++i) {\n if (filteredCloud->points[i].y > (y + thickness - 0.01) && filteredCloud->points[i].y < (y + thickness)) {\n slice->points.push_back(filteredCloud->points[i]);\n }\n }\n slice->width = slice->points.size();\n slice->height = 1;\n slices.push_back(slice);\n }\n\n // 对每个切片上的点云数据进行投影到X-Z平面\n std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> projectedClouds;\n for (size_t i = 0; i < slices.size(); ++i) {\n pcl::PointCloud<pcl::PointXYZRGB>::Ptr projectedCloud(new pcl::PointCloud<pcl::PointXYZRGB>);\n for (size_t j = 0; j < slices[i]->points.size(); ++j) {\n pcl::PointXYZRGB point;\n point.x = slices[i]->points[j].x;\n point.y = 0;\n point.z = slices[i]->points[j].z;\n projectedCloud->points.push_back(point);\n }\n projectedCloud->width = projectedCloud->points.size();\n projectedCloud->height = 1;\n projectedClouds.push_back(projectedCloud);\n }\n\n // 可视化\n boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Stem Diameter"));\n viewer->setBackgroundColor(0, 0, 0);\n viewer->initCameraParameters();\n\n for (size_t i = 0; i < projectedClouds.size(); ++i) {\n pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(projectedClouds[i]);\n viewer->addPointCloud<pcl::PointXYZRGB>(projectedClouds[i], rgb, "cloud" + std::to_string(i));\n }\n\n while (!viewer->wasStopped()) {\n viewer->spinOnce(100);\n boost::this_thread::sleep(boost::posix_time::microseconds(100000));\n }\n}\n\n\n在修改后的代码中,我们使用了pcl::visualization::PCLVisualizer类来创建可视化窗口,并使用pcl::visualization::PCLVisualizer::addPointCloud()函数来添加点云数据到窗口中。同时,使用while循环和pcl::visualization::PCLVisualizer::spinOnce()函数来保持窗口的持续显示。\n\n注意:修改后的代码可能还需要包含其他必要的头文件,具体根据实际情况进行添加。
原文地址: https://www.cveoy.top/t/topic/p2iI 著作权归作者所有。请勿转载和采集!