PCL可视化报错‘Failed to find match for field 'rgba'’求助
问题解析:PCL可视化代码报错"Failed to find match for field 'rgba'"
我来给你拆解下为啥会出现这个错误,以及怎么快速解决:
核心原因:点云数据类型不匹配
你用两个官网示例代码时,忽略了一个关键细节——保存点云和加载点云时使用的点类型不一致:
- 保存点云的代码里,创建的是
pcl::PointCloud<pcl::PointXYZ>类型的点云,这个类型的点只有x、y、z三个坐标字段,完全没有颜色相关的rgba字段。 - 但可视化代码里,你是用
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr来加载点云的,PointXYZRGBA是带颜色信息的点类型,它要求点数据必须包含rgba字段。当程序去读你生成的test_pcd.pcd文件时,发现文件里根本没有这个字段,直接就抛出了Failed to find match for field 'rgba'的错误。
两种解决方案任选其一
方案1:修改可视化代码,匹配保存的点类型
最简单的办法就是让加载点云的类型和保存时一致,把可视化代码里的点云类型改成pcl::PointXYZ就行。修改后的核心代码如下:
int main () { // 把PointXYZRGBA改成PointXYZ,和保存时的类型一致 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile ("test_pcd.pcd", *cloud); pcl::visualization::CloudViewer viewer("Cloud Viewer"); viewer.showCloud(cloud); // 后面的可视化回调函数可以保留,它们和点云类型无关 viewer.runOnVisualizationThreadOnce (viewerOneOff); viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { user_data++; } return 0; }
这样修改后,程序就能正常加载并可视化你的点云了,虽然点没有颜色,但不影响基础的可视化效果。
方案2:修改保存代码,生成带颜色的点云
如果你想要可视化带颜色的点云,可以调整保存代码,生成PointXYZRGBA类型的点云,给每个点添加颜色信息。修改后的核心代码如下:
int main (int argc, char** argv) { // 把PointXYZ改成PointXYZRGBA pcl::PointCloud<pcl::PointXYZRGBA> cloud; cloud.width = 5; cloud.height = 1; cloud.is_dense = false; cloud.points.resize (cloud.width * cloud.height); for (size_t i = 0; i < cloud.points.size (); ++i) { cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f); cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f); cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f); // 给每个点设置随机颜色(r/g/b范围0-255,a是透明度) cloud.points[i].r = rand() % 256; cloud.points[i].g = rand() % 256; cloud.points[i].b = rand() % 256; cloud.points[i].a = 255; } pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud); std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl; // 打印时加上颜色信息 for (size_t i = 0; i < cloud.points.size (); ++i) std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << " | 颜色: " << (int)cloud.points[i].r << "," << (int)cloud.points[i].g << "," << (int)cloud.points[i].b << std::endl; return (0); }
修改后,原来的可视化代码就能直接正常运行,还能看到带颜色的点云。
内容的提问来源于stack exchange,提问作者Schütze
相关产品推荐
相关产品推荐

