Go to the documentation of this file.00001
00002 #ifndef vgl_h_matrix_2d_h_
00003 #define vgl_h_matrix_2d_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <vnl/vnl_fwd.h>
00024 #include <vnl/vnl_matrix_fixed.h>
00025 #include <vgl/vgl_homg_point_2d.h>
00026 #include <vgl/vgl_homg_line_2d.h>
00027 #include <vgl/vgl_conic.h>
00028 #include <vcl_vector.h>
00029 #include <vcl_iosfwd.h>
00030
00031
00032
00033
00034 template <class T>
00035 class vgl_h_matrix_2d
00036 {
00037
00038 protected:
00039 vnl_matrix_fixed<T,3,3> t12_matrix_;
00040
00041 public:
00042
00043
00044
00045 vgl_h_matrix_2d() {}
00046 ~vgl_h_matrix_2d() {}
00047
00048 vgl_h_matrix_2d(vgl_h_matrix_2d<T> const& M) : t12_matrix_(M.get_matrix()) {}
00049
00050 vgl_h_matrix_2d(vnl_matrix_fixed<T,3,3> const& M) : t12_matrix_(M) {}
00051
00052 vgl_h_matrix_2d(vnl_matrix_fixed<T,2,2> const& M,
00053 vnl_vector_fixed<T,2> const& m);
00054
00055 explicit vgl_h_matrix_2d(T const* M) : t12_matrix_(M) {}
00056
00057 explicit vgl_h_matrix_2d(vcl_istream& s);
00058
00059 explicit vgl_h_matrix_2d(char const* filename);
00060
00061 vgl_h_matrix_2d(vcl_vector<vgl_homg_point_2d<T> > const& points1,
00062 vcl_vector<vgl_homg_point_2d<T> > const& points2);
00063
00064
00065
00066
00067 vgl_homg_point_2d<T> operator()(vgl_homg_point_2d<T> const& p) const;
00068
00069 vgl_homg_point_2d<T> operator*(vgl_homg_point_2d<T> const& p) const { return (*this)(p);}
00070
00071 bool operator==(vgl_h_matrix_2d<T> const& M) const { return t12_matrix_ == M.get_matrix(); }
00072
00073
00074 vgl_homg_line_2d<T> preimage(vgl_homg_line_2d<T> const& l) const;
00075 vgl_homg_line_2d<T> correlation(vgl_homg_point_2d<T> const& p) const;
00076 vgl_homg_point_2d<T> correlation(vgl_homg_line_2d<T> const& l) const;
00077
00078
00079 vgl_conic<T> operator() (vgl_conic<T> const& C) const;
00080
00081
00082
00083
00084 vgl_homg_point_2d<T> preimage(vgl_homg_point_2d<T> const& q) const;
00085
00086 vgl_homg_line_2d<T> operator()(vgl_homg_line_2d<T> const& l) const;
00087
00088 vgl_homg_line_2d<T> operator*(vgl_homg_line_2d<T> const& l) const { return (*this)(l);}
00089
00090 vgl_conic<T> preimage(vgl_conic<T> const& C) const;
00091
00092
00093 vgl_h_matrix_2d<T> operator*(vgl_h_matrix_2d<T> const& H) const
00094 { return vgl_h_matrix_2d<T>(t12_matrix_ * H.t12_matrix_); }
00095
00096
00097
00098
00099 vnl_matrix_fixed<T,3,3> const& get_matrix() const { return t12_matrix_; }
00100
00101 void get(vnl_matrix_fixed<T,3,3>* M) const;
00102
00103
00104 void get(vnl_matrix<T>* M) const;
00105
00106 void get(T *M) const;
00107
00108 T get(unsigned int row_index, unsigned int col_index) const;
00109
00110 vgl_h_matrix_2d get_inverse() const;
00111
00112
00113 vgl_h_matrix_2d& set (unsigned int row_index, unsigned int col_index, T value)
00114 { t12_matrix_[row_index][col_index]=value; return *this; }
00115
00116
00117 vgl_h_matrix_2d& set(T const* M);
00118
00119 vgl_h_matrix_2d& set(vnl_matrix_fixed<T,3,3> const& M);
00120
00121
00122
00123
00124 vgl_h_matrix_2d& set_identity();
00125
00126
00127 vgl_h_matrix_2d& set_translation(T tx, T ty);
00128
00129
00130
00131 vgl_h_matrix_2d& set_rotation(T theta);
00132
00133
00134
00135
00136
00137
00138
00139 vgl_h_matrix_2d& set_scale(T scale);
00140
00141
00142
00143
00144
00145
00146
00147 vgl_h_matrix_2d& set_similarity(T s, T theta, T tx, T ty);
00148
00149
00150
00151
00152
00153
00154
00155 vgl_h_matrix_2d& set_aspect_ratio(T aspect_ratio);
00156
00157
00158
00159
00160
00161
00162
00163
00164 vgl_h_matrix_2d& set_affine(vnl_matrix_fixed<T,2,3> const& M23);
00165
00166
00167 vgl_h_matrix_2d& set_affine(vnl_matrix<T> const& M23);
00168
00169 bool is_rotation() const;
00170 bool is_euclidean() const;
00171 bool is_identity() const;
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 bool projective_basis(vcl_vector<vgl_homg_point_2d<T> > const& four_points);
00185
00186
00187
00188
00189
00190
00191 bool projective_basis(vcl_vector<vgl_homg_line_2d<T> > const& four_lines
00192 #ifdef VCL_VC_6
00193 , int dummy=0
00194 #endif
00195 );
00196
00197
00198
00199
00200 vgl_h_matrix_2d<T> get_upper_2x2() const;
00201
00202 vnl_matrix_fixed<T,2,2> get_upper_2x2_matrix() const;
00203
00204
00205 vgl_homg_point_2d<T> get_translation() const;
00206
00207 vnl_vector_fixed<T,2> get_translation_vector() const;
00208
00209
00210 bool read(vcl_istream& s);
00211
00212 bool read(char const* filename);
00213 };
00214
00215
00216 template <class T> vcl_ostream& operator<<(vcl_ostream& s, vgl_h_matrix_2d<T> const& H);
00217
00218 template <class T> vcl_istream& operator>>(vcl_istream& s, vgl_h_matrix_2d<T>& H)
00219 { H.read(s); return s; }
00220
00221 #define VGL_H_MATRIX_2D_INSTANTIATE(T) extern "please include vgl/algo/vgl_h_matrix_2d.txx first"
00222
00223 #endif // vgl_h_matrix_2d_h_