我正在通过cuda v6.5示例代码 - volumeRender渲染一些体积数据。我在另一个程序中有一些不同RGB颜色的体素数据。我想通过将它们输出为.raw文件格式来渲染它们。但是,如何在volumeRender中输出完全相同的.raw格式作为输入.raw文件让我很困惑。
据我所知,.raw文件可以包含一个卷数据数组。 我试图在volumrRender中用文本编辑器打开名为“Bucky.raw”的.raw文件,但它没有用。文字是乱码文字。所以我不知道.raw文件的格式。
接下来,我尝试阅读示例代码并弄清楚.cpp文件如何读取此格式。我得到的唯一信息是卷大小。它是
unsigned char * width * height * depth
。
表示每个体素数据的剂量仅由一个无符号字符表示?这个unsigned char是什么意思?它是体素的灰度吗?
我试图输出我的体素RGB数据的灰度,但结果如下所示。
在顶部是我的体素数据并由PCL可视化。另一个是渲染结果。 显然,这是volumeRender程序的错误格式。
我知道有很多不同格式的.raw文件,但我想也许只有一种.raw格式只适用于cuda示例代码。 有没有人知道如何存储.raw格式就像“Bucky.raw”格式一样?
答案 0 :(得分:2)
这是否意味着每个体素数据仅由一个无符号字符表示?这个unsigned char是什么意思?它是体素的灰度吗?
是的,每个体素由一个unsigned char
(即VolumeType
)表示,值(0-255)表示"透射率"体素(即密度的倒数),体素值为0是最低透射率/最高密度" (创建"较暗的"区域)和255的体素值是低密度(创建"更亮"区域)。
存储顺序在x中具有快速变化的维度,然后是y,然后是z。可以在程序中轻松地发现卷的实际维度为volumeSize.width
(x),volumeSize.height
(y)和volumeSize.depth
(z)。 x表示水平方向,y表示垂直方向,z表示进出屏幕的方向。
有没有人知道如何存储.raw格式就像" Bucky.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
这是上述buckywriter 3
情况的图形输出,它在x和y中创建了增加的透射率梯度: