aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/gra/BundleAdjustment.h
blob: 60040da33794927cb54508433d83601552e7aead (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#ifndef   BundleAdjustment_H__
#define   BundleAdjustment_H__

#include "Eye.h"

#include "../oo/ObjBase.h"

namespace meow {

/*!
 * @brief 列舉每個 \c Eye 可以有哪些種類的移動
 */
enum EyesReferenceInfoFlags {
  CAN_OFFSET = 0x01,                //!< 平移
  CAN_ROTATE = 0x02,                //!< 旋轉
  CAN_ZOOM   = 0x04                 //!< 改變焦距
};

/*!
 * @brief 記住每個 \c Eye 的reference以及Flag
 */
template<class Pixel>
struct EyesReferenceInfo {
  unsigned long flag;               //!< Flag, 定義如EyesReferenceInfoFlags
  Eye<Pixel>     eye;               //!< reference

  /*!
   * @brief constructor with nothing
   */
  EyesReferenceInfo(): flag(0), eye() {
  }

  /*!
   * @brief constructor with flag and an Eye object. Here we will let
   *        memember '.eye' reference from the specify paramter \c e
   */
  EyesReferenceInfo(Eye<Pixel>& e, unsigned long f): flag(f), eye() {
    eye.referenceFrom(e);
  }

  /*!
   * @brief constructor with another EyesReferenceInfo
   */
  EyesReferenceInfo(EyesReferenceInfo const& si): flag(si.flag), eye() {
    eye.referenceFrom(si.eye);
  }

  /*!
   * @brief desructor
   */
  ~EyesReferenceInfo() {
  }

  /*!
   * @brief copy operator, still use reference method
   */
  EyesReferenceInfo& operator=(EyesReferenceInfo const& e) {
    flag = e.flag;
    eye.referenceFrom(e.eye);
    return *this;
  }
};

/*!
 * @brief 這邊定義Bundle-Adjustment就是利用一系列場景來反推算出\b 相機資訊
 *        (包含拍攝座標, 角度與焦距) 或是在已知相機資訊的情況下推算出底片中
 *        物體如何移動.
 */
template<class Pixel>
class BundleAdjustment: public ObjBase {
protected:
  BundleAdjustment() {
  }
public:
  virtual ~BundleAdjustment() {
  }

  /*!
   * @brief 推算相機資訊
   *
   * @param [in] seq 給定一系列場景
   * @return 成功與否
   */
  virtual
  bool adjustEyes(std::vector<EyesReferenceInfo<Pixel> > seq) const {
    return false;
  }

  /*!
   * @brief 推算場景中的物體資訊
   *
   * 會將fixedPoints2D推算倒fixedPoints3D
   *
   * @param [in] seq 一系列場景(這裡的場景是有時間先後順序的)
   * @brief 成功與否
   */
  virtual
  bool adjustFixedPoints(std::vector<EyesReferenceInfo<Pixel> > seq) const {
    return false;
  }
};

} // meow

#endif // BundleAdjustment_H__