The following section contains a small C example that creates an
ML module network for loading, filtering and saving an image. Note that
the libraries for MLUtilities
,
MLLinearAlgebra
, ML
,
MLImageFile
, MLGeometry1
,
MLDicomTree_OFFIS
and MLImageIO
must
be available in binary search paths to run the program correctly. They
can normally be found in the installation directory of MeVisLab which is
usually available when working with the ML.
The example program implements the following operations:
Checking the number of command line parameters and the validity of the ML version,
Loading the libraries MLImageFile
,
MLGeometry1
, and
MLDicomTree_OFFIS
to have all required modules
linked to the executable,
Creating an ImgLoad
,
Resample3D
, and
ImageSave
module,
Setting input and output file names in
ImageLoad
and
ImageSave
module,
Connecting ImageLoad
,
Resample3D
, and
ImageSave
module to a module pipeline,
and
Setting zoom parameter in Resample3D
,
saving the result in a file by triggering
ImageSave
, and checking the status field of
ImageSave
.
Example 6.1. Using the C-API
// Simple ML program that initializes the library, loads the given // dataset, applies a resampling and writes the result back to disk. // // The input file can be any format supported by the MFL (MeVis File Library) now called MLImageIO, // including DICOM (.dcm), TIFF (.tif,.tiff) // // The output file is written as a DICOM/TIFF combination typically used by // MeVisLab (DICOM header + tiff data). #include "mlAPI.h" #include <stdio.h> #include <iostream>
int main(int argc, char* argv[]) { // run only if enough arguments if (argc > 5) { // Extra char buffer char buffer[4096]="\n"; std::cout << "imagefilter: loading " << argv[1] << std::endl; std::cout << "imagefilter: output " << argv[2] << std::endl; // Initialize the ML. MLInit(ML_MAJOR_VERSION, ML_MAJOR_CAPI_VERSION, ML_CAPI_REVISION); // Load additional image file and filter module libraries. MLLoadLibrary("MLImageFile"); MLLoadLibrary("MLGeometry1"); // Also load a DICOM tree implementation to be able to load DICOM images. MLLoadLibrary("MLDicomTree_OFFIS"); //-------------------------------------------- // Create modules // Create an ImgLoad module. mlModule* loader = MLCreateModuleFromName("ImgLoad"); // Create resample module. mlModule* resample = MLCreateModuleFromName("Resample3D"); // Create an ImgSave module. mlModule* writer = MLCreateModuleFromName("ImgSave"); //-------------------------------------------- // Setup file names // Get the file name field of the loader. mlField* loaderFilenameField = MLModuleGetField(loader,"filename"); // Set the file name field to the given command line argument MLFieldSetValue(loaderFilenameField,argv[1]); // Get the file name field of the writer. mlField* writerFilenameField = MLModuleGetField(writer,"filename"); // Set the file name field to the given command line argument MLFieldSetValue(writerFilenameField,argv[2]); //-------------------------------------------- // Connect modules // Get the output image field of the loader. mlField* loaderOutput0 = MLModuleGetField(loader,"output0"); // Get the input image field of the resample module. mlField* resampleInput0 = MLModuleGetField(resample,"input0"); // Connect input of resample to output of loader. // Always connect input to output (destination to source) and not vice versa. MLFieldConnectFrom(resampleInput0,loaderOutput0); // Get the output image field of the resample module. mlField* resampleOutput0 = MLModuleGetField(resample,"output0"); // Get the input image field of the writer module. mlField* writerInput0 = MLModuleGetField(writer,"input0"); // Connect input of resample to output of loader. MLFieldConnectFrom(writerInput0,resampleOutput0); //-------------------------------------------- // Set zoom factor // Get zoom factor field. mlField* zoomField = MLModuleGetField(resample,"zoom"); // Concatenate arguments to form a vector string. sprintf(buffer,"%s %s %s",argv[3],argv[4],argv[5]); // Set vector string value to zoom field. MLFieldSetValue(zoomField,buffer); //-------------------------------------------- // Write image back to disk // Get save field from writer. mlField* saveField = MLModuleGetField(writer,"save"); // Touch the save trigger, this actually saves the image to disk. std::cerr << "Starting image save..." << std::endl; MLFieldTouch(saveField); std::cerr << "...finished." << std::endl; //-------------------------------------------- // Check if writing was ok mlField* statusField = MLModuleGetField(writer,"status"); // Get value of status field into given buffer (maximum buffer size is also passed). MLFieldGetValue(statusField, buffer, 4096); std::cout << "Write status: " << buffer << std::endl; } else { std::cout << "Usage: imagefilter inputfile outputfile xscale yscale zscale" << std::endl; } return 0; }
This example called with the command line arguments
/demodata/Carotid1_MRA.small.dcm Carotid1_MRA.small.scaled.dcm 1 2 3
is comparable to the following module network and panels in MeVisLab:
© 2024 MeVis Medical Solutions AG