00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef TCamera_H
00029 #define TCamera_H
00030
00031 #include <mrpt/math/CMatrixTemplateNumeric.h>
00032 #include <mrpt/math/CMatrixFixedNumeric.h>
00033 #include <mrpt/utils/CLoadableOptions.h>
00034 #include <mrpt/utils/CConfigFileBase.h>
00035 #include <mrpt/utils/CConfigFileMemory.h>
00036 #include <mrpt/utils/CSerializable.h>
00037 #include <mrpt/poses/CPose3DQuat.h>
00038
00039 namespace mrpt
00040 {
00041 namespace utils
00042 {
00043 using namespace mrpt::math;
00044 using namespace mrpt::poses;
00045
00046 DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE( TCamera, mrpt::utils::CSerializable )
00047
00048
00049
00050
00051
00052
00053
00054 class BASE_IMPEXP TCamera : public mrpt::utils::CSerializable
00055 {
00056 DEFINE_SERIALIZABLE( TCamera )
00057
00058 public:
00059 TCamera() : ncols(640), nrows(480), focalLengthMeters(0)
00060 {
00061 intrinsicParams.set_unsafe(0,0,507.808);
00062 intrinsicParams.set_unsafe(1,1,507.808);
00063 intrinsicParams.set_unsafe(0,2,356.2368);
00064 intrinsicParams.set_unsafe(1,2,252.9216);
00065 intrinsicParams.set_unsafe(2,2,1);
00066 for (size_t i=0;i<dist.SizeAtCompileTime ;i++)
00067 dist[i] = 0;
00068 }
00069
00070
00071
00072
00073 uint32_t ncols,nrows;
00074 CMatrixDouble33 intrinsicParams;
00075 CArrayDouble<5> dist;
00076 double focalLengthMeters;
00077
00078
00079
00080
00081
00082 void scaleToResolution(unsigned int new_ncols, unsigned int new_nrows);
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 void saveToConfigFile( const std::string §ion, mrpt::utils::CConfigFileBase &cfg ) const;
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 void loadFromConfigFile(const std::string §ion, const mrpt::utils::CConfigFileBase &cfg );
00113
00114
00115 std::string dumpAsText()
00116 {
00117 mrpt::utils::CConfigFileMemory cfg;
00118 saveToConfigFile("",cfg);
00119 return cfg.getContent();
00120 }
00121
00122
00123
00124
00125 inline void setIntrinsicParamsFromValues ( double fx, double fy, double cx, double cy )
00126 {
00127 intrinsicParams.set_unsafe( 0, 0, fx );
00128 intrinsicParams.set_unsafe( 1, 1, fy );
00129 intrinsicParams.set_unsafe( 0, 2, cx );
00130 intrinsicParams.set_unsafe( 1, 2, cy );
00131 }
00132
00133
00134 inline void getDistortionParamsVector ( CMatrixDouble15 &distParVector ) const
00135 {
00136 for (size_t i=0;i<5;i++)
00137 distParVector.set_unsafe(0,i, dist[i]);
00138 }
00139
00140
00141 inline std::vector<double> getDistortionParamsAsVector () const {
00142 std::vector<double> v(5);
00143 for (size_t i=0;i<5;i++)
00144 v[i] = dist[i];
00145 return v;
00146 }
00147
00148
00149 void setDistortionParamsVector( const CMatrixDouble15 &distParVector )
00150 {
00151 for (size_t i=0;i<5;i++)
00152 dist[i] = distParVector.get_unsafe(0,i);
00153 }
00154
00155
00156 template <class VECTORLIKE>
00157 void setDistortionParamsVector( const VECTORLIKE &distParVector )
00158 {
00159 ASSERT_(distParVector.size()==4 || distParVector.size()==5)
00160 dist[4] = 0;
00161 for (typename VECTORLIKE::Index i=0;i<distParVector.size();i++)
00162 dist[i] = distParVector[i];
00163 }
00164
00165
00166
00167 inline void setDistortionParamsFromValues( double k1, double k2, double p1, double p2, double k3 = 0 )
00168 {
00169 dist[0] = k1;
00170 dist[1] = k2;
00171 dist[2] = p1;
00172 dist[3] = p2;
00173 dist[4] = k3;
00174 }
00175
00176
00177 inline double cx() const { return intrinsicParams(0,2); }
00178
00179 inline double cy() const { return intrinsicParams(1,2); }
00180
00181 inline double fx() const { return intrinsicParams(0,0); }
00182
00183 inline double fy() const { return intrinsicParams(1,1); }
00184
00185
00186 inline void cx(double val) { intrinsicParams(0,2)=val; }
00187
00188 inline void cy(double val) { intrinsicParams(1,2)=val; }
00189
00190 inline void fx(double val) { intrinsicParams(0,0)=val; }
00191
00192 inline void fy(double val) { intrinsicParams(1,1)=val; }
00193
00194
00195 inline double k1() const { return dist[0]; }
00196
00197 inline double k2() const { return dist[1]; }
00198
00199 inline double p1() const { return dist[2]; }
00200
00201 inline double p2() const { return dist[3]; }
00202
00203 inline double k3() const { return dist[4]; }
00204
00205
00206 inline void k1(double val) { dist[0]=val; }
00207
00208 inline void k2(double val) { dist[1]=val; }
00209
00210 inline void p1(double val) { dist[2]=val; }
00211
00212 inline void p2(double val) { dist[3]=val; }
00213
00214 inline void k3(double val) { dist[4]=val; }
00215 };
00216
00217
00218 bool BASE_IMPEXP operator ==(const mrpt::utils::TCamera& a, const mrpt::utils::TCamera& b);
00219 bool BASE_IMPEXP operator !=(const mrpt::utils::TCamera& a, const mrpt::utils::TCamera& b);
00220
00221
00222 DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE( TStereoCamera, mrpt::utils::CSerializable )
00223
00224 enum TStereoCameraModel
00225 {
00226 Bumblebee = 0,
00227 Custom,
00228 Uncalibrated
00229 };
00230
00231
00232
00233
00234
00235
00236 class BASE_IMPEXP TStereoCamera : public mrpt::utils::CSerializable
00237 {
00238 DEFINE_SERIALIZABLE( TStereoCamera )
00239
00240 public:
00241
00242 TStereoCameraModel model;
00243 TCamera leftCamera, rightCamera;
00244 CPose3DQuat rightCameraPose;
00245
00246
00247
00248 TStereoCamera() : model( Bumblebee )
00249 {
00250 leftCamera.ncols = rightCamera.ncols = 640;
00251 leftCamera.nrows = rightCamera.nrows = 480;
00252
00253 leftCamera.setIntrinsicParamsFromValues(
00254 0.81945957*leftCamera.ncols, 1.09261276*leftCamera.nrows,
00255 0.499950781*leftCamera.ncols, 0.506134245*leftCamera.nrows );
00256 leftCamera.setDistortionParamsFromValues( -3.627383e-001, 2.099672e-001, 0, 0, -8.575903e-002 );
00257
00258 rightCamera.setIntrinsicParamsFromValues(
00259 0.822166309*leftCamera.ncols, 1.096221745*leftCamera.nrows,
00260 0.507065918*leftCamera.ncols, 0.524686589*leftCamera.nrows );
00261 rightCamera.setDistortionParamsFromValues( -3.782850e-001, 2.539438e-001, 0, 0, -1.279638e-001 );
00262
00263 leftCamera.focalLengthMeters = rightCamera.focalLengthMeters = 0.0038;
00264
00265
00266 CMatrixDouble44 A;
00267 A.set_unsafe(0,0,9.999777e-001); A.set_unsafe(0,1,-6.262494e-003); A.set_unsafe(0,2,2.340592e-003); A.set_unsafe(0,3,1.227338e-001);
00268 A.set_unsafe(1,0,6.261120e-003); A.set_unsafe(1,1,9.999802e-001); A.set_unsafe(1,2,5.939072e-004); A.set_unsafe(1,3,-3.671682e-004);
00269 A.set_unsafe(2,0,-2.344265e-003); A.set_unsafe(2,1,-5.792392e-004); A.set_unsafe(2,2,9.999971e-001); A.set_unsafe(2,3,-1.499571e-004);
00270 A.set_unsafe(3,0,0); A.set_unsafe(3,1,0); A.set_unsafe(3,2,0); A.set_unsafe(3,3,0);
00271 rightCameraPose = CPose3DQuat( A );
00272 }
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 void saveToConfigFile( const std::string §ion, mrpt::utils::CConfigFileBase &cfg ) const;
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302 void loadFromConfigFile(const std::string §ion, const mrpt::utils::CConfigFileBase &cfg );
00303
00304 };
00305
00306 }
00307 }
00308 #endif