UsTK : Ultrasound ToolKit  version 2.0.1 under development (2025-02-01)
usGrabber3DViewer.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_core/usPreScanToPostScan3DConverter.h>
9 #include <visp3/ustk_gui/us3DSceneWidget.h>
10 #include <visp3/ustk_gui/usVTKConverter.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 + "/pre-scan/3D_xml/sequencepreScan3D.xml";
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  // QT application
37  QApplication app(argc, argv);
38 
39  // read us image
40  // read 2 us images to simulate double buffer system for real grabbing
41 
42  // 1st us image
45  usImageIo::read(preScanImage, mhd_filename);
46  // 2nd us image
47  usImagePreScan3D<unsigned char> preScanImage2;
48  usImagePostScan3D<unsigned char> postScanImage2;
49  usImageIo::read(preScanImage2, mhd_filename);
50 
51  // scan-conversion
53  double startTime = vpTime::measureTimeMs();
54  std::cout << "init converter..." << std::endl;
55  converter.init(preScanImage);
56  double endInitTime = vpTime::measureTimeMs();
57  std::cout << "init time (sec) = " << (endInitTime - startTime) / 1000.0 << std::endl;
58 
59  // scan-convert to init post-scan images (and not have a NULL pointer given to vtk importer)
60  converter.convert(postScanImage, preScanImage);
61  converter.convert(postScanImage2, preScanImage2);
62 
63  // check addresses of each image
64  std::cout << "image 1 @ : " << (void *)postScanImage.getConstData() << std::endl;
65  std::cout << "image 2 @ : " << (void *)postScanImage2.getConstData() << std::endl;
66 
67  // pre-compute the importer to save time during the data import in vtk
68  // this importer will switch between the 2 previsous usImages at each iteration
69  vtkSmartPointer<vtkImageData> vtkImage = vtkSmartPointer<vtkImageData>::New();
70  vtkSmartPointer<vtkImageData> vtkImage2 = vtkSmartPointer<vtkImageData>::New();
71 
72  usVTKConverter::convert(postScanImage, vtkImage);
73 
74  // setup view widget
75  us3DSceneWidget scene;
76  scene.setImageData(vtkImage);
77 
78  double spacing[3];
79  vtkImage->GetSpacing(spacing);
80 
81  vtkSmartPointer<vtkPlane> planeX = vtkSmartPointer<vtkPlane>::New();
82  planeX->SetNormal(1, 0, 0);
83  planeX->SetOrigin(postScanImage.getWidth() * spacing[0] / 2.0, 0, 0);
84  vtkSmartPointer<vtkPlane> planeY = vtkSmartPointer<vtkPlane>::New();
85  planeY->SetNormal(0, 1, 0);
86  planeY->SetOrigin(0, postScanImage.getHeight() * spacing[1] / 2.0, 0);
87  vtkSmartPointer<vtkPlane> planeZ = vtkSmartPointer<vtkPlane>::New();
88  planeZ->SetNormal(0, 0, 1);
89  planeZ->SetOrigin(0, 0, postScanImage.getNumberOfFrames() * spacing[2] / 2.0);
90  scene.setPlanes(planeX, planeY, planeZ);
91 
92  scene.init();
93  scene.show();
94 
95  /*
96 
97  //loop to simulate grabbing
98  for(int i=0;i<20;i++) {
99  double t1 = vpTime::measureTimeMs();
100 
101  //Scan-conversion
102  if(i%2==0)
103  converter.convert(postScanImage,preScanImage.getConstData());
104  else
105  converter.convert(postScanImage2,preScanImage2.getConstData());
106 
107  double endConvertTime = vpTime::measureTimeMs();
108  std::cout << "scan convert time (ms) = " << (endConvertTime - t1) << std::endl;
109 
110  //vtk conversion
111  if(i%2==0)
112  usVTKConverter::convert(postScanImage,vtkImage,importer);
113  else
114  usVTKConverter::convert(postScanImage2,vtkImage2,importer);
115 
116  double t2 = vpTime::measureTimeMs();
117 
118  std::cout << "vtk convert time (ms) = " << t2-endConvertTime << std::endl;
119  std::cout << "full convert time (ms) = " << t2-t1 << std::endl;
120 
121  //update the viewer
122  scene.updateImageData(vtkImage);
123 
124  //wait 5s after t1
125  vpTime::wait(t1,1000);
126  }
127  */
128  return app.exec();
129 }
130 #else
131 #include <iostream>
132 
133 int main() { std::cout << "Install vtk with qt4 or qt5 support to run this tutorial." << std::endl; }
134 
135 #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
Type * getConstData() const
Definition: usImage3D.h:104
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
void init(const usImagePreScan3D< unsigned char > &preScanImage, double down=1)
void convert(usImagePostScan3D< unsigned char > &postScanImage, const usImagePreScan3D< unsigned char > &preScanImage)
static void convert(const usImagePostScan3D< unsigned char > &postScanImage, vtkSmartPointer< vtkImageData > &vtkPostScanImage, vtkSmartPointer< vtkImageImport > importer=NULL)
VISP_EXPORT std::string getDataSetPath()
Definition: us.cpp:54