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 
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       // Protected member function used during iterative approximation
00369       // in CameraIntrinsicsPlumbBob::reverseProject().
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     } // namespace privateCode;
00483     
00484   } // namespace computerVision
00485   
00486 } // namespace dlr
00487 
00488 
00489 /* ============ Definitions of inline & template functions ============ */
00490 
00491 
00492 namespace dlr {
00493 
00494   
00495 } // namespace dlr
00496 
00497 #endif /* #ifndef DLR_COMPUTERVISION_CAMERAINTRINSICSPLUMBBOB_H */

Generated on Wed Nov 25 12:15:04 2009 for dlrComputerVision Utility Library by  doxygen 1.5.8