17 #include <mrpt/otherlibs/do_opencv_includes.h>
34 const std::vector<mrpt::math::TPoint3D> &in_points_3D,
37 std::vector<TPixelCoordf> &projectedPoints,
38 bool accept_points_behind )
43 static const std::vector<double> distortion_dummy(4,0);
51 accept_points_behind );
59 const std::vector<mrpt::math::TPoint3D> &in_points_3D,
62 const std::vector<double> & distortionParams,
63 std::vector<mrpt::utils::TPixelCoordf> &projectedPoints,
64 bool accept_points_behind
72 ASSERT_(distortionParams.size()==4 || distortionParams.size()==5);
74 const size_t N = in_points_3D.size();
75 projectedPoints.resize(N);
79 vector<CvPoint3D64f> objPoints(N);
82 for (
size_t i=0;i<N;i++)
84 in_points_3D[i].x,in_points_3D[i].y,in_points_3D[i].z,
85 objPoints[i].x,objPoints[i].y,objPoints[i].z
89 static double rotation_matrix[] = {1,0,0, 0,1,0, 0,0,1 };
90 static double translation_vector[] = {0,0,0 };
97 proj_matrix[0] = intrinsicParams.get_unsafe(0,0);
98 proj_matrix[4] = intrinsicParams.get_unsafe(1,1);
99 proj_matrix[2] = intrinsicParams.get_unsafe(0,2);
100 proj_matrix[5] = intrinsicParams.get_unsafe(1,2);
103 cv::Mat object_points = cv::Mat( N, 1, CV_64FC3, &objPoints[0] );
106 cv::Rodrigues( cv::Mat( 3, 3, CV_64FC1, rotation_matrix ), rotvec);
108 cv::Mat _translation_vector = cv::Mat( 3, 1, CV_64FC1, translation_vector );
109 cv::Mat camera_matrix = cv::Mat( 3, 3, CV_64FC1, &proj_matrix[0] );
110 cv::Mat dist_coeffs = cv::Mat( 5, 1, CV_64FC1,
const_cast<double*
>(&distortionParams[0]) );
112 vector<cv::Point2d> image_points;
115 object_points, rotvec, _translation_vector,
116 camera_matrix, dist_coeffs, image_points );
118 for (
size_t i=0;i<N;i++)
120 if (accept_points_behind || objPoints[i].
z>0 )
122 projectedPoints[i].x = image_points[i].x;
123 projectedPoints[i].y = image_points[i].y;
127 projectedPoints[i].x = -1;
128 projectedPoints[i].y = -1;
133 THROW_EXCEPTION(
"Function not available: MRPT was compiled without OpenCV")
143 const std::vector<mrpt::utils::TPixelCoordf> &in_dist_pixels,
144 std::vector<mrpt::utils::TPixelCoordf> &out_pixels,
146 const std::vector<double> & Dk )
151 for (
size_t i=0;i<cam.
dist.static_size;i++) cam.
dist[i] = Dk[i];
156 const std::vector<mrpt::utils::TPixelCoordf> &in_dist_pixels,
157 std::vector<mrpt::utils::TPixelCoordf> &out_pixels,
164 const size_t n = in_dist_pixels.size();
165 out_pixels.resize(
n);
167 const double fx = cameraModel.
fx();
168 const double fy = cameraModel.
fy();
169 const double ifx = 1./fx;
170 const double ify = 1./fy;
171 const double cx = cameraModel.
cx();
172 const double cy = cameraModel.
cy();
174 for(
size_t i = 0; i <
n; i++ )
176 double x = in_dist_pixels[i].x;
177 double y = in_dist_pixels[i].y;
179 double x0 =
x = (
x - cx)*ifx;
180 double y0 =
y = (
y - cy)*ify;
183 for(
unsigned int j = 0; j < 5; j++ )
185 double r2 =
x*
x +
y*
y;
186 double icdist = 1./(1 + ((cameraModel.
dist[4]*r2 + cameraModel.
dist[1])*r2 + cameraModel.
dist[0])*r2);
187 double deltaX = 2*cameraModel.
dist[2]*
x*
y + cameraModel.
dist[3]*(r2 + 2*
x*
x);
188 double deltaY = cameraModel.
dist[2]*(r2 + 2*
y*
y) + 2*cameraModel.
dist[3]*
x*
y;
189 x = (x0 - deltaX)*icdist;
190 y = (y0 - deltaY)*icdist;
194 out_pixels[i].x =
x*fx + cx;
195 out_pixels[i].y =
y*fy + cy;
215 const double fx = cameraModel.
fx();
216 const double fy = cameraModel.
fy();
217 const double ifx = 1./fx;
218 const double ify = 1./fy;
219 const double cx = cameraModel.
cx();
220 const double cy = cameraModel.
cy();
225 double x0 =
x = (
x - cx)*ifx;
226 double y0 =
y = (
y - cy)*ify;
229 for(
unsigned int j = 0; j < 5; j++ )
231 double r2 =
x*
x +
y*
y;
232 double icdist = 1./(1 + ((cameraModel.
dist[4]*r2 + cameraModel.
dist[1])*r2 + cameraModel.
dist[0])*r2);
233 double deltaX = 2*cameraModel.
dist[2]*
x*
y + cameraModel.
dist[3]*(r2 + 2*
x*
x);
234 double deltaY = cameraModel.
dist[2]*(r2 + 2*
y*
y) + 2*cameraModel.
dist[3]*
x*
y;
235 x = (x0 - deltaX)*icdist;
236 y = (y0 - deltaY)*icdist;
248 const std::vector<mrpt::math::TPoint3D> &P,
251 std::vector<mrpt::utils::TPixelCoordf> &
pixels,
252 bool accept_points_behind
257 pixels.resize( P.size() );
261 for( itPoints = P.begin(), itPixels =
pixels.begin(); itPoints != P.end(); ++itPoints, ++itPixels, ++k )
268 const double x = nP.
x/nP.
z;
269 const double y = nP.
y/nP.
z;
273 const double r4 =
square(r2);
274 const double r6 = r2*r4;
276 const double B = 2*
x*
y;
277 if( A > 0 && (accept_points_behind || nP.
z > 0) )
299 bool accept_points_behind
304 const double x = P.
x/P.
z;
305 const double y = P.
y/P.
z;
309 const double r4 =
square(r2);
310 const double r6 = r2*r4;
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void inverseComposePoint(const double gx, const double gy, const double gz, double &lx, double &ly, double &lz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dpose=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dse3=NULL) const
Computes the 3D point L such as .
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,...
void inverseComposePoint(const double gx, const double gy, const double gz, double &lx, double &ly, double &lz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 7 > *out_jacobian_df_dpose=NULL) const
Computes the 3D point L such as .
Structure to hold the parameters of a pinhole camera model.
mrpt::math::CArrayDouble< 5 > dist
[k1 k2 t1 t2 k3] -> k_i: parameters of radial distortion, t_i: parameters of tangential distortion (d...
mrpt::math::CMatrixDouble33 intrinsicParams
Matrix of intrinsic parameters (containing the focal length and principal point coordinates)
double cx() const
Get the value of the principal point x-coordinate (in pixels).
double fx() const
Get the value of the focal length x-value (in pixels).
double cy() const
Get the value of the principal point y-coordinate (in pixels).
double fy() const
Get the value of the focal length y-value (in pixels).
const Scalar * const_iterator
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
GLenum const GLfloat * params
void VISION_IMPEXP undistort_point(const mrpt::utils::TPixelCoordf &inPt, mrpt::utils::TPixelCoordf &outPt, const mrpt::utils::TCamera &cameraModel)
Undistort one point given by its pixel coordinates and the camera parameters.
void VISION_IMPEXP projectPoints_with_distortion(const std::vector< mrpt::math::TPoint3D > &in_points_3D, const mrpt::poses::CPose3D &cameraPose, const mrpt::math::CMatrixDouble33 &intrinsicParams, const std::vector< double > &distortionParams, std::vector< mrpt::utils::TPixelCoordf > &projectedPoints, bool accept_points_behind=false)
Project a set of 3D points into a camera at an arbitrary 6D pose using its calibration matrix and dis...
void VISION_IMPEXP projectPoint_with_distortion(const mrpt::math::TPoint3D &in_point_wrt_cam, const mrpt::utils::TCamera &in_cam_params, mrpt::utils::TPixelCoordf &out_projectedPoints, bool accept_points_behind=false)
Project one 3D point into a camera using its calibration matrix and distortion parameters (radial and...
void VISION_IMPEXP projectPoints_no_distortion(const std::vector< mrpt::math::TPoint3D > &in_points_3D, const mrpt::poses::CPose3D &cameraPose, const mrpt::math::CMatrixDouble33 &intrinsicParams, std::vector< mrpt::utils::TPixelCoordf > &projectedPoints, bool accept_points_behind=false)
Project a set of 3D points into a camera at an arbitrary 6D pose using its calibration matrix (undist...
void VISION_IMPEXP undistort_points(const std::vector< mrpt::utils::TPixelCoordf > &srcDistortedPixels, std::vector< mrpt::utils::TPixelCoordf > &dstUndistortedPixels, const mrpt::math::CMatrixDouble33 &intrinsicParams, const std::vector< double > &distortionParams)
Undistort a list of points given by their pixel coordinates, provided the camera matrix and distortio...
#define THROW_EXCEPTION(msg)
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
This base provides a set of functions for maths stuff.
T square(const T x)
Inline function for the square of a number.
This namespace contains representation of robot actions and observations.
This namespace provides a OS-independent interface to many useful functions: filenames manipulation,...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
Functions related to pinhole camera models, point projections, etc.
Classes for computer vision, detectors, features, etc.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
double z
X,Y,Z coordinates.
A pair (x,y) of pixel coordinates (subpixel resolution).