8 #include "PlusConfigure.h" 9 #include "igsioCommon.h" 11 #include "igsioTrackedFrame.h" 12 #include "igsioVideoFrame.h" 14 #include "vtkIGSIOTrackedFrameList.h" 19 #include <vtkImageData.h> 20 #include <vtkLineSource.h> 21 #include <vtkSmartPointer.h> 22 #include <vtkXMLUtilities.h> 23 #include <vtksys/CommandLineArguments.hxx> 27 const float DRAWING_COLOR = 255;
31 int main(
int argc,
char** argv)
34 bool printHelp(
false);
35 std::string inputImgSeqFileName;
36 std::string outputImgSeqFileName;
37 std::string inputConfigFileName;
38 int verboseLevel = vtkPlusLogger::LOG_LEVEL_UNDEFINED;
40 vtksys::CommandLineArguments args;
41 args.Initialize(argc, argv);
43 args.AddArgument(
"--source-seq-file", vtksys::CommandLineArguments::EQUAL_ARGUMENT, &inputImgSeqFileName,
"The ultrasound sequence to draw the scanlines on.");
44 args.AddArgument(
"--output-seq-file", vtksys::CommandLineArguments::EQUAL_ARGUMENT, &outputImgSeqFileName,
"The output ultrasound sequence with scanlines overlaid on the images.");
45 args.AddArgument(
"--config-file", vtksys::CommandLineArguments::EQUAL_ARGUMENT, &inputConfigFileName,
"The ultrasound sequence config file.");
46 args.AddArgument(
"--help", vtksys::CommandLineArguments::NO_ARGUMENT, &printHelp,
"Print this help.");
47 args.AddArgument(
"--verbose", vtksys::CommandLineArguments::EQUAL_ARGUMENT, &verboseLevel,
"Verbose level (1=error only, 2=warning, 3=info, 4=debug, 5=trace)");
52 std::cerr <<
"Error parsing arguments." << std::endl;
53 std::cout <<
"Help: " << args.GetHelp() << std::endl;
59 std::cout << args.GetHelp() << std::endl;
66 if (inputImgSeqFileName.empty())
68 LOG_ERROR(
"--seq-file required");
72 if (inputConfigFileName.empty())
74 LOG_ERROR(
"--config-file required");
79 vtkSmartPointer<vtkIGSIOTrackedFrameList> trackedFrameList = vtkSmartPointer<vtkIGSIOTrackedFrameList>::New();
82 LOG_ERROR(
"Unable to load input image sequence.");
87 vtkSmartPointer<vtkXMLDataElement> configRootElement = vtkSmartPointer<vtkXMLDataElement>::New();
90 LOG_ERROR(
"Unable to read configuration from file " << inputConfigFileName.c_str());
94 vtkXMLDataElement* scanConversionElement = configRootElement->LookupElementWithName(
"ScanConversion");
95 if (scanConversionElement == NULL)
97 LOG_ERROR(
"ScanConversion element was not found in input configuration file");
102 int numOfScanlines = 50;
103 vtkXMLDataElement* usSimulatorAlgoElement = configRootElement->LookupElementWithName(
"vtkPlusUsSimulatorAlgo");
104 if (usSimulatorAlgoElement != NULL)
107 usSimulatorAlgoElement->GetScalarAttribute(
"NumberOfScanlines", numOfScanlines);
111 LOG_INFO(
"vtkPlusUsSimulatorAlgo element not found in input configuration file. Using default NumberOfScanlines (" << numOfScanlines <<
")");
115 const char* transducerGeometry = scanConversionElement->GetAttribute(
"TransducerGeometry");
116 if (transducerGeometry == NULL)
118 LOG_ERROR(
"Scan converter TransducerGeometry is undefined");
121 vtkSmartPointer<vtkPlusUsScanConvert> scanConverter;
122 if (STRCASECMP(transducerGeometry,
"CURVILINEAR") == 0)
126 else if (STRCASECMP(transducerGeometry,
"LINEAR") == 0)
132 LOG_ERROR(
"Invalid scan converter TransducerGeometry: " << transducerGeometry);
136 scanConverter->ReadConfiguration(scanConversionElement);
138 const int numOfSamplesPerScanline = 100;
139 int rfImageExtent[6] = {0, numOfSamplesPerScanline - 1, 0, numOfScanlines - 1, 0, 0};
140 scanConverter->SetInputImageExtent(rfImageExtent);
142 igsioCommon::PixelLineList lines;
143 for (
int scanLine = 0; scanLine < rfImageExtent[3] - rfImageExtent[2] + 1; scanLine++)
145 double start[4] = { 0 };
146 double end[4] = { 0 };
147 scanConverter->GetScanLineEndPoints(scanLine,
start, end);
148 igsioCommon::PixelPoint startPoint = { static_cast<int>(std::round(
start[0])), static_cast<int>(std::round(
start[1])), static_cast<int>(std::round(
start[2])) };
149 igsioCommon::PixelPoint endPoint = { static_cast<int>(std::round(end[0])), static_cast<int>(std::round(end[1])), static_cast<int>(std::round(end[2])) };
150 lines.push_back(igsioCommon::PixelLine(startPoint, endPoint));
155 igsioCommon::DrawScanLines(rfImageExtent, 255, lines, trackedFrameList);
159 LOG_INFO(
"Writing new sequence to file...");
160 if (outputImgSeqFileName.empty())
162 int extensionDot = inputImgSeqFileName.find_last_of(
".");
163 if (extensionDot != std::string::npos)
165 inputImgSeqFileName = inputImgSeqFileName.substr(0, extensionDot);
167 outputImgSeqFileName = inputImgSeqFileName +
"-Scanlines.nrrd";
173 LOG_INFO(
"Writing to " << outputImgSeqFileName <<
" complete.");
static vtkPlusUsScanConvertLinear * New()
static igsioStatus Write(const std::string &filename, igsioTrackedFrame *frame, US_IMAGE_ORIENTATION orientationInFile=US_IMG_ORIENT_MF, bool useCompression=true, bool EnableImageDataWrite=true)
static vtkPlusUsScanConvertCurvilinear * New()
static igsioStatus Read(const std::string &filename, vtkIGSIOTrackedFrameList *frameList)
int main(int argc, char **argv)
static vtkIGSIOLogger * Instance()
static PlusStatus ReadDeviceSetConfigurationFromFile(vtkXMLDataElement *config, const char *filename)