From 8d401ddc31638ef3d19baec0618d21bb9f04c79a Mon Sep 17 00:00:00 2001 From: Antonios Matakos Date: Sun, 14 Mar 2021 09:10:59 -0700 Subject: [PATCH 1/5] Add new model_transformer command --- src/exe/colmap.cc | 1 + src/exe/model.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/exe/model.h | 1 + 3 files changed, 48 insertions(+) diff --git a/src/exe/colmap.cc b/src/exe/colmap.cc index f981302045..2554ea4427 100644 --- a/src/exe/colmap.cc +++ b/src/exe/colmap.cc @@ -127,6 +127,7 @@ int main(int argc, char** argv) { commands.emplace_back("model_merger", &RunModelMerger); commands.emplace_back("model_orientation_aligner", &RunModelOrientationAligner); + commands.emplace_back("model_transformerr", &RunModelTransformer); commands.emplace_back("patch_match_stereo", &RunPatchMatchStereo); commands.emplace_back("point_filtering", &RunPointFiltering); commands.emplace_back("point_triangulator", &RunPointTriangulator); diff --git a/src/exe/model.cc b/src/exe/model.cc index f6a5e7fb40..3db7f805c8 100644 --- a/src/exe/model.cc +++ b/src/exe/model.cc @@ -459,4 +459,50 @@ int RunModelOrientationAligner(int argc, char** argv) { return EXIT_SUCCESS; } +int RunModelTransformer(int argc, char** argv) { + std::string input_path; + std::string output_path; + std::string transform_path; + bool is_dense = false; + bool is_inverse = false; + + OptionManager options; + options.AddRequiredOption("input_path", &input_path); + options.AddRequiredOption("output_path", &output_path); + options.AddRequiredOption("transform_path", &transform_path); + options.AddDefaultOption("is_dense", &is_dense); + options.AddDefaultOption("is_inverse", &is_inverse); + options.Parse(argc, argv); + + std::cout << "Reading points input: " << input_path << std::endl; + Reconstruction recon; + if (is_dense || HasFileExtension(input_path, ".ply")) { + is_dense = true; + recon.ImportPLY(input_path); + } else { + recon.Read(input_path); + } + + std::cout << "Reading transform input: " << transform_path << std::endl; + SimilarityTransform3 tform(transform_path); + if (is_inverse) { + tform = tform.Inverse(); + } + + // apply full transform to point coordinates (scale, rotation, translation), + // only apply rotation to normal vectors, and leave RGB values unaffected + std::cout << "Applying transform to recon with " << recon.NumPoints3D() + << " points" << std::endl; + recon.Transform(tform); + + std::cout << "Writing output: " << output_path << std::endl; + if (is_dense) { + recon.ExportPLY(output_path); + } else { + recon.Write(output_path); + } + + return EXIT_SUCCESS; +} + } // namespace colmap diff --git a/src/exe/model.h b/src/exe/model.h index 0f20f7f3b8..81e13e5e13 100644 --- a/src/exe/model.h +++ b/src/exe/model.h @@ -37,5 +37,6 @@ int RunModelComparer(int argc, char** argv); int RunModelConverter(int argc, char** argv); int RunModelMerger(int argc, char** argv); int RunModelOrientationAligner(int argc, char** argv); +int RunModelTransformer(int argc, char** argv); } // namespace colmap From 32ab64872d4e57f6e62527e5311665ad3caf3c0c Mon Sep 17 00:00:00 2001 From: Antonios Matakos Date: Sun, 14 Mar 2021 09:16:24 -0700 Subject: [PATCH 2/5] Add similarity transform constructor --- src/base/similarity_transform.cc | 15 +++++++++++++++ src/base/similarity_transform.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/base/similarity_transform.cc b/src/base/similarity_transform.cc index 45e9eda861..a9f817dd13 100755 --- a/src/base/similarity_transform.cc +++ b/src/base/similarity_transform.cc @@ -37,6 +37,8 @@ #include "estimators/similarity_transform.h" #include "optim/loransac.h" +#include + namespace colmap { namespace { @@ -194,6 +196,19 @@ SimilarityTransform3::SimilarityTransform3(const double scale, transform_.matrix() = matrix; } +SimilarityTransform3::SimilarityTransform3(const std::string& path) { + std::ifstream file(path); + CHECK(file.is_open()) << path; + + Eigen::Matrix4d matrix = Eigen::MatrixXd::Identity(4, 4); + for (int i = 0; i < matrix.rows(); ++i) { + for (int j = 0; j < matrix.cols(); ++j) { + file >> matrix(i, j); + } + } + transform_.matrix() = matrix; +} + SimilarityTransform3 SimilarityTransform3::Inverse() const { return SimilarityTransform3(transform_.inverse()); } diff --git a/src/base/similarity_transform.h b/src/base/similarity_transform.h index 3966b02bac..f3b8cda642 100755 --- a/src/base/similarity_transform.h +++ b/src/base/similarity_transform.h @@ -61,6 +61,8 @@ class SimilarityTransform3 { SimilarityTransform3(const double scale, const Eigen::Vector4d& qvec, const Eigen::Vector3d& tvec); + SimilarityTransform3(const std::string& path); + template bool Estimate(const std::vector& src, const std::vector& dst); From 9eb1892e00a2798bfc4a1af84072f6e57e3b1497 Mon Sep 17 00:00:00 2001 From: Antonios Matakos Date: Sun, 14 Mar 2021 14:00:34 -0700 Subject: [PATCH 3/5] Update command --- src/exe/model.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/exe/model.cc b/src/exe/model.cc index 3db7f805c8..9fd7a0bad4 100644 --- a/src/exe/model.cc +++ b/src/exe/model.cc @@ -463,24 +463,28 @@ int RunModelTransformer(int argc, char** argv) { std::string input_path; std::string output_path; std::string transform_path; - bool is_dense = false; bool is_inverse = false; OptionManager options; options.AddRequiredOption("input_path", &input_path); options.AddRequiredOption("output_path", &output_path); options.AddRequiredOption("transform_path", &transform_path); - options.AddDefaultOption("is_dense", &is_dense); options.AddDefaultOption("is_inverse", &is_inverse); options.Parse(argc, argv); std::cout << "Reading points input: " << input_path << std::endl; Reconstruction recon; - if (is_dense || HasFileExtension(input_path, ".ply")) { + bool is_dense = false; + if (HasFileExtension(input_path, ".ply")) { is_dense = true; recon.ImportPLY(input_path); - } else { + } else if (ExistsDir(input_path)) { recon.Read(input_path); + } else { + std::cerr << "Invalid model input; not a PLY file or sparse reconstruction " + "directory." + << std::endl; + return EXIT_FAILURE; } std::cout << "Reading transform input: " << transform_path << std::endl; @@ -489,8 +493,6 @@ int RunModelTransformer(int argc, char** argv) { tform = tform.Inverse(); } - // apply full transform to point coordinates (scale, rotation, translation), - // only apply rotation to normal vectors, and leave RGB values unaffected std::cout << "Applying transform to recon with " << recon.NumPoints3D() << " points" << std::endl; recon.Transform(tform); From ff26e3469a2d975bf01bfb747fa7fc1d1df11f6a Mon Sep 17 00:00:00 2001 From: Antonios Matakos Date: Sun, 14 Mar 2021 14:02:44 -0700 Subject: [PATCH 4/5] Fix typo --- src/exe/colmap.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exe/colmap.cc b/src/exe/colmap.cc index 2554ea4427..b96f19f283 100644 --- a/src/exe/colmap.cc +++ b/src/exe/colmap.cc @@ -127,7 +127,7 @@ int main(int argc, char** argv) { commands.emplace_back("model_merger", &RunModelMerger); commands.emplace_back("model_orientation_aligner", &RunModelOrientationAligner); - commands.emplace_back("model_transformerr", &RunModelTransformer); + commands.emplace_back("model_transformer", &RunModelTransformer); commands.emplace_back("patch_match_stereo", &RunPatchMatchStereo); commands.emplace_back("point_filtering", &RunPointFiltering); commands.emplace_back("point_triangulator", &RunPointTriangulator); From cd5f4f3b83f75ea36991a150f90ed7a77f8988d9 Mon Sep 17 00:00:00 2001 From: Antonios Matakos Date: Sat, 3 Apr 2021 11:09:37 -0700 Subject: [PATCH 5/5] Update model_transformer to use SimilarityTransform3::FromFile --- src/exe/model.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exe/model.cc b/src/exe/model.cc index b89d03356b..e7b37e70ff 100644 --- a/src/exe/model.cc +++ b/src/exe/model.cc @@ -575,7 +575,7 @@ int RunModelTransformer(int argc, char** argv) { } std::cout << "Reading transform input: " << transform_path << std::endl; - SimilarityTransform3 tform(transform_path); + SimilarityTransform3 tform = SimilarityTransform3::FromFile(transform_path); if (is_inverse) { tform = tform.Inverse(); }