PCL:自定义创建带颜色的点云保存后rgb是一个很大的数,由x y z rgb解包为x y z r g b
由于實驗需要自己需要從3D相機中讀取數據并保存為pcd格式,
下面是一部分讀取并保存的代碼,以及最后保存結果,但是在保存為pcd的時候發現是這個樣子:
?(如上代碼為PCD文件中的頭文件,TYPE中的”U“就代表顏色信息的存儲格式
言歸正傳,如何將一個數值拆分成單個的RGB數)pcd里邊的rgb是連在一起的不是我們平時看到的r g b分開的。
官網鏈接:http://pointclouds.org/documentation/structpcl_1_1_r_g_b.html
另外一種TYPE是F F F F的:
當rgb的數據類型是U的時候,也就是rgb對應的type值rgb = R<<16 | G<<8 | B | 1<<24其中RGB的值的范圍是[0,255]
下面介紹該文件每行具體所代表的含義:
(1).VERSION 0.7
? ? 指定pcd文件的版本。
(2).FIELDS
? ? 指定每個點可以具有的維度,以及每個維度所代表的含義。
? ? 例如:FIELDS x y z r g b表示該點的位置信息(x,y,z),顏色信息(r,g,b)。
(3).SIZE
? ? 以字節為單位指定每個數據所占用的內存。
(4).TYPE
? ? 指定每個數據的數據類型。
? ? I:可表示int8,int16,int32。
? ? U:可表示uint8,unit16,uint32。
? ? F:表示float(上圖所用的為浮點類型)。
(5).COUNT
? ? 指定每個維度有多少元素。
? ? 例如xyz數據通常只有一個元素。
(6).WIDTH
? ? 指定數據點的寬度,它包含兩個含義:
? ? 1.可指定點云總個數(與POINTS相同),用于無組織的數據。
? ? 2.可指定有組織點云數據的寬度(連續點的總數)。
(7).HEIGTH
? ? 指定數據點的高度,它包含兩個含義:
? ? 1.可指定有組織的點云數據的高度(總行數)。
? ? 2.對未組織的數據,它被設置為1。
(8).POINTS
? ? 指定點云總個數。
(9).VIEWPOINT
? ? 采集數據時的視點(由平移tx,ty,tz和四元數qw,qx,qy,qz組成)。
(10).DATA
? ? 點云數據存儲的數據類型(支持ascii和binary)。
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7 //PCD文件版本
FIELDS x y z r g b intensity timestamp //每個點包含哪些維度,xyz表示XYZ三維坐標,rgb表示顏色(可以分開表示,也可以一個浮點數表示),intensity表示激光反射強度,timestamp表示時間戳,normal_x、normal_y、normal_z表示平面法線三維坐標,j1、j2、j3表示不變矩。
SIZE 4 4 4 1 1 1 1 8 //每個維度的數據占用字節大小
TYPE F F F U U U U F //每個維度的數據類型,I表示有符號類型int8(char)、int16(short)、int32(int),U表示無符號類型uint8(unsigned char)、uint16(unsigned short)、uint32(unsigned int),F表示浮點型
COUNT 1 1 1 1 1 1 1 1 //每個維度含有多少個元素(如果未提供COUNT屬性,默認值為1)
WIDTH 32 //用點的數量表示點云數據集的寬度。有兩種含義:1.無序數據集的點云中點的數量 2.有序點云數據集的寬度(一行中點的數量),有序點云數據集中,點云類似圖片或矩陣的結構,分為行和列,這種數據通常來自于立體攝像機(stereo camera)、時間飛行攝像機(Time Of Flight camera,使用紅外線或者光脈沖來估計光線從發射到檢測到的時間延遲來測量距離),知道點的相鄰關系,使算法計算更高效。
HEIGHT 2172 //用點云數據集中點的數量表示點云數據集的高度。高度有如下兩種含義:1.有序的點云數據集中,行的數量 2.無序點云數據集中,高度為1(可以用來判斷一個數據集是有序的還是無序的)
VIEWPOINT 0 0 0 1 0 0 0 //指定數據集合中點的采集視點。可以用來后續可能的坐標轉換,或者求平面法線坐標。格式是平移(tx ty tz) + 四元數(qw qx qy qz),默認是0 0 0 1 0 0 0。
POINTS 69504 //點云中點的總數(冗余字段)
DATA binary_compressed //點云數據的存儲類型,0.7版本支持兩種存儲方式:ascii和binary。
3 總結
? ? 所有的pcd文件前十行必須是以上的格式,并且不能改變順序。
最后查找原因是因為如下:(就是把RGB三個值通過位運算合一起了,你搜索 生成帶有rgb值的pcd文件并顯示?就可以看到說明)
?
所以需要再處理一下。
對于常用的點云PCD文件,存儲顏色信息通常由兩種格式:
TYPE1:10727339
TYPE2:1.00512e-038
兩種類型的區別只是保存的格式不一樣,TYPE1是float形式,TYPE2是int形式,都是用的位存儲。
言歸正傳,如何將一個數值拆分成單個的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可讀文件。
解決辦法:參考鏈接:https://blog.csdn.net/wkxxuanzijie920129/article/details/51433626
https://blog.csdn.net/weixin_36642958/article/details/83628915?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control
pcd文件中的格式為x y z rgb而不是分開的r g b,所以在原數據的基礎上要進行變形,//1、由r g b得到rgb(float):
int rgb = ((int)r << 16 | (int)g << 8 | (int)b); //式中的“<<”為左移符號;//2、由rgb得到r g b(int):將PCD文件中用一個數值表示的RGB信息拆分成RGB三通道信息:
int r = (rgb >> 16) & 0x0000ff;
int g = (rgb >> 8) & 0x0000ff;
int b = (rgb) & 0x0000ff;
下面是對應不同的程序得到的pcd格式:
for (int i = 0; i < cloudrgb->points.size(); i++){cloudrgb->points[i].x = (float)rgb_cloud[6 * i + 0] / cloud_unit;cloudrgb->points[i].y = (float)rgb_cloud[6 * i + 1] / cloud_unit;unsigned short z = (unsigned short)rgb_cloud[6 * i + 2];//2對應Zcloudrgb->points[i].z = (float)z / cloud_unit;//(這里再將它存為pcd格式)/*cloudrgb->points[i].r = rgb_cloud[6 * i + 3];cloudrgb->points[i].g = rgb_cloud[6 * i + 4];cloudrgb->points[i].b = rgb_cloud[6 * i + 5];*///由r g b得到rgb(float):int frgb = 0;frgb = ((int)rgb_cloud[6 * i + 3] << 16 | (int)rgb_cloud[6 * i + 4] << 8 | (int)rgb_cloud[6 * i + 5]);cloudrgb->points[i].rgb = *reinterpret_cast<float*>(&frgb);//frgb在這由int型轉換成了float型。//reinterpret_cast()為指針類型轉換}
std::string namergb = "F:\\coutsaved\\tongling\\zhiwei\\lianxupcd\\XYZRGB\\two\\test" + std::to_string(m) + ".pcd";
pcl::io::savePCDFileASCII(namergb, *cloudrgb);//保存
保存結果:
?
總結
以上是生活随笔為你收集整理的PCL:自定义创建带颜色的点云保存后rgb是一个很大的数,由x y z rgb解包为x y z r g b的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C内存2:内存分区
- 下一篇: PCL:点云配准1、基础知识:平面3自由