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()
发布了27 篇原创文章 · 获赞 4 · 访问量 4538

猜你喜欢

转载自blog.csdn.net/SGL_LGS/article/details/100998948
今日推荐