/* * SimpleCamera.h * * Created on: Aug 16, 2009 * Author: dellaert */ #ifndef SIMPLECAMERA_H_ #define SIMPLECAMERA_H_ #include #include namespace gtsam { /** * A simple camera class with a Cal3_S2 calibration * Basically takes a Calibrated camera and adds calibration information * to produce measurements in pixels. * Not a sublass as a SimpleCamera *is not* a CalibratedCamera. */ class SimpleCamera { private: CalibratedCamera calibrated_; // Calibrated camera Cal3_S2 K_; // Calibration public: SimpleCamera(const Cal3_S2& K, const CalibratedCamera& calibrated); SimpleCamera(const Cal3_S2& K, const Pose3& pose); virtual ~SimpleCamera(); const Pose3& pose() const { return calibrated_.pose(); } const Cal3_S2& calibration() const { return K_; } /** * project a 3d point to the camera and also check the depth */ std::pair projectSafe(const Point3& P) const; /** * project a 3d point to the camera */ Point2 project(const Point3& P) const; /** * backproject a 2d point from the camera up to a given scale */ Point3 backproject(const Point2& projection, const double scale) const; /** * Create a level camera at the given 2D pose and height * @param pose2 specifies the location and viewing direction * (theta 0 = looking in direction of positive X axis) */ static SimpleCamera level(const Cal3_S2& K, const Pose2& pose2, double height); // Friends friend Matrix Dproject_pose(const SimpleCamera& camera, const Point3& point); friend Matrix Dproject_point(const SimpleCamera& camera, const Point3& point); friend Point2 Dproject_pose_point(const SimpleCamera& camera, const Point3& point, Matrix& D_projection_pose, Matrix& D_projection_point); }; /* ************************************************************************* */ // measurement functions and derivatives /* ************************************************************************* */ /** * This function receives the camera pose and the landmark location and * returns the location the point is supposed to appear in the image * as well as the sign of the depth. */ std::pair projectSafe(const SimpleCamera& camera, const Point3& point); /** * This function receives the camera pose and the landmark location and * returns the location the point is supposed to appear in the image */ Point2 project(const SimpleCamera& camera, const Point3& point); /** * Derivatives of project. */ Matrix Dproject_pose(const SimpleCamera& camera, const Point3& point); Matrix Dproject_point(const SimpleCamera& camera, const Point3& point); /** * super-duper combined evaluation + derivatives * saves a lot of time because a lot of computation is shared */ Point2 Dproject_pose_point(const SimpleCamera& camera, const Point3& point, Matrix& D_projection_pose, Matrix& D_projection_point); } #endif /* SIMPLECAMERA_H_ */