Files
ov_secondary_linux/camera_models/include/camodocal/camera_models/Camera.h

149 lines
5.3 KiB
C++

#ifndef CAMERA_H
#define CAMERA_H
#include <boost/shared_ptr.hpp>
#include <eigen3/Eigen/Dense>
#include <opencv2/core/core.hpp>
#include <vector>
namespace camodocal
{
class Camera
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
enum ModelType
{
KANNALA_BRANDT,
MEI,
PINHOLE,
PINHOLE_FULL,
SCARAMUZZA
};
class Parameters
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Parameters( ModelType modelType );
Parameters( ModelType modelType, const std::string& cameraName, int w, int h );
ModelType& modelType( void );
std::string& cameraName( void );
int& imageWidth( void );
int& imageHeight( void );
ModelType modelType( void ) const;
const std::string& cameraName( void ) const;
int imageWidth( void ) const;
int imageHeight( void ) const;
int nIntrinsics( void ) const;
virtual bool readFromYamlFile( const std::string& filename ) = 0;
virtual void writeToYamlFile( const std::string& filename ) const = 0;
protected:
ModelType m_modelType;
int m_nIntrinsics;
std::string m_cameraName;
int m_imageWidth;
int m_imageHeight;
};
virtual ModelType modelType( void ) const = 0;
virtual const std::string& cameraName( void ) const = 0;
virtual int imageWidth( void ) const = 0;
virtual int imageHeight( void ) const = 0;
virtual cv::Mat& mask( void );
virtual const cv::Mat& mask( void ) const;
virtual void estimateIntrinsics( const cv::Size& boardSize,
const std::vector< std::vector< cv::Point3f > >& objectPoints,
const std::vector< std::vector< cv::Point2f > >& imagePoints )
= 0;
virtual void estimateExtrinsics( const std::vector< cv::Point3f >& objectPoints,
const std::vector< cv::Point2f >& imagePoints,
cv::Mat& rvec,
cv::Mat& tvec ) const;
// Lift points from the image plane to the sphere
virtual void liftSphere( const Eigen::Vector2d& p, Eigen::Vector3d& P ) const = 0;
//%output P
// Lift points from the image plane to the projective space
virtual void liftProjective( const Eigen::Vector2d& p, Eigen::Vector3d& P ) const = 0;
//%output P
// Projects 3D points to the image plane (Pi function)
virtual void spaceToPlane( const Eigen::Vector3d& P, Eigen::Vector2d& p ) const = 0;
//%output p
// Projects 3D points to the image plane (Pi function)
// and calculates jacobian
// virtual void spaceToPlane(const Eigen::Vector3d& P, Eigen::Vector2d& p,
// Eigen::Matrix<double,2,3>& J) const = 0;
//%output p
//%output J
virtual void undistToPlane( const Eigen::Vector2d& p_u, Eigen::Vector2d& p ) const = 0;
//%output p
// virtual void initUndistortMap(cv::Mat& map1, cv::Mat& map2, double fScale = 1.0)
// const = 0;
virtual cv::Mat initUndistortRectifyMap( cv::Mat& map1,
cv::Mat& map2,
float fx = -1.0f,
float fy = -1.0f,
cv::Size imageSize = cv::Size( 0, 0 ),
float cx = -1.0f,
float cy = -1.0f,
cv::Mat rmat = cv::Mat::eye( 3, 3, CV_32F ) ) const = 0;
virtual int parameterCount( void ) const = 0;
virtual void readParameters( const std::vector< double >& parameters ) = 0;
virtual void writeParameters( std::vector< double >& parameters ) const = 0;
virtual void writeParametersToYamlFile( const std::string& filename ) const = 0;
virtual std::string parametersToString( void ) const = 0;
/**
* \brief Calculates the reprojection distance between points
*
* \param P1 first 3D point coordinates
* \param P2 second 3D point coordinates
* \return euclidean distance in the plane
*/
double reprojectionDist( const Eigen::Vector3d& P1, const Eigen::Vector3d& P2 ) const;
double reprojectionError( const std::vector< std::vector< cv::Point3f > >& objectPoints,
const std::vector< std::vector< cv::Point2f > >& imagePoints,
const std::vector< cv::Mat >& rvecs,
const std::vector< cv::Mat >& tvecs,
cv::OutputArray perViewErrors = cv::noArray( ) ) const;
double reprojectionError( const Eigen::Vector3d& P,
const Eigen::Quaterniond& camera_q,
const Eigen::Vector3d& camera_t,
const Eigen::Vector2d& observed_p ) const;
void projectPoints( const std::vector< cv::Point3f >& objectPoints,
const cv::Mat& rvec,
const cv::Mat& tvec,
std::vector< cv::Point2f >& imagePoints ) const;
protected:
cv::Mat m_mask;
};
typedef boost::shared_ptr< Camera > CameraPtr;
typedef boost::shared_ptr< const Camera > CameraConstPtr;
}
#endif