UsTK : Ultrasound ToolKit  version 2.0.1 under development (2025-02-01)
tutorial-ultrasonix-qt-grabbing-RF-scan-conversion.cpp
1 
3 #include <iostream>
4 #include <visp3/ustk_core/usConfig.h>
5 
6 #if (defined(USTK_HAVE_QT5) || defined(USTK_HAVE_VTK_QT)) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)) && \
7  defined(USTK_HAVE_FFTW)
8 
9 #include <QApplication>
10 #include <QStringList>
11 #include <QtCore/QThread>
12 
13 #include <visp3/ustk_core/usPreScanToPostScan2DConverter.h>
14 #include <visp3/ustk_core/usRFToPreScan2DConverter.h>
15 #include <visp3/ustk_grabber/usNetworkGrabberRF2D.h>
16 
17 #include <visp3/gui/vpDisplayGDI.h>
18 #include <visp3/gui/vpDisplayX.h>
19 
20 int main(int argc, char **argv)
21 {
22  // QT application
23  QApplication app(argc, argv);
24 
25  usNetworkGrabberRF2D *qtGrabber = new usNetworkGrabberRF2D();
26  qtGrabber->connectToServer();
27 
28  // setting acquisition parameters
30  if (qApp->arguments().contains(QString("--probeID"))) {
31  header.probeId = qApp->arguments().at(qApp->arguments().indexOf(QString("--probeID")) + 1).toInt();
32  } else
33  header.probeId = 15; // 4DC7 id = 15 by default
34 
35  if (qApp->arguments().contains(QString("--slotID"))) {
36  header.slotId = qApp->arguments().at(qApp->arguments().indexOf(QString("--slotID")) + 1).toInt();
37  } else
38  header.slotId = 0; // top slot id = 0 by default
39 
40  if (qApp->arguments().contains(QString("--imagingMode"))) {
41  header.imagingMode = qApp->arguments().at(qApp->arguments().indexOf(QString("--imagingMode")) + 1).toInt();
42  } else
43  header.imagingMode = 12; // RF = 12
44 
45  // prepare image;
47 
48  // prepare converters
51  postscanImage.setHeightResolution(0.0005);
52  postscanImage.setWidthResolution(0.0005);
53 
54  // ultrasonix 4DC7 probe settings
55  postscanImage.setTransducerConvexity(true);
56  postscanImage.setTransducerRadius(0.04);
57  postscanImage.setScanLineNumber(128);
58  postscanImage.setScanLinePitch(0.010625);
59  postscanImage.setDepth(0.15);
60  preScanImage.setTransducerSettings(postscanImage);
61 
62  usRFToPreScan2DConverter converterRF;
63  usPreScanToPostScan2DConverter scanConverter;
64 
65 // Prepare display
66 #if defined(VISP_HAVE_X11)
67  vpDisplayX *display = NULL;
68 #elif defined(VISP_HAVE_GDI)
69  vpDisplayGDI *display = NULL;
70 #endif
71  bool displayInit = false;
72 
73  bool captureRunning = true;
74 
75  // sending acquisition parameters
76  qtGrabber->initAcquisition(header);
77 
78  qtGrabber->runAcquisition();
79 
80  std::cout << "waiting ultrasound initialisation..." << std::endl;
81 
82  // our local grabbing loop
83  do {
84  grabbedFrame = qtGrabber->acquire();
85 
86  std::cout << "MAIN THREAD received frame No : " << grabbedFrame->getFrameCount() << std::endl;
87 
88  double startTime = vpTime::measureTimeMs();
89  // convert RF to pre-scan to display something ...
90  converterRF.convert(*grabbedFrame, preScanImage);
91 
92  double endRFConvertTime = vpTime::measureTimeMs();
93  std::cout << "RF conversion time (sec) = " << (endRFConvertTime - startTime) / 1000.0 << std::endl;
94 
95  scanConverter.convert(preScanImage, postscanImage);
96 
97  double endScanConvertTime = vpTime::measureTimeMs();
98  std::cout << "scan-conversion time (sec) = " << (endScanConvertTime - endRFConvertTime) / 1000.0 << std::endl;
99 
100  // init display
101  if (!displayInit && postscanImage.getHeight() != 0 && postscanImage.getWidth() != 0) {
102 #if defined(VISP_HAVE_X11)
103  display = new vpDisplayX(postscanImage);
104 #elif defined(VISP_HAVE_GDI)
105  display = new vpDisplayGDI(postscanImage);
106 #endif
107  displayInit = true;
108  }
109 
110  // processing display
111  if (displayInit) {
112  if (vpDisplay::getClick(postscanImage, false))
113  captureRunning = false;
114  vpDisplay::display(postscanImage);
115  vpDisplay::displayText(postscanImage, 20, 20, std::string("Click to exit..."), vpColor::red);
116  vpDisplay::flush(postscanImage);
117  }
118  } while (captureRunning);
119 
120  qtGrabber->stopAcquisition();
121 
122  if (displayInit) {
123  delete display;
124  }
125 
126  return 0;
127 }
128 
129 #else
130 int main()
131 {
132  std::cout << "You should intall Qt5 (with wigdets and network modules) to run this tutorial" << std::endl;
133  return 0;
134 }
135 
136 #endif
Class to store additionnal informations arriving on the network with ultrasound images grabbed,...
quint32 getFrameCount() const
void setHeightResolution(double heightResolution)
void setWidthResolution(double widthResolution)
Specific class to grab RF frames from the ultrasound station on the network.
usFrameGrabbedInfo< usImageRF2D< short int > > * acquire()
bool initAcquisition(const usNetworkGrabber::usInitHeaderSent &header)
void convert(const usImagePreScan2D< unsigned char > &preScanImage, usImagePostScan2D< unsigned char > &postScanImage, double xResolution=0., double yResolution=0.)
2D conversion from RF signal to pre-scan image
void convert(const usImageRF2D< short int > &rfImage, usImagePreScan2D< unsigned char > &preScanImage)
void setTransducerConvexity(const bool isTransducerConvex)
void setDepth(double depth)
void setScanLinePitch(const double scanLinePitch)
void setTransducerRadius(const double transducerRadius)
void setTransducerSettings(const usTransducerSettings &other)
void setScanLineNumber(unsigned int scanLineNumber)
VISP_EXPORT void display(const usOrientedPlane3D &plane, const vpImage< ImageDataType > &I, const vpHomogeneousMatrix &imageMworld, double Xscale=3000, double Yscale=3000, const vpColor &color=vpColor::green)
Display usOrientedPlane3D.