75 #ifndef SLIP_PINHOLECAMERA_HPP
76 #define SLIP_PINHOLECAMERA_HPP
92 #include <boost/serialization/access.hpp>
93 #include <boost/serialization/split_member.hpp>
94 #include <boost/serialization/version.hpp>
95 #include <boost/serialization/base_object.hpp>
99 template <
typename Type>
102 template <
typename Type>
103 std::ostream& operator<<(std::ostream & out, const PinholeCamera<Type>& c);
116 template <
typename Type>
172 friend std::ostream& operator<< <>(std::ostream & out,
const self& c);
193 void read(
const std::string& file)
196 this->update_d_calibration_matrix();
276 assert(calibration_matrix.
rows() == 3);
277 assert(calibration_matrix.
cols() == 4);
279 this->update_d_calibration_matrix();
288 assert(d_calibration_matrix.
rows() == 5);
289 assert(d_calibration_matrix.
cols() == 3);
324 Type px = (*calibration_matrix_)[0][0]*p[0]
325 + (*calibration_matrix_)[0][1]*p[1]
326 + (*calibration_matrix_)[0][2]*p[2]
327 + (*calibration_matrix_)[0][3];
328 Type py = (*calibration_matrix_)[1][0]*p[0]
329 + (*calibration_matrix_)[1][1]*p[1]
330 + (*calibration_matrix_)[1][2]*p[2]
331 + (*calibration_matrix_)[1][3];
332 Type s = (*calibration_matrix_)[2][0]*p[0]
333 + (*calibration_matrix_)[2][1]*p[1]
334 + (*calibration_matrix_)[2][2]*p[2]
335 + (*calibration_matrix_)[2][3];
336 Type inv_s =
static_cast<Type
>(1)/s;
395 const Type zero =
static_cast<Type
>(0.0);
398 (z*(*d_calibration_matrix_)[0][0] + (*d_calibration_matrix_)[2][0]) * p2[0] +
403 (z*(*d_calibration_matrix_)[1][0] + (*d_calibration_matrix_)[3][0]) * p2[0] +
408 ((*d_calibration_matrix_)[4][0]) * p2[0] +
414 Type inv_s =
static_cast<Type
>(1)/s;
495 template<
class Archive>
496 void save(Archive & ar,
const unsigned int version)
const
498 ar & boost::serialization::base_object<slip::CameraModel<Type> >(*this);
502 template<
class Archive>
503 void load(Archive & ar,
const unsigned int version)
505 ar & boost::serialization::base_object<slip::CameraModel<Type> >(*this);
509 BOOST_SERIALIZATION_SPLIT_MEMBER()
512 void update_d_calibration_matrix()
516 (*d_calibration_matrix_)[0][0] = (((*calibration_matrix_)[1][1] * (*calibration_matrix_)[2][2])-((*
calibration_matrix_)[1][2] * (*calibration_matrix_)[2][1]));
517 (*d_calibration_matrix_)[0][1] = (((*calibration_matrix_)[2][1] * (*calibration_matrix_)[0][2]) - ((*
calibration_matrix_)[2][2] * (*calibration_matrix_)[0][1]));
518 (*d_calibration_matrix_)[0][2] = (((*calibration_matrix_)[0][1] * (*calibration_matrix_)[1][2]) - ((*
calibration_matrix_)[0][2] * (*calibration_matrix_)[1][1]));
520 (*d_calibration_matrix_)[1][0] = (((*calibration_matrix_)[1][2] * (*calibration_matrix_)[2][0]) - ((*
calibration_matrix_)[1][0] * (*calibration_matrix_)[2][2]));
521 (*d_calibration_matrix_)[1][1] = (((*calibration_matrix_)[2][2] * (*calibration_matrix_)[0][0]) - ((*
calibration_matrix_)[2][0] * (*calibration_matrix_)[0][2]));
522 (*d_calibration_matrix_)[1][2] = (((*calibration_matrix_)[0][2] * (*calibration_matrix_)[1][0]) - ((*
calibration_matrix_)[0][0] * (*calibration_matrix_)[1][2]));
524 (*d_calibration_matrix_)[2][0] = (((*calibration_matrix_)[1][1] * (*calibration_matrix_)[2][3]) - ((*
calibration_matrix_)[1][3] * (*calibration_matrix_)[2][1]));
525 (*d_calibration_matrix_)[2][1] = (((*calibration_matrix_)[2][1] * (*calibration_matrix_)[0][3]) - ((*
calibration_matrix_)[2][3] * (*calibration_matrix_)[0][1]));
526 (*d_calibration_matrix_)[2][2] = (((*calibration_matrix_)[0][1] * (*calibration_matrix_)[1][3]) - ((*
calibration_matrix_)[0][3] * (*calibration_matrix_)[1][1]));
528 (*d_calibration_matrix_)[3][0] = (((*calibration_matrix_)[1][3] * (*calibration_matrix_)[2][0]) - ((*
calibration_matrix_)[1][0] * (*calibration_matrix_)[2][3]));
529 (*d_calibration_matrix_)[3][1] = (((*calibration_matrix_)[2][3] * (*calibration_matrix_)[0][0]) - ((*
calibration_matrix_)[2][0] * (*calibration_matrix_)[0][3]));
530 (*d_calibration_matrix_)[3][2] = (((*calibration_matrix_)[0][3] * (*calibration_matrix_)[1][0]) - ((*
calibration_matrix_)[0][0] * (*calibration_matrix_)[1][3]));
532 (*d_calibration_matrix_)[4][0] = (((*calibration_matrix_)[1][0] * (*calibration_matrix_)[2][1]) - ((*
calibration_matrix_)[1][1] * (*calibration_matrix_)[2][0]));
533 (*d_calibration_matrix_)[4][1] = (((*calibration_matrix_)[2][0] * (*calibration_matrix_)[0][1]) - ((*
calibration_matrix_)[2][1] * (*calibration_matrix_)[0][0]));
534 (*d_calibration_matrix_)[4][2] = (((*calibration_matrix_)[0][0] * (*calibration_matrix_)[1][1]) - ((*
calibration_matrix_)[0][1] * (*calibration_matrix_)[1][0]));
543 template<
typename Type>
544 std::ostream& operator<<(std::ostream & out, const PinholeCamera<Type>& c)
546 out<<*c.calibration_matrix_<<std::endl;
550 #endif //SLIP_PINHOLECAMERA_HPP
Provides a class to modelize 3d points.
self & operator=(const self &other)
Assign a CameraModel.
virtual void compute(const slip::Matrix< Type > &P)
Computes the parameters of the pinhole camera model.
int decompose_direct(const slip::Matrix< Type > &M, slip::Matrix< Type > &K, slip::Matrix< Type > &R, slip::Vector3d< Type > &c)
Direct-Decomposition a 3x4-Matrix into internal and external parameters.
This is a Vector3d struct. It is a specialization of kvector. It implements some specific 3d operatio...
Define a PinholeCamera class.
Provides a camera algorithms.
size_type cols() const
Returns the number of columns (second dimension size) in the Matrix.
slip::Point2d< Type > projection(const slip::Point3d< Type > &p)
Computes the projection of a 3d world point onto the image plane.
void calibration_matrix(const slip::Matrix< Type > &calibration_matrix)
Set the calibration matrix.
int decompose_RQ(const slip::Matrix< Type > &M, slip::Matrix< Type > &K, slip::Matrix< Type > &R, slip::Vector3d< Type > &c)
RQ-Decomposition 3x4-Matrix into internal and external parameters.
Provides common linear algebra algorithms.
slip::Matrix< Type > * d_calibration_matrix_
PinholeCamera(const self &rhs)
Constructs a copy of the PinholeCamera rhs.
This is a point2d class, a specialized version of Point<CoordType,DIM> with DIM = 2...
PinholeCamera()
Default constructor of PinholeCamera.
Provides a class to manipulate 3d Vector.
Provides an abstract class to model cameras.
slip::Point3d< Type > backprojection(const slip::Point2d< Type > &p2, const Type &z)
Computes the 3d world point corresponding to the backprojection of an image point.
void d_calibration_matrix(const slip::Matrix< Type > &d_calibration_matrix)
Set the d_calibration matrix.
slip::Matrix< Type > * calibration_matrix_
Numerical matrix class. This container statisfies the BidirectionnalContainer concepts of the STL...
void read(const std::string &file)
Read a calibration matrix from an ASCII file.
void getpars_Faugeras(const slip::Matrix< Type > &P, slip::Matrix< Type > &Mat)
Get calibration parameters using the Faugeras-Algorithm.
size_type rows() const
Returns the number of rows (first dimension size) in the Matrix.
virtual int decompose(slip::Matrix< Type > &K, slip::Matrix< Type > &R, slip::Vector3d< Type > &c, slip::DECOMP_TYPE flag)
Decomposes a pinhole camera matrix.
slip::Matrix< Type > & d_calibration_matrix() const
Get back d_calibration matrix.
void fill(const T &value)
Fills the container range [begin(),begin()+size()) with copies of value.
Provides a class to manipulate Numerical Matrix.
Provides a class to modelize 2d points.
self & operator=(const self &rhs)
Assign a PinholeCamera.
void write(const std::string &file)
Write a calibration matrix to an ASCII file.
void read_ascii_2d(Container2d &container, const std::string &file_path_name)
Read a Container2d from an ASCII file.
~PinholeCamera()
Destructor of the PinholeCamera.
Define an abstract CameraModel class.
This is a point3d class, a specialized version of Point<CoordType,DIM> with DIM = 3...
friend class boost::serialization::access
slip::Matrix< Type > & calibration_matrix() const
Get calibration matrix.