00001 #ifndef CAMERA_H
00002 #define CAMERA_H
00003
00004 #include "mimasconfig.h"
00005
00006 #ifdef HAVE_LIBMINPACK
00007 #ifdef HAVE_LIBLAPACK
00008 #ifdef CAMERA_CALIBRATION_ENABLE
00009
00010 #include <boost/numeric/ublas/vector.hpp>
00011 #include <boost/numeric/ublas/banded.hpp>
00012 #include <boost/numeric/ublas/matrix.hpp>
00013 #include <boost/numeric/ublas/symmetric.hpp>
00014 #include <boost/numeric/ublas/triangular.hpp>
00015 #include <boost/numeric/ublas/storage.hpp>
00016 #include "linalg.h"
00017 #include "nlinalg.h"
00018 #include "mimasexception.h"
00019 #include "primitives.h"
00020
00021 namespace mimas {
00022 namespace camera_calibration {
00023
00036 struct Chessboard {
00038 std::vector< point_f > object;
00039
00043 std::vector< pixel_f > image;
00044 };
00045
00057 class Camera {
00058
00059 public:
00061 typedef boost::numeric::ublas::matrix< double, boost::numeric::ublas::column_major > Matrix;
00062
00064 typedef boost::numeric::ublas::vector< double > Vector;
00065
00067 typedef boost::numeric::ublas::triangular_matrix
00068 < double, boost::numeric::ublas::upper, boost::numeric::ublas::column_major > TriangularMatrix;
00069
00071 typedef boost::numeric::ublas::symmetric_matrix
00072 < double, boost::numeric::ublas::upper, boost::numeric::ublas::column_major > SymmetricMatrix;
00073
00074 private:
00076 Matrix K, K_opt;
00077
00079 Vector disto;
00080
00082 bool optimisation;
00083
00084 std::vector< Chessboard > chessb;
00085 std::vector< Matrix > extrinsics;
00086
00087 protected:
00092 void maxLikelyhood(Matrix &intrinsics, int nbPictures) throw (mimasexception);
00093
00094
00095
00096 public:
00097
00099 Camera() throw(mimasexception);
00100
00102 ~Camera();
00103
00120 void calibrate(std::vector< Chessboard > &chess) throw (mimasexception);
00121
00136 static void
00137 fcn(int *m, int *, double *x, double *fvec, int *);
00138
00147 static void
00148 findHomography(const Chessboard &chess, Matrix &homography);
00149
00156 static void findHomographies(std::vector< Matrix > &homographies, std::vector< Chessboard > &chess);
00157
00164 static Matrix initCalibration(std::vector< Matrix > &homographies, std::vector< Chessboard > &chess)
00165 throw (mimasexception);
00166
00173 static void findExtrinsics(std::vector< Matrix > &extrinsics, std::vector< Matrix > &homographies,
00174 Matrix &intrinsics, int nbPictures);
00175
00177 Matrix getIntrinsicsInit() const { return K; }
00178
00180 Matrix getIntrinsics() const { return K_opt; }
00181
00183 Vector getDistortion() const { return disto; }
00184
00186 bool isOptimized() const { return optimisation; }
00187
00190 static Camera *current_cam;
00191
00192 };
00193
00196 }
00197 }
00198
00199 #endif
00200 #endif
00201 #endif
00202
00203 #endif