cuda示例代码中的.raw文件格式是什么?

时间:2016-07-17 15:46:24

标签: c++ cuda

我正在通过cuda v6.5示例代码 - volumeRender渲染一些体积数据。我在另一个程序中有一些不同RGB颜色的体素数据。我想通过将它们输出为.raw文件格式来渲染它们。但是,如何在volumeRender中输出完全相同的.raw格式作为输入.raw文件让我很困惑。

据我所知,.raw文件可以包含一个卷数据数组。 我试图在volumrRender中用文本编辑器打开名为“Bucky.raw”的.raw文件,但它没有用。文字是乱码文字。所以我不知道.raw文件的格式。

接下来,我尝试阅读示例代码并弄清楚.cpp文件如何读取此格式。我得到的唯一信息是卷大小。它是 unsigned char * width * height * depth

表示每个体素数据的剂量仅由一个无符号字符表示?这个unsigned char是什么意思?它是体素的灰度吗?

我试图输出我的体素RGB数据的灰度,但结果如下所示。

enter image description here enter image description here

在顶部是我的体素数据并由PCL可视化。另一个是渲染结果。 显然,这是volumeRender程序的错误格式。

我知道有很多不同格式的.raw文件,但我想也许只有一种.raw格式只适用于cuda示例代码。 有没有人知道如何存储.raw格式就像“Bucky.raw”格式一样?

1 个答案:

答案 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中创建了增加的透射率梯度:

enter image description here