UsTK : Ultrasound ToolKit  version 2.0.1 under development (2025-02-01)
us3DViewer.cpp
1 #include <visp3/ustk_core/usConfig.h>
2 
3 #ifdef USTK_HAVE_VTK_QT
4 
5 #include <visp3/ustk_core/us.h>
6 #include <visp3/ustk_core/usImageIo.h>
7 #include <visp3/ustk_core/usImagePostScan3D.h>
8 #include <visp3/ustk_gui/us3DSceneWidget.h>
9 #include <visp3/ustk_gui/usVTKConverter.h>
10 #include <vtkMetaImageReader.h>
11 
12 int main(int argc, char **argv)
13 {
14  std::string mhd_filename;
15 
16  for (int i = 0; i < argc; i++) {
17  if (std::string(argv[i]) == "--input")
18  mhd_filename = std::string(argv[i + 1]);
19  else if (std::string(argv[i]) == "--help") {
20  std::cout << "\nUsage: " << argv[0] << " [--input <preScan3D.xml>] [--help]\n" << std::endl;
21  return 0;
22  }
23  }
24 
25  // Get the ustk-dataset package path or USTK_DATASET_PATH environment variable value
26  if (mhd_filename.empty()) {
27  std::string env_ipath = us::getDataSetPath();
28  if (!env_ipath.empty())
29  mhd_filename = env_ipath + "/post-scan/3D_mhd/volume.mhd";
30  else {
31  std::cout << "You should set USTK_DATASET_PATH environment var to access to ustk dataset" << std::endl;
32  return 0;
33  }
34  }
35 
36  vtkSmartPointer<vtkMetaImageReader> reader = vtkSmartPointer<vtkMetaImageReader>::New();
37  reader->SetFileName(mhd_filename.c_str());
38  reader->Update();
39 
40  std::cout << "reader output" << std::endl;
41 
42  reader->GetOutput()->Print(std::cout);
43 
44  // QT application
45  QApplication app(argc, argv);
46 
47  // read us image
49  usImageIo::read(postScan3D, mhd_filename);
50  // conversion to vtk format
51  vtkSmartPointer<vtkImageData> vtkImage = vtkSmartPointer<vtkImageData>::New();
52 
53  vtkSmartPointer<vtkImageImport> importer = vtkSmartPointer<vtkImageImport>::New();
54  importer->SetDataScalarTypeToUnsignedChar();
55  importer->SetWholeExtent(0, postScan3D.getWidth() - 1, 0, postScan3D.getHeight() - 1, 0,
56  postScan3D.getNumberOfFrames() - 1);
57  importer->SetDataExtentToWholeExtent();
58  importer->SetNumberOfScalarComponents(1);
59  usVTKConverter::convert(postScan3D, vtkImage, importer);
60 
61  vtkImage->Print(std::cout);
62 
63  // setup view widget
64  us3DSceneWidget scene;
65  scene.setImageData(vtkImage);
66 
67  double spacing[3];
68  vtkImage->GetSpacing(spacing);
69 
70  vtkSmartPointer<vtkPlane> planeX = vtkSmartPointer<vtkPlane>::New();
71  planeX->SetNormal(1, 0, 0);
72  planeX->SetOrigin(postScan3D.getWidth() * spacing[0] / 2.0, 0, 0);
73  vtkSmartPointer<vtkPlane> planeY = vtkSmartPointer<vtkPlane>::New();
74  planeY->SetNormal(0, 1, 0);
75  planeY->SetOrigin(0, postScan3D.getHeight() * spacing[1] / 2.0, 0);
76  vtkSmartPointer<vtkPlane> planeZ = vtkSmartPointer<vtkPlane>::New();
77  planeZ->SetNormal(0, 0, 1);
78  planeZ->SetOrigin(0, 0, postScan3D.getNumberOfFrames() * spacing[2] / 2.0);
79  scene.setPlanes(planeX, planeY, planeZ);
80 
81  std::cout << "planeZ origin Z" << planeZ->GetOrigin()[2] << std::endl;
82 
83  scene.init();
84  app.setActiveWindow(&scene);
85  scene.show();
86 
87  return app.exec();
88 }
89 #else
90 #include <iostream>
91 
92 int main() { std::cout << "Install vtk with qt4 or qt5 support to run this tutorial." << std::endl; }
93 
94 #endif
Class used to render a 3D vtk scene containing a vtkImageData in a QWidget (based on QVTKWidget).
void setPlanes(vtkPlane *plane1, vtkPlane *plane2, vtkPlane *plane3)
void setImageData(vtkImageData *imageData)
unsigned int getNumberOfFrames() const
Definition: usImage3D.h:137
unsigned int getHeight() const
Definition: usImage3D.h:131
unsigned int getWidth() const
Definition: usImage3D.h:125
static void read(usImageRF2D< short int > &imageRf2D, const std::string &headerFileName)
Definition: usImageIo.cpp:153
static void convert(const usImagePostScan3D< unsigned char > &postScanImage, vtkSmartPointer< vtkImageData > &vtkPostScanImage, vtkSmartPointer< vtkImageImport > importer=NULL)
VISP_EXPORT std::string getDataSetPath()
Definition: us.cpp:54