2012-04-11 5 views
5

これは、pclファイルにエンコードされたrgb値をアンパックすることに関するものです。私はpclのドキュメントに記載された手順でこれを行いましたが、私が得た解凍されたrgb値はあまり正しくありません。私がそれらをRでプロットするとき、与えられた表現は実際の設定の色に対応していません(私はある程度、Rがプロットされた方法で問題がないと確信しています)。ポイントクラウドデータセットのRGB値のアンパック

たとえば、添付された画像では、境界区域の色はグレーとブルー(2つの椅子とテーブル)にする必要があります。でhttps://docs.google.com/open?id=0Bz5-HVcDiF6SanBZU0JWVmJwWHMとアンパックカラー値を持つ ファイル:https://docs.google.com/open?id=0Bz5-HVcDiF6SV2pYQ0xUbTAwVmMunpacked pcl data plotted with the rgl library in R

ソースPCLファイルがで見つけることができます。

uint32_t rgbD = *reinterpret_cast<int*>(&kinectValue); 

    uint16_t rD = (rgbD >> 16) & 0x0000ff; 
    uint16_t gD = (rgbD >> 8) & 0x0000ff; 
    uint16_t bD = (rgbD)  & 0x0000ff; 

あなたは私が間違った場所に私が知っていることができれば、私は本当に感謝:また次は、cのカラー値を開梱プラスプラス設定するために使用されるコードです。

更新:

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)) 

更新:以下は、

Iは、3Dの値をプロットに使用されるRのコードスニペットである

後はCで、Iは、データを読み取るために使用されるコードであり、++ :

/* 
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; 
} 
+1

どちらのリンクも私のためにゼロバイトをダウンロードします。 –

+0

@MichaelDaum、申し訳ありません。すぐに問題を解決します。問題を眺める時間を取ってくれてありがとう。 –

+1

RGBは通常RGBAとして表されます。これはプラットフォームによって異なる場合がありますが、それぞれR GとBについて(rgbD >> 24)、>> 16、>> 8を試してください。しかしそれはおそらく問題ではないので...あなたは疎な3次元空間でR-G-Bを得ようとしています。あなたはそれが間違っている色のアンパックですが、図面コードやファイルI/Oコードではないことを完全に確信していますか? –

答えて

9

ここで私の解決策です。最初に私は座標でNaNをフィルタするgrepを通して、あなたの入力を実行しました:

$ 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です。だから私は仮定してい

enter image description here

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)) 

そして、これは私が得るものです:

は、それから私は、ポイントを(私はread.csvread.tableを変更)をプロットするためにあなたのコードを使用しました問題は、pcdファイルから色を読み取るコードにあります。残りは私にとってうまく見えます。

更新:あなたの問題はdoubleタイプです。これをfloatに変更すると正常に動作します。 unsigned intfloatとして保存することは、少なくとも疑わしいですが。これは壊れやすく、読んだ後で色が正しいとは限りません。いくつかのビットがオフになる可能性があります。

別の注意:>>ストリーム演算子を使用して、ファイルから数値を抽出することができます。 stringメソッドで手動で解析するよりもずっと簡単です。例えば、hereのように読むことができます。

+0

お返事ありがとうございました。これは非常に興味深いようです。私はあまりにも私が間違って行った場所を見ることができるかもしれないコードを投稿します。 –

+0

私はデータを読み込むために使用したC++コードを追加しました。 –

+1

あなたのコードに関する私のコメントを投稿に更新しました。 – detunized