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 PointArrayType& points);
19 int main(int argc, char** argv)
21 GGO(clitkTransformLandmarks, args_info);
23 PointArrayType inputPoints;
24 read_points(args_info.input_arg, inputPoints);
26 MatrixType matrix = clitk::ReadMatrix3D(args_info.matrix_arg);
28 PointArrayType outputPoints;
29 transform_points(inputPoints, matrix, outputPoints);
31 write_points(outputPoints);
35 void read_points(const std::string& fileName, PointArrayType& points)
37 std::ifstream landmarksFile(fileName.c_str());
38 if (landmarksFile.fail()) {
39 std::cout << "ERROR: could not open '" << fileName << "'" << std::endl;
44 std::getline(landmarksFile, line);
45 if (line.find("LANDMARKS") == std::string::npos) {
46 std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
54 std::istringstream linestr;
55 while (!landmarksFile.eof()) {
56 std::getline(landmarksFile, line);
57 if (verbose) std::cout << "line " << line << std::endl;
61 linestr >> id >> point[0] >> point[1] >> point[2];
63 if (verbose) std::cout << "point " << point << std::endl;
65 points.push_back(point);
70 void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output)
72 for (size_t i = 0; i < input.size(); i++) {
73 output.push_back(matrix * input[i]);
77 void write_points(const PointArrayType& points)
79 std::cout << "LANDMARKS1" << std::endl;
80 for (size_t i = 0; i < points.size(); i++)
81 std::cout << i << " " << points[i][0] << " " << points[i][1] << " " << points[i][2] << " " << "0" << " " << std::endl;