#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType) int main(){ ///////////////////// //preparing part 1:// ///////////////////// //1.1 initialize render window vtkNew renderer; renderer->SetBackground(0.1804, 0.5451, 0.3412); vtkNew renderWindow; renderWindow->SetSize(1000, 1000); renderWindow->AddRenderer(renderer); vtkNew style; vtkNew renderWindowInteractor; renderer->GetActiveCamera()->SetFocalPoint(50, 100, 80); renderer->GetActiveCamera()->SetPosition(-800, 100, 80); renderer->GetActiveCamera()->SetViewUp(0, 1, 0); renderWindowInteractor->SetInteractorStyle(style); renderWindowInteractor->SetRenderWindow(renderWindow); //1.2 set transform mat double temparray[16] = { -0.0434782, -0.999054 ,-2.45238e-08, 243.429, 0.00189944, -8.26871e-05 ,0.999998, 74.5061, -0.999053 ,0.0434782, 0.00190124, 174.119, 0 ,0, 0, 1}; vtkNew transformMat; transformMat->DeepCopy(temparray); //1.3 add axes in renderwindow vtkNew actorAxes; actorAxes->SetPosition(0, 0, 0); actorAxes->SetTotalLength(50, 50, 50); actorAxes->SetShaftType(0); actorAxes->SetAxisLabels(true); actorAxes->GetXAxisCaptionActor2D()->GetTextActor()->SetTextScaleModeToViewport(); actorAxes->GetYAxisCaptionActor2D()->GetTextActor()->SetTextScaleModeToViewport(); actorAxes->GetZAxisCaptionActor2D()->GetTextActor()->SetTextScaleModeToViewport(); actorAxes->SetCylinderRadius(0.02); renderer->AddActor(actorAxes); //1.4 read dicom directory vtkNew stringfilesOri; QDir dirDcmOri("3D-T1_Directory_Path"); QStringList qstringfilesOri = dirDcmOri.entryList(QStringList("*.dcm"), QDir::Files | QDir::Readable, QDir::Name); for (int i = 0; i < qstringfilesOri.size(); i++) { stringfilesOri->InsertNextValue((dirDcmOri.absolutePath() + "\\" + qstringfilesOri[i]).toStdString());} vtkNew readerOri; readerOri->SetFileNames(stringfilesOri); readerOri->Update(); //1.5 reslice to transform the image data auto reslice = vtkSmartPointer::New(); reslice->SetInputConnection(readerOri->GetOutputPort()); reslice->SetInformationInput(readerOri->GetOutput()); reslice->SetOutputDimensionality(3); reslice->SetResliceAxes(transformMat); reslice->SetInterpolationModeToLinear(); reslice->Update(); /////////////////// //working part 2:// /////////////////// #define IF_TRANSFORM 1 //2.1 reconstruct imagedata and visualize vtkNew mc1; #if (IF_TRANSFORM == 1) mc1->SetInputConnection(reslice->GetOutputPort()); #else mc1->SetInputConnection(readerOri->GetOutputPort()); #endif mc1->ComputeNormalsOn(); mc1->SetValue(0, 70); vtkNew mapper1; mapper1->SetInputConnection(mc1->GetOutputPort()); mapper1->ScalarVisibilityOff(); vtkNew actor1; actor1->GetProperty()->SetColor(.3, .3, .3); actor1->GetProperty()->SetOpacity(0.1); actor1->SetMapper(mapper1); renderer->AddActor(actor1); //2.2 write imagedata into NIFTI file auto writer1 = vtkNIFTIWriter::New(); #if (IF_TRANSFORM == 1) writer1->SetInputConnection(reslice->GetOutputPort()); #else writer1->SetInputConnection(readerOri->GetOutputPort()); #endif writer1->SetFileName("testdicom2nii_1.nii"); writer1->SetQFac(0); writer1->Write(); //2.3 read imagedata from NIFTI file auto *readerResult2 = vtkNIFTIReader::New(); readerResult2->SetFileName("testdicom2nii_1.nii"); readerResult2->Update(); //2.4 reconstruct imagedata and visualize vtkNew surfaceResult2; surfaceResult2->SetInputConnection(readerResult2->GetOutputPort()); surfaceResult2->ComputeNormalsOn(); surfaceResult2->SetValue(0, 70); vtkNew mapperResult2; mapperResult2->SetInputConnection(surfaceResult2->GetOutputPort()); mapperResult2->ScalarVisibilityOff(); vtkNew actorResult2; actorResult2->GetProperty()->SetColor(.1, .1, .8); actorResult2->GetProperty()->SetOpacity(.1); actorResult2->SetMapper(mapperResult2); renderer->AddActor(actorResult2); renderWindow->Render(); renderWindowInteractor->Start(); }