PICCANTE  0.4
The hottest HDR imaging library!
nelder_mead_opt_fundamental.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_COMPUTER_VISION_NELDER_MEAD_OPT_FUNDAMENTAL_HPP
19 #define PIC_COMPUTER_VISION_NELDER_MEAD_OPT_FUNDAMENTAL_HPP
20 
21 #include "../util/eigen_util.hpp"
22 #include "../util/std_util.hpp"
23 #include "../util/matrix_3_x_3.hpp"
24 #include "../util/nelder_mead_opt_base.hpp"
25 
26 #ifndef PIC_DISABLE_EIGEN
27 #ifndef PIC_EIGEN_NOT_BUNDLED
28  #include "../externals/Eigen/Dense"
29 #else
30  #include <Eigen/Dense>
31 #endif
32 #endif
33 
34 namespace pic {
35 
36 #ifndef PIC_DISABLE_EIGEN
37 
39 {
40 public:
41  std::vector< Eigen::Vector2f > m0, m1;
42 
49  NelderMeadOptFundamental(std::vector< Eigen::Vector2f > &m0,
50  std::vector< Eigen::Vector2f > &m1,
51  std::vector< unsigned int> inliers) : NelderMeadOptBase()
52  {
53  filterInliers(m0, inliers, this->m0);
54  filterInliers(m1, inliers, this->m1);
55  }
56 
63  double FundamentalDistance(Eigen::Matrix3d &F, Eigen::Vector3d &p0, Eigen::Vector3d &p1)
64  {
65  Eigen::Vector3d F_p0 = F * p0;
66 
67  double norm = F_p0[0] * F_p0[0] + F_p0[1] * F_p0[1];
68  if(norm > 0.0) {
69  norm = sqrt(norm);
70  F_p0 /= norm;
71  }
72 
73  //computing distance
74 
75  return F_p0.dot(p1);
76  }
77 
84  float function(float *x, unsigned int n)
85  {
86  Eigen::Matrix3d F = getMatrixdFromLinearArray(x, 3, 3);
87  Eigen::Matrix3d F_t = Eigen::Transpose<Eigen::Matrix3d>(F);
88 
89  double err = 0.0;
90  for(unsigned int i = 0; i < m0.size(); i++) {
91 
92  Eigen::Vector3d p0 = Eigen::Vector3d(m0[i][0], m0[i][1], 1.0);
93  Eigen::Vector3d p1 = Eigen::Vector3d(m1[i][0], m1[i][1], 1.0);
94 
95  double tmp_err;
96 
97  // | p1^t F p0 | error
98  tmp_err = FundamentalDistance(F, p0, p1);
99  err += tmp_err * tmp_err;
100 
101  // | p0^t F^t p1 | error
102  tmp_err = FundamentalDistance(F_t, p1, p0);
103  err += tmp_err * tmp_err;
104  }
105 
106  return float(err);
107  }
108 };
109 #endif
110 
111 }
112 
113 #endif // PIC_COMPUTER_VISION_NELDER_MEAD_OPT_FUNDAMENTAL_HPP
std::vector< Eigen::Vector2f > m0
Definition: nelder_mead_opt_fundamental.hpp:41
Definition: nelder_mead_opt_fundamental.hpp:38
std::vector< Eigen::Vector2f > m1
Definition: nelder_mead_opt_fundamental.hpp:41
double FundamentalDistance(Eigen::Matrix3d &F, Eigen::Vector3d &p0, Eigen::Vector3d &p1)
Fundamental.
Definition: nelder_mead_opt_fundamental.hpp:63
The NelderMeadOptBase class.
Definition: nelder_mead_opt_base.hpp:31
void filterInliers(std::vector< T > &vec, std::vector< unsigned int > &inliers, std::vector< T > &vecOut)
filterInliers
Definition: std_util.hpp:32
NelderMeadOptFundamental(std::vector< Eigen::Vector2f > &m0, std::vector< Eigen::Vector2f > &m1, std::vector< unsigned int > inliers)
NelderMeadOptFundamental.
Definition: nelder_mead_opt_fundamental.hpp:49
Definition: bilateral_separation.hpp:25
PIC_INLINE Eigen::MatrixXd getMatrixdFromLinearArray(float *array, int rows, int cols)
getMatrixFromLinearArray
Definition: eigen_util.hpp:469