严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0135 class "pcl::PointXYZI" 没有成员 "r" pointToimg D:\VS2019\VsProject\pointToimg\pointToimg\main.cpp 28
时间: 2023-07-07 14:42:46 浏览: 237
抱歉,我的回答中有误。`pcl::PointXYZI`类型的点云没有`r`、`g`、`b`成员变量,因为它是一个单通道(灰度)点云类型。如果要将intensity信息转换为rgb信息,需要创建一个新的点云类型,例如`pcl::PointXYZRGB`,它包含x、y、z坐标和r、g、b三个颜色通道。下面是修改后的示例代码:
```c++
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main(int argc, char** argv)
{
// 读取点云文件
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
if (pcl::io::loadPCDFile<pcl::PointXYZI>(argv[1], *cloud) == -1) {
PCL_ERROR("Couldn't read file");
return (-1);
}
// 转换为PointXYZRGB类型的点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_rgb(new pcl::PointCloud<pcl::PointXYZRGB>);
cloud_rgb->resize(cloud->points.size());
for (size_t i = 0; i < cloud->points.size(); i++) {
cloud_rgb->points[i].x = cloud->points[i].x;
cloud_rgb->points[i].y = cloud->points[i].y;
cloud_rgb->points[i].z = cloud->points[i].z;
float intensity = cloud->points[i].intensity;
uint8_t r, g, b;
if (intensity < 0.5) {
r = 255 * intensity / 0.5;
g = 255 * (1 - intensity / 0.5);
b = 0;
} else {
r = 255 * (1 - (intensity - 0.5) / 0.5);
g = 0;
b = 255 * (intensity - 0.5) / 0.5;
}
cloud_rgb->points[i].r = r;
cloud_rgb->points[i].g = g;
cloud_rgb->points[i].b = b;
}
// 保存点云文件
pcl::io::savePCDFileASCII(argv[2], *cloud_rgb);
std::cout << "Saved " << cloud_rgb->points.size() << " data points to " << argv[2] << std::endl;
return 0;
}
```
在示例代码中,我们创建了一个新的点云类型`pcl::PointXYZRGB`,并将每个像素的x、y、z坐标和转换后的r、g、b值保存到新的点云中。最后,我们将新的点云保存为点云文件。
阅读全文