这是关于在 pcl 文件中解压缩编码的 rgb 值。我使用 pcl 文档中描述的过程执行此操作,但我得到的解压 rgb 值并不完全正确。当我用 R 绘制它们时,给出的表示与实际设置中的颜色不对应(我在一定程度上确定问题不在于它用 R 绘制的方式)。
例如,在附加的图像中,划定的区域应该有灰色和蓝色(两把椅子和一张桌子)。
源 pcl 文件可在以下位置找到:https ://docs.google.com/open?id=0Bz5-HVcDiF6SanBZU0JWVmJwWHM ,解压后颜色值的文件位于: https ://docs.google.com/open?id=0Bz5 -HVcDiF6SV2pYQ0xUbTAwVmM。以下是用于在 ac plus plus 设置中解压缩颜色值的代码:
uint32_t rgbD = *reinterpret_cast<int*>(&kinectValue);
uint16_t rD = (rgbD >> 16) & 0x0000ff;
uint16_t gD = (rgbD >> 8) & 0x0000ff;
uint16_t bD = (rgbD) & 0x0000ff;
如果您能告诉我哪里出错了,我将不胜感激。
更新:
以下是我在绘制 3D 值时使用的 R 代码片段:
library(rgl)
pcd <- read.table(file.choose(),sep="")
names(pcd) <- c("x","y","z","r","g","b")
plot3d(pcd$x,pcd$y,pcd$z,col=rgb(pcd$r,pcd$g,pcd$b,maxColorValue=255))
更新:
以下是我用 C++ 读取数据的代码:
/*
Reads in a file from Kinect with unpacked color values, filter the color value component and
sends it to be unpacked
*/
int fileRead(){
string line;
int lineNum = 0;
ifstream myfile ("res/OnePerson4.pcd");
if (myfile.is_open())
{
while ( myfile.good() )
{
lineNum++;
getline (myfile,line);
// Exclude the header information in the kinect file from the unpacking process
//if(lineNum > 10 && lineNum <20){//This for loop is activated when testing
if(lineNum > 10){
//Test code to extract the x,y,z values
string xyzvalFromKinectStr = line.substr(0,line.find_last_of(' '));
//cout<<xyzvalFromKinectStr<<"\n";
//Extract the packed rgb value
string valFromKinectStr = line.substr(line.find_last_of(' '));
double kinectVal = ::atof(valFromKinectStr.c_str());
kinectToRgb(kinectVal, xyzvalFromKinectStr);
}
}
myfile.close();
}
else
{
cout << "Unable to open file";
}
return 0;
}