X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkTransformLandmarks.cxx;h=df5dbe8e390521e8705019f14dea0defd66db44c;hb=543b72e23ad001ac2a7743b9beacf48e2d0054ac;hp=ea84d18674c8712845468accfffb6707d6a28913;hpb=765020625fbc092d283e221e36c83e60a1844cb7;p=clitk.git diff --git a/tools/clitkTransformLandmarks.cxx b/tools/clitkTransformLandmarks.cxx index ea84d18..df5dbe8 100644 --- a/tools/clitkTransformLandmarks.cxx +++ b/tools/clitkTransformLandmarks.cxx @@ -23,6 +23,14 @@ #include #include +#include +#include +#include +#include "vtkPolyDataReader.h" +#include "vtkPolyDataWriter.h" +#include +#include + typedef itk::Matrix MatrixType; typedef itk::Point PointType; typedef std::vector PointArrayType; @@ -36,6 +44,7 @@ void write_points_txt(const std::string& fileName, const PointArrayType& points, void read_points_pts(const std::string& fileName, PointArrayType& points); void write_points_pts(const std::string& fileName, const PointArrayType& points); +void apply_spacing(const PointArrayType& input, const double* spacing, PointArrayType& output); void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output); @@ -46,25 +55,65 @@ int main(int argc, char** argv) GGO(clitkTransformLandmarks, args_info); verbose = args_info.verbose_flag; - MatrixType matrix = clitk::ReadMatrix3D(args_info.matrix_arg); - TxtDataArrayType data; PointArrayType inputPoints; if (strcmp(args_info.type_arg, "txt") == 0) { read_points_txt(args_info.input_arg, inputPoints, data); } + else if (strcmp(args_info.type_arg, "vtk") == 0) { + vtkSmartPointer reader = vtkSmartPointer::New(); + reader->SetFileName(args_info.input_arg); + reader->Update(); + vtkSmartPointer writer = vtkSmartPointer::New(); + writer->SetFileName( args_info.output_arg ); + + if (args_info.matrix_given) { + vtkSmartPointer transformFilter = vtkSmartPointer::New(); + vtkSmartPointer transform = vtkSmartPointer::New(); + vtkMatrix4x4* matrix = clitk::ReadVTKMatrix3D(args_info.matrix_arg); + vtkSmartPointer matrixT = vtkSmartPointer::New(); + vtkMatrix4x4::Invert(matrix, matrixT); //not sure why, but this seems necessary for using the same .mat as when loading file with vv (probably due to the inversion trick performed in the vv reader...) + transform->SetMatrix(matrixT); + transformFilter->SetInputConnection(reader->GetOutputPort()); + transformFilter->SetTransform(transform); + writer->SetInputConnection(transformFilter->GetOutputPort()); + + } + else { //just write the output + writer->SetInputConnection( reader->GetOutputPort() ); + } + + writer->Write(); + return 0; + } else { read_points_pts(args_info.input_arg, inputPoints); } PointArrayType outputPoints; - transform_points(inputPoints, matrix, outputPoints); + PointArrayType spacingPoints; + PointArrayType* workingInputPoints = &inputPoints; + PointArrayType* workingOutputPoints = &outputPoints; + if (args_info.spacing_given) { + if (verbose) std::cout << "Processing spacing..." << std::endl; + + apply_spacing(*workingInputPoints, args_info.spacing_arg, spacingPoints); + workingInputPoints = &spacingPoints; + workingOutputPoints = &spacingPoints; + } + + MatrixType matrix; + if (args_info.matrix_given) { + matrix = clitk::ReadMatrix3D(args_info.matrix_arg); + transform_points(*workingInputPoints, matrix, outputPoints); + workingOutputPoints = &outputPoints; + } if (strcmp(args_info.type_arg, "txt") == 0) { - write_points_txt(args_info.output_arg, outputPoints, data); + write_points_txt(args_info.output_arg, *workingOutputPoints, data); } else { - write_points_pts(args_info.output_arg, outputPoints); + write_points_pts(args_info.output_arg, *workingOutputPoints); } return 0; @@ -74,14 +123,14 @@ void read_points_txt(const std::string& fileName, PointArrayType& points, TxtDat { std::ifstream landmarksFile(fileName.c_str()); if (landmarksFile.fail()) { - std::cout << "ERROR: could not open '" << fileName << "'" << std::endl; + std::cerr << "ERROR: could not open '" << fileName << "'" << std::endl; exit(-2); } std::string line; std::getline(landmarksFile, line); if (line.find("LANDMARKS") == std::string::npos) { - std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl; + std::cerr << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl; exit(-3); } @@ -119,14 +168,14 @@ void read_points_pts(const std::string& fileName, PointArrayType& points) { std::ifstream landmarksFile(fileName.c_str()); if (landmarksFile.fail()) { - std::cout << "ERROR: could not open '" << fileName << "'" << std::endl; + std::cerr << "ERROR: could not open '" << fileName << "'" << std::endl; exit(-2); } std::string line; std::getline(landmarksFile, line); if (line.find("#X") != 0) { - std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl; + std::cerr << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl; exit(-3); } @@ -156,6 +205,22 @@ void write_points_pts(const std::string& fileName, const PointArrayType& points) landmarksFile << points[i][0] << "\t" << points[i][1] << "\t" << points[i][2] << "\t" << std::endl; } +void apply_spacing(const PointArrayType& input, const double* spacing, PointArrayType& output) +{ + PointType out; + out.Fill(1); + + for (size_t i = 0; i < input.size(); i++) { + out[0] = input[i][0] * spacing[0]; + out[1] = input[i][1] * spacing[1]; + out[2] = input[i][2] * spacing[2]; + if (verbose){ + std::cout << "output " << out << std::endl; + } + output.push_back(out); + } +} + void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output) { for (size_t i = 0; i < input.size(); i++) {