2016-07-17 2 views
0

나는 cuda v6.5 샘플 코드 인 volumeRender를 통해 일부 볼륨 데이터를 렌더링하는 중입니다. 다른 프로그램에서 RGB 색상이 다른 일부 보셀 데이터가 있습니다. .raw 파일 형식으로 출력하여 렌더링하려고합니다. 그러나, volumeRender의 입력 .raw 파일과 정확히 동일한 .raw 형식을 출력하는 방법은 많이 혼란 스럽습니다.cuda 샘플 코드에서 .raw 파일 형식은 무엇입니까?

내 지식에 따르면 .raw 파일에는 볼륨 데이터 배열이 포함될 수 있습니다. 텍스트 편집기를 사용하여 volumrRender에서 "Bucky.raw"라는 .raw 파일을 열려고했지만 작동하지 않았습니다. 텍스트가 텍스트가 깨졌습니다. 그래서 .raw 파일의 형식에 대한 단서가 없습니다.

다음으로 예제 코드를 읽고 .cpp 파일이이 형식을 읽는 방법을 알아 냈습니다. 내가 얻는 유일한 정보는 볼륨 크기뿐이었습니다. unsigned char * width * height * depth입니다.

각 복셀 데이터를 의미하는 선량은 단 하나의 부호없는 문자로 나타 납니까? 이 부호없는 문자는 무엇을 의미합니까? 그것은 복셀의 그레이 스케일입니까?

내 보셀 RGB 데이터의 그레이 스케일을 출력하려고했지만 그 결과는 아래와 같이 매우 유선입니다. 상단

enter image description here enter image description here

내 복셀 데이터와 PCL로 시각화입니다. 다른 하나는 렌더링 결과입니다. 분명히 volumeRender 프로그램의 형식이 잘못되었습니다.

많은 다른 형식의 .raw 파일이 있다는 것을 알고 있습니다 만, 아마도 cuda 샘플 코드에 대해서만 한 가지 종류의 .raw 형식이 있다고 생각합니다. "Bucky.raw"형식처럼 .raw 형식을 저장하는 방법을 아는 사람이 있습니까?

+1

당신은 샘플 코드를 .raw 파일에 액세스하십시오. – kangshiyin

답변

2

각 복셀 데이터가 하나의 부호없는 문자로만 표시된다는 것을 의미합니까? 이 부호없는 문자는 무엇을 의미합니까? 그것은 복셀의 그레이 스케일입니까?

예, 각 복셀은 unsigned char (즉 VolumeType) 값 (255)이 복셀의 "투과율"을 나타내는 하나에 의해 표현된다 (즉, 밀도의 역수) 0 복셀 값, 가장 낮은 투과율/최고 "밀도"("더 어두운"영역 생성) 및 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

보셀 값은 "투과율"입니다! 그것은 모든 것을 설명합니다! 그것은 내 프로그램에서 일합니다. 고마워요! –

관련 문제