这是关于在pcl文件中解压缩编码的rgb值。我是用pcl文档中描述的过程完成的,但是我得到的解压缩的rgb值并不完全正确。当我用R绘制它们时,给出的表示与真实设置中的颜色不对应(我在某种程度上确定问题不在于它用R绘制的方式)。
例如,在附图中,划分的区域应该有灰色和蓝色(两把椅子和一张桌子)。
源pcl文件可以在https://docs.google.com/open?id=0Bz5-HVcDiF6SanBZU0JWVmJwWHM找到 包含解压缩颜色值的文件位于:https://docs.google.com/open?id=0Bz5-HVcDiF6SV2pYQ0xUbTAwVmM。以下是用于在c 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;
}
答案 0 :(得分:9)
这是我的工作解决方案。首先,我通过grep
运行您的输入,以过滤坐标中的NAN:
$ grep -v nan OnePerson4.pcd > OnePerson4.pcd.filtered
然后我通过C ++代码提取数据:
#include <stdio.h>
int main()
{
if (FILE *f = fopen("OnePerson4.pcd.filtered", "rt"))
{
for (;;)
{
float x = 0;
float y = 0;
float z = 0;
float color_float = 0;
if (fscanf(f, "%f %f %f %f", &x, &y, &z, &color_float) != 4)
{
break;
}
unsigned color = *(unsigned const *)&color_float;
unsigned r = color & 0xff;
unsigned g = (color >> 8) & 0xff;
unsigned b = (color >> 16) & 0xff;
printf("%f,%f,%f,%d,%d,%d\n", x, y, z, r, g, b);
}
fclose(f);
}
return 0;
}
我不知道RGB存储在哪个字节顺序中,因此您可能需要交换R和B.它通常是RGB或BGR。
然后我使用您的代码绘制点(我将read.table
更改为read.csv
):
library(rgl)
pcd <- read.csv(file.choose())
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))
这就是我得到的:
所以我假设问题出在您从pcd文件中读取颜色的代码中。其余的看起来很好。
更新:您的问题是double
类型。将其更改为float
,它应该有效。虽然将unsigned int
存储为float
至少是值得怀疑的。这是脆弱的,并不能保证你阅读后颜色是正确的。有些位可能已关闭。
另一个注意事项:您可以使用>>
流操作符从文件中提取数字。它比使用string
方法手动解析要容易得多。您可以阅读它,例如here。