Rev Author Line No. Line
178 kaklik 1 #ifndef __CAMERAPROJECTORCALIBRATION_HH
2 #define __CAMERAPROJECTORCALIBRATION_HH
3  
4 #include <boost/numeric/ublas/matrix.hpp>
5 #include <boost/numeric/ublas/vector.hpp>
6 #include <boost/smart_ptr.hpp>
7 #include "image.h"
8 #include "rgba.h"
9 #include <algorithm>
10 #include <vector>
11  
12 /// Class for calibrating the camera-projector system.
13 class CameraProjectorCalibration
14 {
15 public:
16 ///
17 typedef boost::numeric::ublas::vector< double > Vector;
18 ///
19 typedef boost::numeric::ublas::matrix
20 < double, boost::numeric::ublas::column_major > Matrix;
21 /** Constructor.
22 @param _searchPattern Pattern used in cross-correlation to locate
23 projected pattern. */
24 CameraProjectorCalibration( const mimas::image< unsigned char > &_searchPattern );
25 ///
26 int getNumCalibFrames(void) const { return patternFrame.size(); }
27 /** Get currently stored background frame.
28 Camera image of screen without projected pattern. */
29 const mimas::image< unsigned char > &getBackgroundFrame(void) const
30 { return backgroundFrame; }
31 /// Get ith stored calibration frame.
32 const mimas::image< unsigned char > &getCalibFrame( int i ) const
33 { return patternFrame[i]; }
34 ///
35 const std::pair< Vector, Vector > &getCalibPointPair( int i ) const
36 { return pointPairs[i]; }
37 ///
38 void setBackgroundFrame( const mimas::image< unsigned char > &img )
39 { backgroundFrame = img; }
40 /** Add a frame for calibration.
41 The method \c findPatternImg is called to locate the projected pattern
42 in the camera image. \c pointPairsModified is set to \c true .
43 @param _frame Frame for calibration (camera image).
44 @param _pos Screen-coordinates of the projected pattern.
45 @see findPatternImg */
46 void addCalibFrame( const mimas::image< unsigned char > &_frame,
47 const Vector &_pos );
48 /** Compute calibration-matrix.
49 The homography is computed if a new camera-image was added using
50 \c addCalibFrame (i.e. \c pointPairsModified is \c true) using the point
51 pairs acquired so far (at least 5 point-pairs are required). */
52 Matrix getHomography(void);
53 protected:
54 /** Compute homography.
55 See <A HREF="http://research.microsoft.com/%7Ezhang/Papers/TR98-71.pdf">paper by Zhengyou Zhang</A> */
56 static Matrix genHomography( const std::vector< std::pair< Vector, Vector > >
57 &pointPairs );
58 /// Access a part of a boost::multi_array.
59 static boost::multi_array< double, 2 >::array_view< 2 >::type view
60 ( boost::multi_array< double, 2 > &in, int x, int y, int w, int h );
61 /** Search a pattern in a difference image.
62 The search is performed by searching the maximum of the
63 cross-correlation. */
64 static Vector findPatternDiffImg( const mimas::image< double > &diffImg,
65 const mimas::image< double > &tpl );
66 /** Search pattern in image.
67 @see findPattern */
68 Vector findPatternImg( const mimas::image< unsigned char > &img );
69 ///
70 mimas::image< unsigned char > searchPattern;
71 /// Background image to subtract from acquired images.
72 mimas::image< unsigned char > backgroundFrame;
73 /// The vector of acquired images.
74 std::vector< mimas::image< unsigned char > > patternFrame;
75 /// Vector with estimated locations of points.
76 std::vector< std::pair< Vector, Vector > > pointPairs;
77 /// Indication wether the homography needs to be recomputed.
78 bool pointPairsModified;
79 /// Storing the homography matrix.
80 Matrix homography;
81 };
82  
83 /** Smart-pointer.
84 @see CameraProjectorCalibration */
85 typedef boost::shared_ptr< CameraProjectorCalibration > CameraProjectorCalibrationPtr;
86  
87 #endif