1 #include "clitkTransformLandmarks_ggo.h"
3 #include "clitkTransformUtilities.h"
9 typedef itk::Matrix<double, 4, 4> MatrixType;
10 typedef itk::Point<double, 4> PointType;
11 typedef std::vector<PointType> PointArrayType;
13 void read_points(const std::string& fileName, PointArrayType& points);
14 void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output);
15 void write_points(const std::string& fileName, const PointArrayType& points);
19 int main(int argc, char** argv)
21 GGO(clitkTransformLandmarks, args_info);
22 verbose = args_info.verbose_flag;
24 PointArrayType inputPoints;
25 read_points(args_info.input_arg, inputPoints);
27 MatrixType matrix = clitk::ReadMatrix3D(args_info.matrix_arg);
29 PointArrayType outputPoints;
30 transform_points(inputPoints, matrix, outputPoints);
32 write_points(args_info.output_arg, outputPoints);
36 void read_points(const std::string& fileName, PointArrayType& points)
38 std::ifstream landmarksFile(fileName.c_str());
39 if (landmarksFile.fail()) {
40 std::cout << "ERROR: could not open '" << fileName << "'" << std::endl;
45 std::getline(landmarksFile, line);
46 if (line.find("LANDMARKS") == std::string::npos) {
47 std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
55 std::istringstream linestr;
56 while (!landmarksFile.eof()) {
57 std::getline(landmarksFile, line);
58 if (verbose) std::cout << "line " << line << std::endl;
62 linestr >> id >> point[0] >> point[1] >> point[2];
64 if (verbose) std::cout << "point " << point << std::endl;
66 points.push_back(point);
71 void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output)
73 for (size_t i = 0; i < input.size(); i++) {
74 output.push_back(matrix * input[i]);
78 void write_points(const std::string& fileName, const PointArrayType& points)
80 std::ofstream landmarksFile(fileName.c_str());
82 landmarksFile << "LANDMARKS1" << std::endl;
83 for (size_t i = 0; i < points.size(); i++)
84 landmarksFile << i << " " << points[i][0] << " " << points[i][1] << " " << points[i][2] << " " << "0" << " " << std::endl;