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       // Forward declaration of class to help with reverse projection.
00031       class PlumbBobObjective;
00032 
00033     } // namespace privateCode;
00034 
00035     
00068     class CameraIntrinsicsPlumbBob : public CameraIntrinsics {
00069       // This class is defined externally so that it can be more
00070       // easily unit tested.
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       // Protected member function used during iterative approximation
00368       // in CameraIntrinsicsPlumbBob::reverseProject().
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     } // namespace privateCode;
00482     
00483   } // namespace computerVision
00484   
00485 } // namespace dlr
00486 
00487 
00488 /* ============ Definitions of inline & template functions ============ */
00489 
00490 
00491 namespace dlr {
00492 
00493   
00494 } // namespace dlr
00495 
00496 #endif /* #ifndef DLR_COMPUTERVISION_CAMERAINTRINSICSPLUMBBOB_H */

Generated on Tue Jan 6 23:24:56 2009 for dlrComputerVision Utility Library by  doxygen 1.5.6