00001
00016 #ifndef DLR_COMPUTERVISION_CAMERAINTRINSICSPLUMBBOB_H
00017 #define DLR_COMPUTERVISION_CAMERAINTRINSICSPLUMBBOB_H
00018
00019 #include <iostream>
00020 #include <dlrComputerVision/cameraIntrinsics.h>
00021 #include <dlrNumeric/array1D.h>
00022 #include <dlrNumeric/utilities.h>
00023
00024 namespace dlr {
00025
00026 namespace computerVision {
00027
00028 namespace privateCode {
00029
00030
00031 class PlumbBobObjective;
00032
00033 }
00034
00035
00068 class CameraIntrinsicsPlumbBob : public CameraIntrinsics {
00069
00070
00071 friend class privateCode::PlumbBobObjective;
00072
00073 public:
00074
00080 CameraIntrinsicsPlumbBob();
00081
00082
00147 CameraIntrinsicsPlumbBob(size_t numPixelsX,
00148 size_t numPixelsY,
00149 double focalLengthX,
00150 double focalLengthY,
00151 double centerU,
00152 double centerV,
00153 double skewCoefficient,
00154 double radialCoefficient0,
00155 double radialCoefficient1,
00156 double radialCoefficient2,
00157 double tangentialCoefficient0,
00158 double tangentialCoefficient1);
00159
00160
00164 virtual
00165 ~CameraIntrinsicsPlumbBob() {}
00166
00167
00175 double
00176 getCenterU() const {return m_centerU;}
00177
00178
00186 double
00187 getCenterV() const {return m_centerV;}
00188
00189
00197 double
00198 getFocalLengthX() const {return m_kX;}
00199
00200
00208 double
00209 getFocalLengthY() const {return m_kY;}
00210
00211
00219 virtual size_t
00220 getNumPixelsX() const {return m_numPixelsX;}
00221
00222
00230 virtual size_t
00231 getNumPixelsY() const {return m_numPixelsY;}
00232
00233
00241 double
00242 getRadialCoefficient0() const {return m_radialCoefficient0;}
00243
00244
00252 double
00253 getRadialCoefficient1() const {return m_radialCoefficient1;}
00254
00255
00263 double
00264 getRadialCoefficient2() const {return m_radialCoefficient2;}
00265
00266
00274 double
00275 getSkewCoefficient() const {return m_skewCoefficient;}
00276
00277
00285 double
00286 getTangentialCoefficient0() const {return m_tangentialCoefficient0;}
00287
00288
00296 double
00297 getTangentialCoefficient1() const {return m_tangentialCoefficient1;}
00298
00299
00309 virtual dlr::numeric::Vector2D
00310 project(const dlr::numeric::Vector3D& point) const;
00311
00312
00324 std::istream&
00325 readFromStream(std::istream& inputStream);
00326
00327
00346 virtual dlr::geometry::Ray3D
00347 reverseProject(const dlr::numeric::Vector2D& pixelPosition,
00348 bool normalize = true) const;
00349
00350
00361 std::ostream&
00362 writeToStream(std::ostream& outputStream) const;
00363
00364
00365 protected:
00366
00367
00368
00369 void
00370 projectWithPartialDerivatives(double xNorm,
00371 double yNorm,
00372 double& uValue,
00373 double& vValue,
00374 double& dUdX,
00375 double& dUdY,
00376 double& dVdX,
00377 double& dVdY) const;
00378
00379 double m_centerU;
00380 double m_centerV;
00381 double m_kX;
00382 double m_kY;
00383 size_t m_numPixelsX;
00384 size_t m_numPixelsY;
00385 double m_radialCoefficient0;
00386 double m_radialCoefficient1;
00387 double m_radialCoefficient2;
00388 double m_skewCoefficient;
00389 double m_tangentialCoefficient0;
00390 double m_tangentialCoefficient1;
00391 };
00392
00393
00410 inline std::ostream&
00411 operator<<(std::ostream& stream,
00412 const CameraIntrinsicsPlumbBob& intrinsics)
00413 {
00414 return intrinsics.writeToStream(stream);
00415 }
00416
00417
00433 inline std::istream&
00434 operator>>(std::istream& stream,
00435 CameraIntrinsicsPlumbBob& intrinsics)
00436 {
00437 return intrinsics.readFromStream(stream);
00438 }
00439
00440
00441 namespace privateCode {
00442
00448 class PlumbBobObjective
00449 : public std::unary_function<dlr::numeric::Array1D<double>, double>
00450 {
00451 public:
00452 PlumbBobObjective(const CameraIntrinsicsPlumbBob& intrinsics,
00453 const dlr::numeric::Vector2D& uvTarget);
00454
00455 double
00456 operator()(const dlr::numeric::Array1D<double>& theta);
00457
00458 double
00459 getOffset();
00460
00461 dlr::numeric::Array1D<double>
00462 gradient(const dlr::numeric::Array1D<double>& theta);
00463
00464 private:
00465
00466 double
00467 computeBoundsPenalty(const Vector2D& uvPosition);
00468
00469 void
00470 computeBoundsPenaltyGradient(double uValue, double vValue,
00471 double dUdX, double dUdY,
00472 double dVdX, double dVdY,
00473 double& dPdX, double& dPdY);
00474
00475 CameraIntrinsicsPlumbBob m_intrinsics;
00476 double m_offset;
00477 dlr::numeric::Vector2D m_uvTarget;
00478 };
00479
00480
00481 }
00482
00483 }
00484
00485 }
00486
00487
00488
00489
00490
00491 namespace dlr {
00492
00493
00494 }
00495
00496 #endif