PCL加载.ply文件提示找不到red/green/blue字段问题求助
问题根因
这是PCL库PLY读取模块的内置逻辑导致的:PCL的PLY解析器只要检测到输入PLY文件中同时存在red、green、blue三个uchar类型的顶点属性,就会默认将三个字段合并为一个名为rgb的uint32_t类型复合字段,不会暴露单独的red/green/blue字段供点类型匹配,因此你自定义点类型中单独声明的三个颜色字段无法匹配到对应属性,其余字段不受这个逻辑影响所以可以正常读取。
解决方案
方案1:修改自定义点类型适配RGB合并逻辑(兼容所有PCL版本)
将自定义点类型中单独的红、绿、蓝字段替换为合并的uint32_t类型rgb字段,需要单独获取颜色值时再做位运算拆分即可,不需要修改原有PLY文件:
struct OusterPointS { PCL_ADD_POINT4D; float intensity; std::uint32_t t; std::uint16_t reflectivity; std::uint8_t ring; std::uint16_t noise; std::uint32_t range; std::uint8_t label; std::uint32_t rgb; // 替换原来的三个uchar字段 EIGEN_MAKE_ALIGNED_OPERATOR_NEW } EIGEN_ALIGN16; POINT_CLOUD_REGISTER_POINT_STRUCT(OusterPointS, (float, x, x)(float, y, y)(float, z, z)(float, intensity, intensity) (std::uint32_t, t, t)(std::uint16_t, reflectivity, reflectivity) (std::uint8_t, ring, ring)(std::uint16_t, noise, noise)(std::uint32_t, range, range)(std::uint8_t, label, label) (std::uint32_t, rgb, rgb) // 注册合并后的rgb字段 )
需要单独提取颜色值时使用如下逻辑:
std::uint8_t r = (os_cloud->points[i].rgb >> 16) & 0xFF; std::uint8_t g = (os_cloud->points[i].rgb >> 8) & 0xFF; std::uint8_t b = os_cloud->points[i].rgb & 0xFF;
方案2:使用PLYReader的高级接口关闭RGB合并逻辑(仅支持PCL 1.11及以上版本)
如果你需要保留自定义点类型中单独的red/green/blue字段,不需要修改点类型定义,只需要替换加载文件的代码,手动设置解析参数关闭RGB合并即可:
// 替换原来的pcl::io::loadPLYFile调用 pcl::PLYReader reader; reader.setExtractRGBAsSeparateFields(true); // 关闭RGB自动合并 reader.read(os_path, *os_cloud);
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

