76 #ifndef SLIP_SOLOFFCAMERA_HPP
77 #define SLIP_SOLOFFCAMERA_HPP
90 #include <boost/serialization/access.hpp>
91 #include <boost/serialization/split_member.hpp>
92 #include <boost/serialization/version.hpp>
93 #include <boost/serialization/base_object.hpp>
97 template <
typename Type>
100 template <
typename Type>
101 std::ostream& operator<<(std::ostream & out, const slip::SoloffCamera<Type>& c);
116 template <
typename Type>
184 friend std::ostream& operator<< <>(std::ostream & out,
const self& c);
274 assert(calibration_polynomial_x.
degree() == 3);
296 assert(calibration_polynomial_y.
degree() == 3);
319 assert(calibration_polynomial_X.
degree() == 3);
341 assert(calibration_polynomial_Y.
degree() == 3);
362 template <
typename RandomAccessIterator>
364 RandomAccessIterator last)
366 assert((last-first) == 20);
387 template <
typename RandomAccessIterator>
389 RandomAccessIterator last)
391 assert((last-first) == 20);
412 template <
typename RandomAccessIterator>
414 RandomAccessIterator last)
416 assert((last-first) == 20);
438 template <
typename RandomAccessIterator>
440 RandomAccessIterator last)
442 assert((last-first) == 20);
465 (*calibration_polynomial_coeff_x_)[0]
466 + p[0]*( (*calibration_polynomial_coeff_x_)[1]
467 + p[0]*((*calibration_polynomial_coeff_x_)[2] + (*calibration_polynomial_coeff_x_)[3]*p[0])
469 (*calibration_polynomial_coeff_x_)[6] *p[0] +
470 (*calibration_polynomial_coeff_x_)[8] *p[1] +
471 (*calibration_polynomial_coeff_x_)[14]*p[2])
473 (*calibration_polynomial_coeff_x_)[12]*p[0] +
474 (*calibration_polynomial_coeff_x_)[17]*p[2]))
475 + p[1] * ((*calibration_polynomial_coeff_x_)[4] +
476 p[1]*((*calibration_polynomial_coeff_x_)[7]+
477 (*calibration_polynomial_coeff_x_)[9]*p[1]))
478 + p[2] * ((*calibration_polynomial_coeff_x_)[10] +
479 p[1]*((*calibration_polynomial_coeff_x_)[13] +
480 (*calibration_polynomial_coeff_x_)[15]*p[1] +
481 (*calibration_polynomial_coeff_x_)[18]*p[2]) +
483 (*calibration_polynomial_coeff_x_)[19]*p[2]));
485 (*calibration_polynomial_coeff_y_)[0]
486 + p[0]*( (*calibration_polynomial_coeff_y_)[1]
487 + p[0]*((*calibration_polynomial_coeff_y_)[2] + (*calibration_polynomial_coeff_y_)[3]*p[0])
489 (*calibration_polynomial_coeff_y_)[6] *p[0] +
490 (*calibration_polynomial_coeff_y_)[8] *p[1] +
491 (*calibration_polynomial_coeff_y_)[14]*p[2])
493 (*calibration_polynomial_coeff_y_)[12]*p[0] +
494 (*calibration_polynomial_coeff_y_)[17]*p[2]))
495 + p[1] * ((*calibration_polynomial_coeff_y_)[4] +
496 p[1]*((*calibration_polynomial_coeff_y_)[7]+
497 (*calibration_polynomial_coeff_y_)[9]*p[1]))
498 + p[2] * ((*calibration_polynomial_coeff_y_)[10] +
499 p[1]*((*calibration_polynomial_coeff_y_)[13] +
500 (*calibration_polynomial_coeff_y_)[15]*p[1] +
501 (*calibration_polynomial_coeff_y_)[18]*p[2]) +
503 (*calibration_polynomial_coeff_y_)[19]*p[2]));
521 (*calibration_polynomial_coeff_X_)[0]
522 + p2[0]*( (*calibration_polynomial_coeff_X_)[1]
523 + p2[0]*((*calibration_polynomial_coeff_X_)[2] + (*calibration_polynomial_coeff_X_)[3]*p2[0])
525 (*calibration_polynomial_coeff_X_)[6] *p2[0] +
526 (*calibration_polynomial_coeff_X_)[8] *p2[1] +
527 (*calibration_polynomial_coeff_X_)[14]*z)
529 (*calibration_polynomial_coeff_X_)[12]*p2[0] +
530 (*calibration_polynomial_coeff_X_)[17]*z))
531 + p2[1] * ((*calibration_polynomial_coeff_X_)[4] +
532 p2[1]*((*calibration_polynomial_coeff_X_)[7]+
533 (*calibration_polynomial_coeff_X_)[9]*p2[1]))
534 + z * ((*calibration_polynomial_coeff_X_)[10] +
535 p2[1]*((*calibration_polynomial_coeff_X_)[13] +
536 (*calibration_polynomial_coeff_X_)[15]*p2[1] +
537 (*calibration_polynomial_coeff_X_)[18]*z) +
539 (*calibration_polynomial_coeff_X_)[19]*z));
541 (*calibration_polynomial_coeff_Y_)[0]
542 + p2[0]*( (*calibration_polynomial_coeff_Y_)[1]
543 + p2[0]*((*calibration_polynomial_coeff_Y_)[2] + (*calibration_polynomial_coeff_Y_)[3]*p2[0])
545 (*calibration_polynomial_coeff_Y_)[6] *p2[0] +
546 (*calibration_polynomial_coeff_Y_)[8] *p2[1] +
547 (*calibration_polynomial_coeff_Y_)[14]*z)
549 (*calibration_polynomial_coeff_Y_)[12]*p2[0] +
550 (*calibration_polynomial_coeff_Y_)[17]*z))
551 + p2[1] * ((*calibration_polynomial_coeff_Y_)[4] +
552 p2[1]*((*calibration_polynomial_coeff_Y_)[7]+
553 (*calibration_polynomial_coeff_Y_)[9]*p2[1]))
554 + z * ((*calibration_polynomial_coeff_Y_)[10] +
555 p2[1]*((*calibration_polynomial_coeff_Y_)[13] +
556 (*calibration_polynomial_coeff_Y_)[15]*p2[1] +
557 (*calibration_polynomial_coeff_Y_)[18]*z) +
559 (*calibration_polynomial_coeff_Y_)[19]*z));
618 void read(
const std::string& file) {
622 for(
int i=0; i<20; i++) {
623 mu[i]=F[i][0]; mv[i]=F[i][1]; mX[i]=F[i][2]; mY[i]=F[i][3];
652 void write(
const std::string& file) {
654 std::ofstream output(file.c_str(),std::ios::out);
660 for(
int i=0;i<20; i++){
661 output<<mu[i]<<
" "<<mv[i]<<
" "<<mX[i]<<
" "<<mY[i]<<std::endl;
679 template<
class Archive>
680 void save(Archive & ar,
const unsigned int version)
const
682 ar & boost::serialization::base_object<slip::CameraModel<Type> >(*this);
693 template<
class Archive>
694 void load(Archive & ar,
const unsigned int version)
696 ar & boost::serialization::base_object<slip::CameraModel<Type> >(*this);
706 BOOST_SERIALIZATION_SPLIT_MEMBER()
714 template<
typename Type>
715 std::ostream& operator<<(std::ostream & out, const slip::SoloffCamera<Type>& c) {
729 #endif //SLIP_SOLOFFCAMERA_HPP
slip::Array< Type > & calibration_polynomial_coeff_x() const
Get the image x calibration polynomial.
Provides a class to modelize 3d points.
slip::Array< Type > * calibration_polynomial_coeff_Y_
self & operator=(const self &other)
Assign a CameraModel.
slip::Array< Type > & calibration_polynomial_coeff_Y() const
Get the real world Y calibration polynomial.
slip::MultivariatePolynomial< Type, 3 > & calibration_polynomial_y() const
Get the image y calibration polynomial.
slip::MultivariatePolynomial< Type, 3 > * calibration_polynomial_y_
slip::MultivariatePolynomial< Type, 3 > & calibration_polynomial_X() const
Get the real world X calibration polynomial.
iterator end()
Returns a read/write iterator that points one past the last element in the Vector. Iteration is done in ordinary element order.
self & operator=(const self &rhs)
Assign a SoloffCamera.
Provides a camera algorithms.
iterator begin()
Returns a read/write iterator that points to the first element in the Array. Iteration is done in ord...
slip::Array< Type > & calibration_polynomial_coeff_y() const
Get the image y calibration polynomial.
void calibration_polynomial_X(const slip::MultivariatePolynomial< Type, 3 > &calibration_polynomial_X)
Set the real world X calibration polynomial equal to calibration_polynomial_X.
slip::MultivariatePolynomial< Type, 3 > * calibration_polynomial_X_
slip::Array< Type > * calibration_polynomial_coeff_X_
void calibration_polynomial_x(const slip::MultivariatePolynomial< Type, 3 > &calibration_polynomial_x)
Set the image x calibration polynomial equal to calibration_polynomial_x.
void calibration_polynomial_coeff_y(RandomAccessIterator first, RandomAccessIterator last)
Set the image y calibration polynomial coefficient to the range [first,last)
void getpars_SoloffUV(const slip::Matrix< Type > &P, slip::MultivariatePolynomial< Type, 3 > &Pol_x, slip::MultivariatePolynomial< Type, 3 > &Pol_y)
Get calibration parameters using a polynomial fit (computation "by hand")
void calibration_polynomial_coeff_Y(RandomAccessIterator first, RandomAccessIterator last)
Set the real world Y calibration polynomial coefficient to the range [first,last) ...
slip::Array< Type > * calibration_polynomial_coeff_x_
void calibration_polynomial_y(const slip::MultivariatePolynomial< Type, 3 > &calibration_polynomial_y)
Set the image y calibration polynomial equal to calibration_polynomial_x.
This is a point2d class, a specialized version of Point<CoordType,DIM> with DIM = 2...
void calibration_polynomial_coeff_X(RandomAccessIterator first, RandomAccessIterator last)
Set the real world X calibration polynomial coefficient to the range [first,last) ...
slip::Point2d< Type > projection(const slip::Point3d< Type > &p)
Computes the projection of a 3d world point onto the image plane.
Provides some polynomial algorithms.
Numerical MultivariatePolynomial class.
slip::Array< Type > & calibration_polynomial_coeff_X() const
Get the real world X calibration polynomial.
SoloffCamera()
Default constructor of SoloffCamera.
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.
size_type degree() const
Returns the degree of the MultivariatePolynomial.
~SoloffCamera()
Destructor of the SoloffCamera.
slip::MultivariatePolynomial< Type, 3 > & calibration_polynomial_Y()
Get the real world Y calibration polynomial.
iterator end()
Returns a read/write iterator that points one past the last element in the Array. Iteration is done i...
void copy(_II first, _II last, _OI output_first)
Copy algorithm optimized for slip iterators.
Provides a class to manipulate 3d Vector.
friend class boost::serialization::access
Provides an abstract class to model cameras.
void read(const std::string &file)
Read a multivariate polynomial from an ASCII file.
void calibration_polynomial_Y(const slip::MultivariatePolynomial< Type, 3 > &calibration_polynomial_Y)
Set the real world Y calibration polynomial equal to calibration_polynomial_Y.
SoloffCamera(const self &rhs)
Constructs a copy of the SoloffCamera rhs.
slip::Array< Type > * calibration_polynomial_coeff_y_
slip::MultivariatePolynomial< Type, 3 > * calibration_polynomial_Y_
slip::MultivariatePolynomial< Type, 3 > & calibration_polynomial_x() const
Get the image x calibration polynomial.
slip::MultivariatePolynomial< Type, 3 > * calibration_polynomial_x_
Provides a class to manipulate Numerical Matrix.
Provides a class to modelize 2d points.
void read_ascii_2d(Container2d &container, const std::string &file_path_name)
Read a Container2d from an ASCII file.
This is a linear (one-dimensional) dynamic template container. This container statisfies the RandomAc...
void write(const std::string &file)
Write a multivariate polynomial to an ASCII file.
void calibration_polynomial_coeff_x(RandomAccessIterator first, RandomAccessIterator last)
Set the image x calibration polynomial coefficient to the range [first,last)
Define a SoloffCamera class.
void getpars_SoloffXY(const slip::Matrix< Type > &P, slip::MultivariatePolynomial< Type, 3 > &Pol_x, slip::MultivariatePolynomial< Type, 3 > &Pol_y)
Get calibration parameters using a polynomial fit (computation "by hand")
This is a two-dimensional dynamic and generic container. This container statisfies the Bidirectionnal...
iterator begin()
Returns a read/write iterator that points to the first element in the Vector. Iteration is done in or...
Define an abstract CameraModel class.
This is a point3d class, a specialized version of Point<CoordType,DIM> with DIM = 3...
void compute(const slip::Matrix< Type > &P)
Computes the parameters of the Soloff camera model.
void all_coeff(RandomAccessIterator first, RandomAccessIterator last) const
Returns all the coefficients of the polynomial including zero ones.