diff options
-rw-r--r-- | extern/libmv/CMakeLists.txt | 2 | ||||
-rw-r--r-- | extern/libmv/files.txt | 2 | ||||
-rw-r--r-- | extern/libmv/libmv-capi.cpp | 54 | ||||
-rw-r--r-- | extern/libmv/libmv/simple_pipeline/rigid_registration.cc | 182 | ||||
-rw-r--r-- | extern/libmv/libmv/simple_pipeline/rigid_registration.h | 68 |
5 files changed, 0 insertions, 308 deletions
diff --git a/extern/libmv/CMakeLists.txt b/extern/libmv/CMakeLists.txt index 241e8bf2cd1..a4910d94a37 100644 --- a/extern/libmv/CMakeLists.txt +++ b/extern/libmv/CMakeLists.txt @@ -59,7 +59,6 @@ set(SRC libmv/simple_pipeline/pipeline.cc libmv/simple_pipeline/reconstruction.cc libmv/simple_pipeline/resect.cc - libmv/simple_pipeline/rigid_registration.cc libmv/simple_pipeline/tracks.cc libmv/tracking/brute_region_tracker.cc libmv/tracking/esm_region_tracker.cc @@ -118,7 +117,6 @@ set(SRC libmv/simple_pipeline/pipeline.h libmv/simple_pipeline/reconstruction.h libmv/simple_pipeline/resect.h - libmv/simple_pipeline/rigid_registration.h libmv/simple_pipeline/tracks.h libmv/tracking/brute_region_tracker.h libmv/tracking/esm_region_tracker.h diff --git a/extern/libmv/files.txt b/extern/libmv/files.txt index 8eead23ea08..16afdb36371 100644 --- a/extern/libmv/files.txt +++ b/extern/libmv/files.txt @@ -54,8 +54,6 @@ libmv/simple_pipeline/reconstruction.cc libmv/simple_pipeline/reconstruction.h libmv/simple_pipeline/resect.cc libmv/simple_pipeline/resect.h -libmv/simple_pipeline/rigid_registration.cc -libmv/simple_pipeline/rigid_registration.h libmv/simple_pipeline/tracks.cc libmv/simple_pipeline/tracks.h libmv/tracking/brute_region_tracker.cc diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp index 74224eb5368..c915205dd16 100644 --- a/extern/libmv/libmv-capi.cpp +++ b/extern/libmv/libmv-capi.cpp @@ -56,7 +56,6 @@ #include "libmv/simple_pipeline/detect.h" #include "libmv/simple_pipeline/pipeline.h" #include "libmv/simple_pipeline/camera_intrinsics.h" -#include "libmv/simple_pipeline/rigid_registration.h" #include "libmv/simple_pipeline/modal_solver.h" #include <stdlib.h> @@ -968,56 +967,3 @@ void libmv_InvertIntrinsics(libmv_cameraIntrinsicsOptions *libmv_camera_intrinsi camera_intrinsics.InvertIntrinsics(x, y, x1, y1); } } - -/* ************ point clouds ************ */ - -static void libmvTransformToMat4(libmv::Mat3 &R, libmv::Vec3 &S, libmv::Vec3 &t, double M[4][4]) -{ - for (int j = 0; j < 3; ++j) - for (int k = 0; k < 3; ++k) - M[j][k] = R(k, j) * S(j); - - for (int i = 0; i < 3; ++i) { - M[3][0] = t(0); - M[3][1] = t(1); - M[3][2] = t(2); - - M[0][3] = M[1][3] = M[2][3] = 0; - } - - M[3][3] = 1.0; -} - -void libmv_rigidRegistration(float (*reference_points)[3], float (*points)[3], int total_points, - int use_scale, int use_translation, double M[4][4]) -{ - libmv::Mat3 R; - libmv::Vec3 S; - libmv::Vec3 t; - libmv::vector<libmv::Vec3> reference_points_vector, points_vector; - - for (int i = 0; i < total_points; i++) { - reference_points_vector.push_back(libmv::Vec3(reference_points[i][0], - reference_points[i][1], - reference_points[i][2])); - - points_vector.push_back(libmv::Vec3(points[i][0], - points[i][1], - points[i][2])); - } - - if (use_scale && use_translation) { - libmv::RigidRegistration(reference_points_vector, points_vector, R, S, t); - } - else if (use_translation) { - S = libmv::Vec3(1.0, 1.0, 1.0); - libmv::RigidRegistration(reference_points_vector, points_vector, R, t); - } - else { - S = libmv::Vec3(1.0, 1.0, 1.0); - t = libmv::Vec3::Zero(); - libmv::RigidRegistration(reference_points_vector, points_vector, R); - } - - libmvTransformToMat4(R, S, t, M); -} diff --git a/extern/libmv/libmv/simple_pipeline/rigid_registration.cc b/extern/libmv/libmv/simple_pipeline/rigid_registration.cc deleted file mode 100644 index f7cb1e66e7d..00000000000 --- a/extern/libmv/libmv/simple_pipeline/rigid_registration.cc +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright (c) 2012 libmv authors. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. - -#include "libmv/simple_pipeline/rigid_registration.h" -#include "libmv/numeric/levenberg_marquardt.h" - -namespace libmv { - -template<class RigidTransformation> -struct RigidRegistrationCostFunction { - public: - typedef Vec FMatrixType; - typedef RigidTransformation XMatrixType; - - RigidRegistrationCostFunction(const vector<Vec3> &reference_points, - const vector<Vec3> &points): - reference_points_(reference_points), - points_(points) {} - - Vec CalculateResiduals(const Mat3 &R, - const Vec3 &S, - const Vec3 &t) const { - Vec residuals(points_.size()); - residuals.setZero(); - - // Convert scale vector to matrix - Mat3 SMat = Mat3::Identity(); - SMat(0, 0) *= S(0); - SMat(1, 1) *= S(1); - SMat(2, 2) *= S(2); - - for (int i = 0; i < points_.size(); i++) { - Vec3 transformed_point = R * SMat * points_[i] + t; - - double norm = (transformed_point - reference_points_[i]).norm(); - - residuals(i) = norm * norm; - } - - return residuals; - } - - Vec operator()(const Vec9 &RSt) const { - Mat3 R = RotationFromEulerVector(RSt.head<3>()); - Vec3 S = RSt.segment<3>(3); - Vec3 t = RSt.tail<3>(); - - return CalculateResiduals(R, S, t); - } - - Vec operator()(const Vec3 &euler) const { - Mat3 R = RotationFromEulerVector(euler); - - return CalculateResiduals(R, Vec3(1.0, 1.0, 1.0), Vec3::Zero()); - } - - Vec operator()(const Vec6 &Rt) const { - Mat3 R = RotationFromEulerVector(Rt.head<3>()); - Vec3 t = Rt.tail<3>(); - - return CalculateResiduals(R, Vec3(1.0, 1.0, 1.0), t); - } - - private: - vector<Vec3> reference_points_; - vector<Vec3> points_; -}; - -static double RigidRegistrationError(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - const Mat3 &R, - const Vec3 &S, - const Vec3 &t) { - double error = 0.0; - - Mat3 SMat = Mat3::Identity(); - SMat(0, 0) *= S(0); - SMat(1, 1) *= S(1); - SMat(2, 2) *= S(2); - - for (int i = 0; i < points.size(); i++) { - Vec3 new_point = R * SMat * points[i] + t; - - double norm = (new_point - reference_points[i]).norm(); - error += norm * norm; - } - error /= points.size(); - - return error; -} - -double RigidRegistration(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - Mat3 &R, - Vec3 &S, - Vec3 &t) { - typedef LevenbergMarquardt<RigidRegistrationCostFunction <Vec9> > Solver; - - RigidRegistrationCostFunction<Vec9> rigidregistration_cost(reference_points, points); - Solver solver(rigidregistration_cost); - - Vec9 RSt = Vec9::Zero(); - - RSt(3) = RSt(4) = RSt(5) = 1.0; - - Solver::SolverParameters params; - /*Solver::Results results = */ solver.minimize(params, &RSt); - /* TODO(sergey): better error handling here */ - - LG << "Rigid registration completed, rotation is:" << RSt.head<3>().transpose() - << ", scale is " << RSt.segment<3>(3).transpose() - << ", translation is " << RSt.tail<3>().transpose(); - - // Decompose individual rotation and translation - R = RotationFromEulerVector(RSt.head<3>()); - S = RSt.segment<3>(3); - t = RSt.tail<3>(); - - return RigidRegistrationError(reference_points, points, R, S, t); -} - -double RigidRegistration(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - Mat3 &R, - Vec3 &t) { - typedef LevenbergMarquardt<RigidRegistrationCostFunction <Vec6> > Solver; - - RigidRegistrationCostFunction<Vec6> rigidregistration_cost(reference_points, points); - Solver solver(rigidregistration_cost); - - Vec6 Rt = Vec6::Zero(); - Solver::SolverParameters params; - /*Solver::Results results = */solver.minimize(params, &Rt); - /* TODO(sergey): better error handling here */ - - LG << "Rigid registration completed, rotation is:" << Rt.head<3>().transpose() - << ", translation is " << Rt.tail<3>().transpose(); - - R = RotationFromEulerVector(Rt.head<3>()); - t = Rt.tail<3>(); - - return RigidRegistrationError(reference_points, points, R, Vec3(1.0, 1.0, 1.0), t); -} - -double RigidRegistration(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - Mat3 &R) { - typedef LevenbergMarquardt<RigidRegistrationCostFunction <Vec3> > Solver; - - RigidRegistrationCostFunction<Vec3> rigidregistration_cost(reference_points, points); - Solver solver(rigidregistration_cost); - - Vec3 euler = Vec3::Zero(); - Solver::SolverParameters params; - /*Solver::Results results = */solver.minimize(params, &euler); - /* TODO(sergey): better error handling here */ - - LG << "Rigid registration completed, rotation is:" << euler.transpose(); - - R = RotationFromEulerVector(euler); - - return RigidRegistrationError(reference_points, points, R, Vec3(1.0, 1.0, 1.0), Vec3::Zero()); -} - -} // namespace libmv diff --git a/extern/libmv/libmv/simple_pipeline/rigid_registration.h b/extern/libmv/libmv/simple_pipeline/rigid_registration.h deleted file mode 100644 index 21ea57af507..00000000000 --- a/extern/libmv/libmv/simple_pipeline/rigid_registration.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2012 libmv authors. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. - -#ifndef LIBMV_SIMPLE_PIPELINE_RIGID_REGISTRATION_H_ -#define LIBMV_SIMPLE_PIPELINE_RIGID_REGISTRATION_H_ - -#include "libmv/base/vector.h" -#include "libmv/numeric/numeric.h" - -namespace libmv { - -/*! - Searched for an affine transformation of rigid 3D object defined by it's - vertices positions from it's current state called points to it's desired - state called reference points. - - Returns rotation matrix, per-component scale vector and translation which - transforms points to the mot close state to reference_points. - - Return value is an average squared distance between reference state - and transformed one. - - Minimzation of distance between point pairs is used to register such a - rigid transformation and algorithm assumes that pairs of points are - defined by point's index in a vector, so points with the same index - belongs to the same pair. - */ -double RigidRegistration(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - Mat3 &R, - Vec3 &S, - Vec3 &t); - -/*! - * Same as RigidRegistration but provides registration of rotation and translation only - */ -double RigidRegistration(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - Mat3 &R, - Vec3 &t); - -/*! - * Same as RigidRegistration but provides registration of rotation only - */ -double RigidRegistration(const vector<Vec3> &reference_points, - const vector<Vec3> &points, - Mat3 &R); - -} // namespace libmv - -#endif // LIBMV_SIMPLE_PIPELINE_RIGID_REGISTRATION_H_ |