MTF
Translation.h
1 #ifndef MTF_TRANSLATION_H
2 #define MTF_TRANSLATION_H
3 
4 #include "ProjectiveBase.h"
5 #include "SSMEstimator.h"
6 #include "SSMEstimatorParams.h"
7 
8 _MTF_BEGIN_NAMESPACE
9 
11  bool debug_mode;
12  TranslationParams(const SSMParams *ssm_params,
13  bool _debug_mode);
14  TranslationParams(const TranslationParams *params = nullptr);
15 };
16 
18 public:
19  TranslationEstimator(int modelPoints, bool _use_boost_rng);
20 
21  int runKernel(const CvMat* m1, const CvMat* m2, CvMat* model) override;
22  bool refine(const CvMat* m1, const CvMat* m2,
23  CvMat* model, int maxIters) override;
24 protected:
25  void computeReprojError(const CvMat* m1, const CvMat* m2,
26  const CvMat* model, CvMat* error) override;
27 };
28 
29 class Translation : public ProjectiveBase{
30 public:
31 
32  using ProjectiveBase::setCorners;
33 
35  typedef EstimatorParams::EstType EstType;
36 
37  Translation( const ParamType *params_in = nullptr);
38 
39  void setCorners(const Matrix24d &corners) override;
40  void setState(const VectorXd &ssm_state) override;
41  void compositionalUpdate(const VectorXd& state_update) override;
42 
43  void estimateWarpFromCorners(VectorXd &state_update, const Matrix24d &in_corners,
44  const Matrix24d &out_corners) override;
45  void cmptInitPixJacobian(MatrixXd &pix_jacobian_ssm,
46  const PixGradT &pix_jacobian_coord) override{
47  validate_ssm_jacobian(pix_jacobian_ssm, pix_jacobian_coord);
48  pix_jacobian_ssm = pix_jacobian_coord.leftCols<2>();
49  }
50 
51  void cmptWarpedPixJacobian(MatrixXd &pix_jacobian_ssm,
52  const PixGradT &pixel_grad) override {
53  pix_jacobian_ssm = pixel_grad.leftCols<2>();
54  }
55  void cmptApproxPixJacobian(MatrixXd &pix_jacobian_ssm,
56  const PixGradT &pixel_grad) override {
57  pix_jacobian_ssm = pixel_grad.leftCols<2>();
58  }
59  // Jacobian is independent of the current values of the warp parameters
60  void cmptPixJacobian(MatrixXd &pix_jacobian_ssm,
61  const PixGradT &pix_jacobian_coord) override{
62  cmptInitPixJacobian(pix_jacobian_ssm, pix_jacobian_coord);
63  }
64  void cmptInitPixHessian(MatrixXd &pix_hess_ssm, const PixHessT &pix_hess_coord,
65  const PixGradT &pix_jacobian_coord) override{
66  validate_ssm_hessian(pix_hess_ssm, pix_hess_coord, pix_jacobian_coord);
67  pix_hess_ssm = pix_hess_coord;
68  }
69  void cmptWarpedPixHessian(MatrixXd &pix_hess_ssm, const PixHessT &pix_hess_coord,
70  const PixGradT &pix_jacobian_coord) override{
71  validate_ssm_hessian(pix_hess_ssm, pix_hess_coord, pix_jacobian_coord);
72  pix_hess_ssm = pix_hess_coord;
73  }
74  void cmptApproxPixHessian(MatrixXd &pix_hess_ssm, const PixHessT &pix_hess_coord,
75  const PixGradT &pix_jacobian_coord) override{
76  validate_ssm_hessian(pix_hess_ssm, pix_hess_coord, pix_jacobian_coord);
77  pix_hess_ssm = pix_hess_coord;
78  }
79  // Hessian is independent of the current values of the warp parameters
80  void cmptPixHessian(MatrixXd &pix_hess_ssm, const PixHessT &pix_hess_coord,
81  const PixGradT &pix_jacobian_coord) override{
82  cmptInitPixHessian(pix_hess_ssm, pix_hess_coord, pix_jacobian_coord);
83  }
84 
85  void getInitPixGrad(Matrix2Xd &ssm_grad, int pix_id) override{
86  ssm_grad = Matrix2d::Identity();
87  }
88 
89  void getCurrPixGrad(Matrix2Xd &ssm_grad, int pix_id) override{
90  ssm_grad = Matrix2d::Identity();
91  }
92 
93  void invertState(VectorXd& inv_state, const VectorXd& state) override;
94 
95  void updateGradPts(double grad_eps) override;
96  void updateHessPts(double hess_eps) override;
97 
98  void applyWarpToCorners(Matrix24d &warped_corners, const Matrix24d &orig_corners,
99  const VectorXd &state_update) override;
100  void applyWarpToPts(Matrix2Xd &warped_pts, const Matrix2Xd &orig_pts,
101  const VectorXd &state_update) override;
102 
103  bool supportsSPI() override{ return true; }
104 
105  void compositionalRandomWalk(VectorXd &perturbed_state,
106  const VectorXd &base_state) override;
107  void compositionalAutoRegression1(VectorXd &perturbed_state, VectorXd &perturbed_ar,
108  const VectorXd &base_state, const VectorXd &base_ar, double a = 0.5) override;
109  void estimateStateSigma(VectorXd &state_sigma, double pix_sigma) override {
110  state_sigma[0] = state_sigma[1] = pix_sigma;
111  }
112  void estimateWarpFromPts(VectorXd &state_update, vector<uchar> &mask,
113  const vector<cv::Point2f> &in_pts, const vector<cv::Point2f> &out_pts,
114  const EstimatorParams &est_params) override;
115 
116  void getWarpFromState(Matrix3d &warp_mat, const VectorXd& ssm_state) override;
117  void getStateFromWarp(VectorXd &state_vec, const Matrix3d& warp_mat) override;
118 
119 protected:
120 
121  ParamType params;
122  cv::Mat estimateTranslation(cv::InputArray _points1, cv::InputArray _points2,
123  cv::OutputArray _mask, const SSMEstimatorParams &est_params);
124 
125  int estimateTranslation(const CvMat* in_pts, const CvMat* out_pts,
126  CvMat* __H, CvMat* mask, const SSMEstimatorParams &est_params);
127 };
128 
129 _MTF_END_NAMESPACE
130 
131 #endif
Definition: StateSpaceModel.h:35
Definition: Translation.h:10
Definition: SSMEstimatorParams.h:9
Definition: Translation.h:17
Definition: Translation.h:29
Base class for robust estimators for different SSMs adapted from CvModelEstimator2 defined in _modelt...
Definition: SSMEstimator.h:14
void cmptInitPixJacobian(MatrixXd &pix_jacobian_ssm, const PixGradT &pix_jacobian_coord) override
right multiplies the initial or current ssm jacobian with the provided am jacobian; though this can b...
Definition: Translation.h:45
base class for all SSMs that can be expressed by homogeneous multiplication with a 3x3 projective tra...
Definition: ProjectiveBase.h:14