loupiac45
loupiac45

Reputation: 21

How to convert RAW file (3D image) to STL format?

I began a c++ program which can open a RAW 3D image and save it.

CProjet::CProjet(int L,int C, int P, char* pimage) {

    NBL=L;
    NBC=C;
    NBP=P;
    size=NBL*NBC*NBP;
    if(pimage != NULL) {

        m_pimage=new char[strlen(pimage)+1];
        strcpy(m_pimage,pimage);

    }
    else if(size != 0) {

        m_pimage=new char[size+1];

    }
    else {

        m_pimage=NULL;

    }

}

CProjet::~CProjet() {

    if(m_pimage != NULL) {

        delete m_pimage;
        m_pimage = NULL;

    }

}

void CProjet::LireImageRAW() {

    char nom_image[256];
    FILE * fic_image;

    cout<<"Nom de l'image a ouvrir : ";
    cin>>nom_image;

    fic_image = fopen(nom_image,"rb");

    if (fic_image == NULL)
    {
        cout<<"Erreur a l'ouverture de l'image ..."<<endl;
        exit(0);
    }
    else
        cout<<"Image ouverte avec succes ..."<<endl;

    fread(m_pimage,1,size,fic_image);

    fclose(fic_image);
}

void CProjet::EcrireImageRAW() {

    char nom_image[256];
    FILE * fic_image;

    cout<<"Nom de l'image a ecrire : ";
    cin>>nom_image;

    fic_image = fopen(nom_image,"wb");

    if (fic_image == NULL)
    {
        cout<<"Erreur a la creation de l'image ..."<<endl;
        exit(0);
    }
    else
        cout<<"Image créée avec succes ..."<<endl;

    fwrite(m_pimage,1,size,fic_image);

    fclose(fic_image);
}

However, I would like to save this 3D image into a STL format.

Have you any idea to do that?

Thanks in advance.

Upvotes: 1

Views: 1943

Answers (2)

loupiac45
loupiac45

Reputation: 21

Thank you for your answer. I could get a result !

However, it's not really good. When I save my 3D image into STL format or just to view it, we can see it has been duplicated 4 times.

http://imageshack.com/a/img673/7050/Tw7kNs.png

I tried some changes but without success.

//Read 3D RAW image
vtkImageReader *imgReader = vtkImageReader::New();
imgReader->SetFileDimensionality(3);
imgReader->SetFileName(IMG_FILE);
imgReader->SetNumberOfScalarComponents(1);
//imgReader->SetDataSpacing(1.0,1.0,1.0);
//imgReader->SetDataOrigin(-0.5,-0.5,-0.5);
imgReader->SetDataByteOrderToBigEndian();
imgReader->SetDataExtent(0,199,0,199,0,199);
imgReader->Update();

//Visualization
vtkContourFilter *contour = vtkContourFilter::New();
contour->SetInput(imgReader->GetOutput());
contour->SetValue(0,0);

vtkPolyDataMapper *volMapper = vtkPolyDataMapper::New();
volMapper->SetInput(contour->GetOutput());
volMapper->ScalarVisibilityOff();
vtkActor *volActor = vtkActor::New();
volActor->SetMapper(volMapper);

vtkRenderer *renderer = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);

renderer->AddActor(volActor);
renderer->SetBackground(1,1,1);
renWin->SetSize(200*3,200*3);

// interact with data
renWin->Render();
iren->Start();

//Write in STL
vtkTriangleFilter *triangle = vtkTriangleFilter::New();
triangle->SetInput(contour->GetOutput());
triangle->PassVertsOff();
triangle->PassLinesOff();

vtkQuadricDecimation *decimation = vtkQuadricDecimation::New();
decimation->SetInput(triangle->GetOutput());

vtkCleanPolyData *clean = vtkCleanPolyData::New();
clean->SetInput(triangle->GetOutput());

vtkTriangleFilter *triangle2 = vtkTriangleFilter::New();
triangle2->SetInput(clean->GetOutput());
triangle2->PassVertsOff();
triangle2->PassLinesOff();

vtkSTLWriter *writer = vtkSTLWriter::New();
writer->SetInput(triangle2->GetOutput());
writer->SetFileName("test.stl");
writer->Write();

Does anyone have an idea?

Upvotes: 1

Adrien BARRAL
Adrien BARRAL

Reputation: 3604

When I need to manipulate 3D File, I use either the PCL library or the VTK Library. For your problem, I think that VTK is a better choice because it contain some driver for Raw 3D and STL.

Look at this example, it will show you how to open a .Raw file This example will show you how to write a STL file.

If you don't want to use a third part library, I will not be able to help you...

Upvotes: 0

Related Questions