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

标签 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”格式一样?

最佳答案

Does that mean each voxel data is represented by only one unsigned char? What does this unsigned char mean? Is it the gray scale of voxel?

是的,每个体素由一个unsigned char(即VolumeType)表示,值(0-255)代表体素的“透射率”(即密度的倒数),体素值为 0 表示最低透射率/最高“密度”(创建“较暗”区域),体素值为 255 表示低密度(创建“较亮”区域)。

存储顺序在 x、y、z 中具有快速变化的维度。体积的实际尺寸可以在程序中轻松发现,如 volumeSize.width (x)、volumeSize.height (y) 和 volumeSize.depth (z)。 x代表水平方向,y代表垂直方向,z代表进出屏幕的方向。

Does anyone know how to store .raw format just like "Bucky.raw" format?

这是一个程序,您可以使用它来尝试编写不同类型的“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

关于c++ - cuda示例代码中的.raw文件格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423024/

相关文章:

c++ - 在 C++ 中填充一维数组

c++ - Windows C++ 如何调用从一个线程到另一个线程的阻塞读取?

concurrency - CUDA 原子操作和并发内核启动

cuda - 跨 CUDA 内核的 L1 缓存持久性

CUDA扭曲同步问题

c++ - 如何让 C++ 控制台每次都在同一个位置显示 cin

c++ - 静态链接 libstdc++ : any gotchas?

c++ - 体系结构 x86_64 错误的 undefined symbol

c++ - 如何在同时使用 Intel C++ 和 CUDA C++ 的 Eclipse-nsight 中创建项目?

filter - CUDA 中的 FIR 滤波器(作为一维卷积)