2016-07-17 5 views
0

私は、cuda v6.5のサンプルコード - volumeRenderを使用して、いくつかのボリュームデータのレンダリングに取り組んでいます。私は別のプログラムで異なるRGB色のボクセルデータをいくつか持っています。私はそれらを.rawファイル形式に出力してレンダリングしたい。しかし、volumeRenderのinput .rawファイルとまったく同じ.raw形式を出力する方法は、私をかなり混乱させています。cudaサンプルコードで.rawファイル形式とは何ですか?

私の知る限りでは、.rawファイルにボリュームデータの配列を含めることができます。 私は、テキストエディタでvolumrRenderに "Bucky.raw"という名前の.rawファイルを開こうとしましたが、動作しませんでした。テキストは文字化けしていました。だから、私は.rawファイルの形式の手掛かりがありません。

次に、サンプルコードを読み込み、.cppファイルがこの形式をどのように読み取るかを調べようとしました。私が得る唯一の情報はボリュームの大きさでした。それは unsigned char * width * height * depthです。

各ボクセルデータを意味する線量は、unsigned charで1つだけ表されますか?この無署名charは何を意味しますか?それはボクセルのグレースケールですか?

私のボクセルRGBデータのグレースケールを出力しようとしましたが、結果は以下のように非常に配線されています。上部に

enter image description here enter image description here

私のボクセルデータであり、PCLによって可視化します。もう1つはレンダリングの結果です。 明らかに、volumeRenderプログラムのフォーマットが間違っています。

私にはさまざまな形式の.rawファイルがあることは知っていますが、おそらくcudaサンプルコードのための.raw形式は1種類しかないと思います。 誰かが "Bucky.raw"形式のように.raw形式を保存する方法を知っていますか?

+1

.rawファイルにアクセスします。 – kangshiyin

答えて

2

これは、各ボクセルデータが1つのunsigned charで表されることを意味しますか?この無署名charは何を意味しますか?それはボクセルのグレースケールですか?

はい、各ボクセルが1 unsigned char(すなわちVolumeType)で表され、値(0〜255)が0のボクセル値と、(密度の逆数IE)ボクセルの「透過率」を表します最も低い透過率/最も高い「濃度」(「より暗い」領域を生成する)であり、255のボクセル値は低密度である(「明るい」領域を生成する)。

保存順序は、x、y、zの順に急激に変化する次元を持ちます。ボリュームの実際の寸法は、volumeSize.width(x)、volumeSize.height(y)、およびvolumeSize.depth(z)と簡単にプログラムで検出できます。 xは水平方向を表し、yは垂直方向を表し、zは画面内または画面外方向を表します。

"Bucky.raw"形式のように.raw形式を保存する方法を知っている人はいますか?

さまざまな種類の "Bucky.raw"ファイルを試してみるためのプログラムです。ディメンションは、プログラムのデフォルト値である32,32,32になります。

このプログラムをコンパイルし、コマンドラインパラメーター0-4で実行すると、volumeRenderサンプルコードを実行すると、異なるパターンが表示されます。

cat buckywriter.cpp 
#include <fstream> 
#include <iostream> 
#include <string> 
#include <cstdlib> 

using namespace std; 
const int sz = 32; 
const int method_max = 4; 


int myfunc(int x, int y, int z, int method){ 

    switch (method){ 
    case 0: 
     return x; 
     break; 
    case 1: 
     return y; 
     break; 
    case 2: 
     return z; 
     break; 
    case 3: 
     return x+y; 
     break; 
    case 4: 
     return (x+y)*2*((z+1)/float(sz)); 
     break; 
    default: 
     return x; 
     break; 
    } 
    return 0; 
} 



int main(int argc, char *argv[]){ 

    int method = 0; 
    if (argc > 1) method = atoi(argv[1]); 
    ofstream fout; 
    string foname("Bucky.raw"); 
    fout.open(foname.c_str()); 
    if (!fout) {std::cout << "file open failed" << std::endl; return 1;} 
    for (int z = 0; z < sz; z++) 
    for (int y = 0; y < sz; y++) 
     for (int x = 0; x < sz; x++) 
     fout << (unsigned char)(myfunc(x, y, z, method)); 
    if (!fout) {std::cout << "file write failed" << std::endl; return 1;} 
    fout.close(); 
    return 0; 
} 

$ g++ buckywriter.cpp -o buckywriter 
$ ./buckywriter 3 
$ ./volumeRender 

これは、xとyの増加透過率勾配を作成し、上記buckywriter 3場合、用のグラフィカル出力されます:あなたは、サンプルコードを持っているので、あなたはどのようにそれを見つけることができる

enter image description here

+0

ボクセル値は「透過率」です!それはすべてを説明している!それは私のプログラムの仕事です。どうもありがとうございました! –

関連する問題