14 #include <mrpt/otherlibs/do_opencv_includes.h>     24 CStereoRectifyMap::CStereoRectifyMap() :
    26         m_resize_output(false),
    27         m_enable_both_centers_coincide(false),
    28         m_resize_output_value(0,0),
    72                 #if MRPT_HAS_OPENCV && MRPT_OPENCV_VERSION_NUM>=0x200    99         CvMat mapx_left = cvMat(nrows_out,ncols_out,  CV_16SC2, &
m_dat_mapx_left[0] );
   100         CvMat mapy_left = cvMat(nrows_out,ncols_out,  CV_16UC1, &
m_dat_mapy_left[0] );
   101         CvMat mapx_right = cvMat(nrows_out,ncols_out,  CV_16SC2, &
m_dat_mapx_right[0] );
   102         CvMat mapy_right = cvMat(nrows_out,ncols_out,  CV_16UC1, &
m_dat_mapy_right[0] );
   104         cv::Mat _mapx_left  = cv::cvarrToMat(&mapx_left,
false);
   105         cv::Mat _mapy_left  = cv::cvarrToMat(&mapy_left,
false);
   106         cv::Mat _mapx_right = cv::cvarrToMat(&mapx_right,
false);
   107         cv::Mat _mapy_right = cv::cvarrToMat(&mapy_right,
false);
   113         params.rightCameraPose.getInverseHomogeneousMatrix( hMatrix );
   116         for(
unsigned int i = 0; i < 3; ++i)
   117                 for(
unsigned int j = 0; j < 3; ++j)
   118                         m1[i][j] = hMatrix(i,j);
   121         double rcTrans[3] = { hMatrix(0,3), hMatrix(1,3), hMatrix(2,3) };
   123         double ipl[3][3], ipr[3][3], dpl[5], dpr[5];
   124         for( 
unsigned int i = 0; i < 3; ++i )
   125                 for( 
unsigned int j = 0; j < 3; ++j )
   127                         ipl[i][j] = cam1.intrinsicParams(i,j);
   131         for( 
unsigned int i = 0; i < 5; ++i )
   133                 dpl[i] = cam1.dist[i];
   134                 dpr[i] = cam2.
dist[i];
   137         const cv::Mat 
R( 3, 3, CV_64F, &m1 );
   138         const cv::Mat T( 3, 1, CV_64F, &rcTrans );
   140         const cv::Mat K1(3,3,CV_64F,ipl);
   141         const cv::Mat K2(3,3,CV_64F,ipr);
   142         const cv::Mat D1(1,5,CV_64F,dpl);
   143         const cv::Mat D2(1,5,CV_64F,dpr);
   145         double _R1[3][3], _R2[3][3], _P1[3][4], _P2[3][4], _Q[4][4];
   146         cv::Mat R1(3,3,CV_64F,_R1);
   147         cv::Mat R2(3,3,CV_64F,_R2);
   148         cv::Mat P1(3,4,CV_64F,_P1);
   149         cv::Mat P2(3,4,CV_64F,_P2);
   150         cv::Mat Q(4,4,CV_64F,_Q);
   152         const cv::Size img_size(ncols,nrows);
   183 #if MRPT_OPENCV_VERSION_NUM<0x210   193 #elif MRPT_OPENCV_VERSION_NUM<0x230   221         cv::initUndistortRectifyMap( K1, D1, R1, P1, real_trg_size, CV_16SC2, _mapx_left, _mapy_left );
   222         cv::initUndistortRectifyMap( K2, D2, R2, P2, real_trg_size, CV_16SC2, _mapx_right, _mapy_right );
   225         for( 
unsigned int i = 0; i < 3; ++i )
   226                 for( 
unsigned int j = 0; j < 3; ++j )
   248         const Eigen::Map<Eigen::Matrix3d> R1e( R1.ptr<
double>() );
   249         const Eigen::Map<Eigen::Matrix3d> R2e( R2.ptr<
double>() );
   274 #if MRPT_HAS_OPENCV && MRPT_OPENCV_VERSION_NUM>=0x200   286         const IplImage * in_left  = in_left_image.
getAs<IplImage>();
   287         const IplImage * in_right = in_right_image.
getAs<IplImage>();
   289         IplImage * out_left  = out_left_image.
getAs<IplImage>();
   290         IplImage * out_right = out_right_image.
getAs<IplImage>();
   292         this->
rectify_IPL(in_left, in_right, out_left, out_right);
   302         const bool use_internal_mem_cache)
 const   306 #if MRPT_HAS_OPENCV && MRPT_OPENCV_VERSION_NUM>=0x200   315         const IplImage * in_left  = left_image.
getAs<IplImage>();
   316         const IplImage * in_right = right_image.
getAs<IplImage>();
   318         IplImage * out_left_image, *out_right_image;
   319         if (use_internal_mem_cache)
   329                 out_left_image  = cvCreateImage( trg_size, in_left->depth, in_left->nChannels );
   330                 out_right_image = cvCreateImage( trg_size, in_right->depth, in_right->nChannels );
   335                 out_left_image, out_right_image);
   337         if (use_internal_mem_cache)
   344                 cvCopy(out_left_image,  left_image.
getAs<IplImage>());
   345                 cvCopy(out_right_image, right_image.
getAs<IplImage>());
   363         const bool use_internal_mem_cache)
 const   387         const void* srcImg_left,
   388         const void* srcImg_right,
   390         void* outImg_right)
 const   393         ASSERT_(srcImg_left!=outImg_left && srcImg_right!=outImg_right)
   397 #if MRPT_HAS_OPENCV && MRPT_OPENCV_VERSION_NUM>=0x200   404         const CvMat mapx_left = cvMat(nrows_out,ncols_out,  CV_16SC2, const_cast<int16_t*>(&
m_dat_mapx_left[0]) );
   405         const CvMat mapy_left = cvMat(nrows_out,ncols_out,  CV_16UC1, const_cast<uint16_t*>(&
m_dat_mapy_left[0]) );
   406         const CvMat mapx_right = cvMat(nrows_out,ncols_out,  CV_16SC2, const_cast<int16_t*>(&
m_dat_mapx_right[0]) );
   407         const CvMat mapy_right = cvMat(nrows_out,ncols_out,  CV_16UC1, const_cast<uint16_t*>(&
m_dat_mapy_right[0]) );
   409         const cv::Mat mapx1 = cv::cvarrToMat(&mapx_left);
   410         const cv::Mat mapy1 = cv::cvarrToMat(&mapy_left);
   411         const cv::Mat mapx2 = cv::cvarrToMat(&mapx_right);
   412         const cv::Mat mapy2 = cv::cvarrToMat(&mapy_right);
   414         const cv::Mat src1 = cv::cvarrToMat(srcImg_left);
   415         const cv::Mat src2 = cv::cvarrToMat(srcImg_right);
   416         cv::Mat dst1 = cv::cvarrToMat(outImg_left);
   417         cv::Mat dst2 = cv::cvarrToMat(outImg_right);
   419     cv::remap( src1, dst1, mapx1, mapy1,static_cast<int>(
m_interpolation_method),cv::BORDER_CONSTANT, cvScalarAll(0) );
   420     cv::remap( src2, dst2, mapx2, mapy2,static_cast<int>(
m_interpolation_method),cv::BORDER_CONSTANT, cvScalarAll(0) );
   447         const std::vector<int16_t> &left_x,  
const std::vector<uint16_t> &left_y,
   448         const std::vector<int16_t> &right_x, 
const std::vector<uint16_t> &right_y )
   462         std::vector<int16_t> & left_x,  std::vector<uint16_t> & left_y,
   463         std::vector<int16_t> & right_x, std::vector<uint16_t> & right_y )
 
bool hasImageRight
Whether imageRight actually contains data (Default upon construction: true) 
GLclampf GLclampf GLclampf alpha
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL. 
const mrpt::utils::TCamera & getRectifiedRightImageParams() const
Just like getRectifiedImageParams() but for the right camera only. 
void internal_invalidate()
mrpt::utils::CImage imageLeft
Image from the left camera (this image will be ALWAYS present) 
bool m_enable_both_centers_coincide
double focalLengthMeters
The focal length of the camera, in meters (can be used among 'intrinsicParams' to determine the pixel...
const mrpt::utils::TCamera & getRectifiedLeftImageParams() const
Just like getRectifiedImageParams() but for the left camera only. 
A class for storing images as grayscale or RGB bitmaps. 
const mrpt::utils::TStereoCamera & getRectifiedImageParams() const
After computing the rectification maps, this method retrieves the calibration parameters of the recti...
#define THROW_EXCEPTION(msg)
void resize(unsigned int width, unsigned int height, TImageChannels nChannels, bool originTopLeft)
Changes the size of the image, erasing previous contents (does NOT scale its current content...
void setRectifyMaps(const std::vector< int16_t > &left_x, const std::vector< uint16_t > &left_y, const std::vector< int16_t > &right_x, const std::vector< uint16_t > &right_y)
Direct input access to rectify maps. 
void rectify(const mrpt::utils::CImage &in_left_image, const mrpt::utils::CImage &in_right_image, mrpt::utils::CImage &out_left_image, mrpt::utils::CImage &out_right_image) const
Rectify the input image pair and save the result in a different output images - setFromCamParams() mu...
mrpt::utils::TStereoCamera m_rectified_image_params
Resulting images params. 
mrpt::utils::TStereoCamera m_camera_params
A copy of the data provided by the user. 
const T * getAs() const
Returns a pointer to a const T* containing the image - the idea is to call like "img.getAs<IplImage>()" so we can avoid here including OpenCV's headers. 
void setRotationMatrix(const mrpt::math::CMatrixDouble33 &ROT)
Sets the 3x3 rotation matrix. 
Structure to hold the parameters of a pinhole stereo camera model. 
mrpt::utils::TInterpolationMethod m_interpolation_method
bool isSet() const
Returns true if setFromCamParams() has been already called, false otherwise. 
mrpt::poses::CPose3DQuat cameraPose
The pose of the LEFT camera, relative to the robot. 
mrpt::utils::TImageSize m_resize_output_value
A numeric matrix of compile-time fixed size. 
This base provides a set of functions for maths stuff. 
void rectify_IPL(const void *in_left_image, const void *in_right_image, void *out_left_image, void *out_right_image) const
Just like rectify() but directly works with OpenCV's "IplImage*", which must be passed as "void*" to ...
TCamera rightCamera
Intrinsic and distortion parameters of the left and right cameras. 
void setFromCamParams(const mrpt::utils::TStereoCamera ¶ms)
Prepares the mapping from the intrinsic, distortion and relative pose parameters of a stereo camera...
void setAlpha(double alpha)
Sets the alpha parameter which controls the zoom in/out of the rectified images, such that: ...
Observation class for either a pair of left+right or left+disparity images from a stereo camera...
Classes for computer vision, detectors, features, etc. 
void setFromIplImage(void *iplImage)
Reads the image from a OpenCV IplImage object (WITHOUT making a copy). 
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,qz). 
void enableBothCentersCoincide(bool enable=true)
If enabled (default=false), the principal points in both output images will coincide. 
std::vector< int16_t > m_dat_mapx_left
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
mrpt::utils::CImage imageRight
Image from the right camera, only contains a valid image if hasImageRight == true. 
mrpt::utils::CImage m_cache2
Memory caches for in-place rectification speed-up. 
mrpt::math::CMatrixDouble33 intrinsicParams
Matrix of intrinsic parameters (containing the focal length and principal point coordinates) ...
mrpt::math::CArrayDouble< 3 > m_coords
The translation vector [x,y,z]. 
void setStereoCameraParams(const mrpt::utils::TStereoCamera &in_params)
Sets leftCamera, rightCamera and rightCameraPose from a TStereoCamera structure. 
mrpt::poses::CPose3DQuat m_rot_left
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
mrpt::math::CArrayDouble< 5 > dist
[k1 k2 t1 t2 k3] -> k_i: parameters of radial distortion, t_i: parameters of tangential distortion (d...
A class used to store a 3D pose (a 3D translation + a rotation in 3D). 
mrpt::poses::CPose3DQuat rightCameraPose
The pose of the right camera, relative to the left one: Note that using the conventional reference co...
uint32_t nrows
Camera resolution. 
bool isOriginTopLeft() const
Returns true if the coordinates origin is top-left, or false if it is bottom-left. 
bool isColor() const
Returns true if the image is RGB, false if it is grayscale. 
std::vector< int16_t > m_dat_mapx_right
A quaternion, which can represent a 3D rotation as pair , with a real part "r" and a 3D vector ...
std::vector< uint16_t > m_dat_mapy_left
mrpt::utils::CImage m_cache1
void enableResizeOutput(bool enable, unsigned int target_width=0, unsigned int target_height=0)
If enabled, the computed maps will rectify images to a size different than their original size...
unsigned __int32 uint32_t
GLenum const GLfloat * params
mrpt::poses::CPose3DQuat m_rot_right
The rotation applied to the left/right camera so their virtual image plane is the same after rectific...
std::vector< uint16_t > m_dat_mapy_right
mrpt::poses::CPose3DQuat rightCameraPose
Pose of the right camera with respect to the coordinate origin of the left camera. 
Structure to hold the parameters of a pinhole camera model. 
void setRectifyMapsFast(std::vector< int16_t > &left_x, std::vector< uint16_t > &left_y, std::vector< int16_t > &right_x, std::vector< uint16_t > &right_y)
Direct input access to rectify maps.