cameraIntrinsicsPlumbBob.h
Go to the documentation of this file.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
00347 virtual dlr::geometry::Ray3D
00348 reverseProject(const dlr::numeric::Vector2D& pixelPosition,
00349 bool normalize = true) const;
00350
00351
00362 std::ostream&
00363 writeToStream(std::ostream& outputStream) const;
00364
00365
00366 protected:
00367
00368
00369
00370 void
00371 projectWithPartialDerivatives(double xNorm,
00372 double yNorm,
00373 double& uValue,
00374 double& vValue,
00375 double& dUdX,
00376 double& dUdY,
00377 double& dVdX,
00378 double& dVdY) const;
00379
00380 double m_centerU;
00381 double m_centerV;
00382 double m_kX;
00383 double m_kY;
00384 size_t m_numPixelsX;
00385 size_t m_numPixelsY;
00386 double m_radialCoefficient0;
00387 double m_radialCoefficient1;
00388 double m_radialCoefficient2;
00389 double m_skewCoefficient;
00390 double m_tangentialCoefficient0;
00391 double m_tangentialCoefficient1;
00392 };
00393
00394
00411 inline std::ostream&
00412 operator<<(std::ostream& stream,
00413 const CameraIntrinsicsPlumbBob& intrinsics)
00414 {
00415 return intrinsics.writeToStream(stream);
00416 }
00417
00418
00434 inline std::istream&
00435 operator>>(std::istream& stream,
00436 CameraIntrinsicsPlumbBob& intrinsics)
00437 {
00438 return intrinsics.readFromStream(stream);
00439 }
00440
00441
00442 namespace privateCode {
00443
00449 class PlumbBobObjective
00450 : public std::unary_function<dlr::numeric::Array1D<double>, double>
00451 {
00452 public:
00453 PlumbBobObjective(const CameraIntrinsicsPlumbBob& intrinsics,
00454 const dlr::numeric::Vector2D& uvTarget);
00455
00456 double
00457 operator()(const dlr::numeric::Array1D<double>& theta);
00458
00459 double
00460 getOffset();
00461
00462 dlr::numeric::Array1D<double>
00463 gradient(const dlr::numeric::Array1D<double>& theta);
00464
00465 private:
00466
00467 double
00468 computeBoundsPenalty(const Vector2D& uvPosition);
00469
00470 void
00471 computeBoundsPenaltyGradient(double uValue, double vValue,
00472 double dUdX, double dUdY,
00473 double dVdX, double dVdY,
00474 double& dPdX, double& dPdY);
00475
00476 CameraIntrinsicsPlumbBob m_intrinsics;
00477 double m_offset;
00478 dlr::numeric::Vector2D m_uvTarget;
00479 };
00480
00481
00482 }
00483
00484 }
00485
00486 }
00487
00488
00489
00490
00491
00492 namespace dlr {
00493
00494
00495 }
00496
00497 #endif