PCL中的RGB拆分与合并

PCL中的RGB拆分与合并

代码功能:将PCD文件中用一个数值表示的RGB信息拆分成RGB三通道信息(反之)

  • 对于常用的点云PCD文件,存储颜色信息通常由两种格式:
TYPE1:10727339
TYPE2:1.00512e-038

两种类型的区别只是保存的格式不一样,TYPE1是float形式,TYPE2是int形式,都是用的位存储

PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z rgba
SIZE 4 4 4 4
TYPE F F F U
COUNT 1 1 1 1
WIDTH 110592
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 110592
DATA ascii
0.02 0.927 1.429 10727339

如上代码为PCD文件中的头文件,TYPE中的”U“就代表颜色信息的存储格式
言归正传,如何将一个数值拆分成单个的RGB数

1、在PCL中读取

int r = cloud->point[i].r;
int g = cloud->point[i].g;
int b = cloud->point[i].b;

2、位操作运算

unsigned long rgb = *reinterpret_cast<int*>(&cloud->points[i].rgb);
int r = (rgb>>16)&0x0000ff;
int g = (rgb>>8)&0x0000ff;
int b = (rgb)&0x0000ff;

如上为拆分方法,有时我们需要将存.txt文档中的点信息和RGB信息转换成PCD可读文件,代码如下(python):

path = os.path.join(ROOT_DIR,'sem_seg/log5/pcd_file', 'out_put_'+str(a)+ '.pcd')
if os.path.exists(path):
    os.remove(path)
Output_Data = open(path, 'a')
# headers
Output_Data.write('# .PCD v0.7 - Point Cloud Data file format\nVERSION 0.7\nFIELDS x y z rgba\nSIZE 4 4 4 4\nTYPE F F F U\nCOUNT 1 1 1 1')
string = '\nWIDTH ' + str(data.shape[0])
Output_Data.write(string)
Output_Data.write('\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0')
string = '\nPOINTS ' + str(data.shape[0])
Output_Data.write(string)
Output_Data.write('\nDATA ascii')
    
# pack RGB
RGB = []
for j in range(data.shape[0]):
    R=colour_map[int(3*c[j])]
    G=colour_map[int(3*c[j]+1)]
    B=colour_map[int(3*c[j]+2)]
    value = (int(R) << 16 | int(G) << 8 | int(B))
    string = ('\n' + str(x[j]) + ' ' + str(y[j]) + ' ' +str(z[j]) + ' ' + str(value))
    Output_Data.write(string)
    
Output_Data.close()
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值