X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkTransformLandmarks.cxx;h=ea84d18674c8712845468accfffb6707d6a28913;hb=573d80d0f7a17607d2ee883c21c940c0ba020282;hp=4d424081d7e0d92b69ccf6e88be4a992c4864f47;hpb=c8c84f7f5305aad920d35931314e61a63b921716;p=clitk.git diff --git a/tools/clitkTransformLandmarks.cxx b/tools/clitkTransformLandmarks.cxx index 4d42408..ea84d18 100644 --- a/tools/clitkTransformLandmarks.cxx +++ b/tools/clitkTransformLandmarks.cxx @@ -1,3 +1,20 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================*/ #include "clitkTransformLandmarks_ggo.h" #include "clitkTransformUtilities.h" @@ -9,10 +26,18 @@ typedef itk::Matrix MatrixType; typedef itk::Point PointType; typedef std::vector PointArrayType; +typedef itk::FixedArray TxtDataType; +typedef std::vector TxtDataArrayType; + + +void read_points_txt(const std::string& fileName, PointArrayType& points, TxtDataArrayType& data); +void write_points_txt(const std::string& fileName, const PointArrayType& points, const TxtDataArrayType& data); + +void read_points_pts(const std::string& fileName, PointArrayType& points); +void write_points_pts(const std::string& fileName, const PointArrayType& points); -void read_points(const std::string& fileName, PointArrayType& points); void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output); -void write_points(const std::string& fileName, const PointArrayType& points); + bool verbose = false; @@ -21,19 +46,31 @@ int main(int argc, char** argv) GGO(clitkTransformLandmarks, args_info); verbose = args_info.verbose_flag; - PointArrayType inputPoints; - read_points(args_info.input_arg, inputPoints); - 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 { + read_points_pts(args_info.input_arg, inputPoints); + } + PointArrayType outputPoints; transform_points(inputPoints, matrix, outputPoints); + + if (strcmp(args_info.type_arg, "txt") == 0) { + write_points_txt(args_info.output_arg, outputPoints, data); + } + else { + write_points_pts(args_info.output_arg, outputPoints); + } - write_points(args_info.output_arg, outputPoints); return 0; } -void read_points(const std::string& fileName, PointArrayType& points) +void read_points_txt(const std::string& fileName, PointArrayType& points, TxtDataArrayType& data) { std::ifstream landmarksFile(fileName.c_str()); if (landmarksFile.fail()) { @@ -48,38 +85,81 @@ void read_points(const std::string& fileName, PointArrayType& points) exit(-3); } - int id = 0; - PointType point; - point.Fill(1); + PointType p; + p.Fill(1); + + TxtDataType d; - std::istringstream linestr; while (!landmarksFile.eof()) { - std::getline(landmarksFile, line); - if (verbose) std::cout << "line " << line << std::endl; + // read id, x, y, z, d1, d2 + landmarksFile >> d[0] >> p[0] >> p[1] >> p[2] >> d[1];// >> d[2]; + if (landmarksFile.fail()) + break; - if (!line.empty()) { - linestr.str(line); - linestr >> id >> point[0] >> point[1] >> point[2]; - - if (verbose) std::cout << "point " << point << std::endl; - - points.push_back(point); + if (verbose){ + std::cout << "point " << p << std::endl; + std::cout << "data " << " " << d[0] << " " << d[1] << std::endl; } + + points.push_back(p); + data.push_back(d); } } -void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output) +void write_points_txt(const std::string& fileName, const PointArrayType& points, const TxtDataArrayType& data) { - for (size_t i = 0; i < input.size(); i++) { - output.push_back(matrix * input[i]); + std::ofstream landmarksFile(fileName.c_str()); + + landmarksFile << "LANDMARKS1" << std::endl; + for (size_t i = 0; i < points.size(); i++) + landmarksFile << data[i][0] << " " << points[i][0] << " " << points[i][1] << " " << points[i][2] << " " << data[i][1] << " " << std::endl; +} + +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; + exit(-2); + } + + std::string line; + std::getline(landmarksFile, line); + if (line.find("#X") != 0) { + std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl; + exit(-3); + } + + PointType p; + p.Fill(1); + + while (!landmarksFile.eof()) { + // read id, x, y, z, d1, d2 + landmarksFile >> p[0] >> p[1] >> p[2]; + if (landmarksFile.fail()) + break; + + if (verbose){ + std::cout << "point " << p << std::endl; + } + + points.push_back(p); } } -void write_points(const std::string& fileName, const PointArrayType& points) +void write_points_pts(const std::string& fileName, const PointArrayType& points) { std::ofstream landmarksFile(fileName.c_str()); - landmarksFile << "LANDMARKS1" << std::endl; + landmarksFile << "#X\tY\tZ" << std::endl; for (size_t i = 0; i < points.size(); i++) - landmarksFile << i << " " << points[i][0] << " " << points[i][1] << " " << points[i][2] << " " << "0" << " " << std::endl; -} \ No newline at end of file + landmarksFile << points[i][0] << "\t" << points[i][1] << "\t" << points[i][2] << "\t" << std::endl; +} + +void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output) +{ + for (size_t i = 0; i < input.size(); i++) { + output.push_back(matrix * input[i]); + } +} +