如何从点云获取rgb值

时间:2015-11-06 13:33:28

标签: c++ rgb point-cloud-library

我有一个点云。我想得到它的RGB值。我怎么能这样做?
  为了使我的问题更清楚,请参阅代码。

// Load the first input file into a PointCloud<T> with an appropriate type : 
        pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZRGB>);
        if (pcl::io::loadPCDFile<pcl::PointXYZRGB> ("../data/station1.pcd", *cloud1) == -1)
        {
            std::cout << "Error reading PCD file !!!" << std::endl;
            exit(-1);
        }

我希望单独获得每个值

std::cout << " x = " << cloud1->points[11].x << std::endl;
std::cout << " y = " << cloud1->points[11].y << std::endl;
std::cout << " z = " << cloud1->points[11].z << std::endl;
std::cout << " r = " << cloud1->points[11].r << std::endl;
std::cout << " g = " << cloud1->points[11].g << std::endl;
std::cout << " b = " << cloud1->points[11].b << std::endl;

但结果我得到了类似的东西:

 x = 2.33672
 y = 3.8102
 z = 8.86153
 r = �
 g = w
 b = �

1 个答案:

答案 0 :(得分:3)

From the point cloud docs

表示欧几里德xyz坐标和RGB颜色的点结构。

由于历史原因(PCL最初是作为ROS包开发的),RGB信息被打包成一个整数并转换为浮点数。这是我们希望在不久的将来删除的内容,但与此同时,以下代码段应该可以帮助您在RGB结构中打包和解包PointXYZRGB颜色:

// pack r/g/b into rgb
uint8_t r = 255, g = 0, b = 0;    // Example: Red color
uint32_t rgb = ((uint32_t)r << 16 | (uint32_t)g << 8 | (uint32_t)b);
p.rgb = *reinterpret_cast<float*>(&rgb);

要将数据解压缩为单独的值,请使用:

PointXYZRGB p;
// unpack rgb into r/g/b
uint32_t rgb = *reinterpret_cast<int*>(&p.rgb);
uint8_t r = (rgb >> 16) & 0x0000ff;
uint8_t g = (rgb >> 8)  & 0x0000ff;
uint8_t b = (rgb)       & 0x0000ff;

或者,从1.1.0开始,您可以直接使用p.r,p.g和p.b.

文件559的第point_types.hpp行定义。