39 #ifndef VP_PIXEL_METER_CONVERSION_H
40 #define VP_PIXEL_METER_CONVERSION_H
42 #include <visp3/core/vpCameraParameters.h>
43 #include <visp3/core/vpException.h>
44 #include <visp3/core/vpImagePoint.h>
45 #include <visp3/core/vpMath.h>
47 #if defined(VISP_HAVE_OPENCV)
48 #include <opencv2/core/core.hpp>
70 double n02_p,
double &xc_m,
double &yc_m,
double &n20_m,
double &n11_m,
double &n02_m);
71 static void convertLine(
const vpCameraParameters &cam,
const double &rho_p,
const double &theta_p,
double &rho_m,
103 switch (cam.m_projModel) {
105 convertPointWithoutDistortion(cam, u, v, x, y);
108 convertPointWithDistortion(cam, u, v, x, y);
111 convertPointWithKannalaBrandtDistortion(cam, u, v, x, y);
114 std::cerr <<
"projection model not identified" << std::endl;
147 switch (cam.m_projModel) {
149 convertPointWithoutDistortion(cam, iP, x, y);
152 convertPointWithDistortion(cam, iP, x, y);
155 convertPointWithKannalaBrandtDistortion(cam, iP, x, y);
158 std::cerr <<
"projection model not identified" << std::endl;
162 #ifndef DOXYGEN_SHOULD_SKIP_THIS
175 inline static void convertPointWithoutDistortion(
const vpCameraParameters &cam,
const double &u,
const double &v,
176 double &x,
double &y)
178 x = (u - cam.m_u0) * cam.m_inv_px;
179 y = (v - cam.m_v0) * cam.m_inv_py;
200 x = (iP.
get_u() - cam.m_u0) * cam.m_inv_px;
201 y = (iP.
get_v() - cam.m_v0) * cam.m_inv_py;
218 inline static void convertPointWithDistortion(
const vpCameraParameters &cam,
const double &u,
const double &v,
219 double &x,
double &y)
221 double r2 = 1. + (cam.m_kdu * (
vpMath::sqr((u - cam.m_u0) * cam.m_inv_px) +
vpMath::sqr((v - cam.m_v0) * cam.m_inv_py)));
222 x = (u - cam.m_u0) * r2 * cam.m_inv_px;
223 y = (v - cam.m_v0) * r2 * cam.m_inv_py;
245 double r2 = 1. + (cam.m_kdu * (
vpMath::sqr((iP.
get_u() - cam.m_u0) * cam.m_inv_px) +
247 x = (iP.
get_u() - cam.m_u0) * r2 * cam.m_inv_px;
248 y = (iP.
get_v() - cam.m_v0) * r2 * cam.m_inv_py;
271 inline static void convertPointWithKannalaBrandtDistortion(
const vpCameraParameters &cam,
const double &u,
272 const double &v,
double &x,
double &y)
274 double x_d = (u - cam.m_u0) / cam.m_px, y_d = (v - cam.m_v0) / cam.m_py;
277 const unsigned int index_0 = 0;
278 const unsigned int index_1 = 1;
279 const unsigned int index_2 = 2;
280 const unsigned int index_3 = 3;
281 const unsigned int val_1 = 1;
282 const unsigned int val_3 = 3;
283 const unsigned int val_5 = 5;
284 const unsigned int val_7 = 7;
285 const unsigned int val_9 = 9;
286 const unsigned int val_10 = 10;
288 r_d = std::min<double>(std::max<double>(-M_PI, r_d), M_PI);
292 const double EPS = 1e-8;
298 for (
unsigned int j = 0; j < val_10; ++j) {
299 double theta2 = theta * theta;
300 double theta4 = theta2 * theta2;
301 double theta6 = theta4 * theta2;
302 double theta8 = theta6 * theta2;
303 double k0_theta2 = k[index_0] * theta2;
304 double k1_theta4 = k[index_1] * theta4;
305 double k2_theta6 = k[index_2] * theta6,
306 k3_theta8 = k[index_3] * theta8;
310 double theta_fix = ((theta * (val_1 + k0_theta2 + k1_theta4 + k2_theta6 + k3_theta8)) - r_d)
311 / (val_1 + (val_3 * k0_theta2) + (val_5 * k1_theta4) + (val_7 * k2_theta6) + (val_9 * k3_theta8));
312 theta = theta - theta_fix;
313 if (fabs(theta_fix) < EPS) {
318 scale = std::tan(theta) / r_d;
345 double &x,
double &y)
347 double x_d = (iP.
get_u() - cam.m_u0) / cam.m_px, y_d = (iP.
get_v() - cam.m_v0) / cam.m_py;
350 const unsigned int index_0 = 0;
351 const unsigned int index_1 = 1;
352 const unsigned int index_2 = 2;
353 const unsigned int index_3 = 3;
354 const unsigned int val_1 = 1;
355 const unsigned int val_3 = 3;
356 const unsigned int val_5 = 5;
357 const unsigned int val_7 = 7;
358 const unsigned int val_9 = 9;
359 const unsigned int val_10 = 10;
361 r_d = std::min<double>(std::max<double>(-M_PI, r_d), M_PI);
365 const double EPS = 1e-8;
371 for (
unsigned int j = 0; j < val_10; ++j) {
372 double theta2 = theta * theta;
373 double theta4 = theta2 * theta2;
374 double theta6 = theta4 * theta2;
375 double theta8 = theta6 * theta2;
376 double k0_theta2 = k[index_0] * theta2;
377 double k1_theta4 = k[index_1] * theta4;
378 double k2_theta6 = k[index_2] * theta6;
379 double k3_theta8 = k[index_3] * theta8;
383 double theta_fix = ((theta * (val_1 + k0_theta2 + k1_theta4 + k2_theta6 + k3_theta8)) - r_d) /
384 (val_1 + (val_3 * k0_theta2) + (val_5 * k1_theta4) + (val_7 * k2_theta6) + (val_9 * k3_theta8));
385 theta = theta - theta_fix;
386 if (fabs(theta_fix) < EPS) {
391 scale = std::tan(theta) / r_d;
400 #if defined(HAVE_OPENCV_IMGPROC) && \
401 (((VISP_HAVE_OPENCV_VERSION < 0x050000) && defined(HAVE_OPENCV_CALIB3D)) || ((VISP_HAVE_OPENCV_VERSION >= 0x050000) && defined(HAVE_OPENCV_CALIB) && defined(HAVE_OPENCV_3D)))
405 static void convertEllipse(
const cv::Mat &cameraMatrix,
const cv::Mat &distCoeffs,
const vpImagePoint ¢er_p,
406 double n20_p,
double n11_p,
double n02_p,
double &xc_m,
double &yc_m,
double &n20_m,
407 double &n11_m,
double &n02_m);
408 static void convertLine(
const cv::Mat &cameraMatrix,
const double &rho_p,
const double &theta_p,
double &rho_m,
410 static void convertMoment(
const cv::Mat &cameraMatrix,
unsigned int order,
const vpMatrix &moment_pixel,
412 static void convertPoint(
const cv::Mat &cameraMatrix,
const cv::Mat &distCoeffs,
const double &u,
const double &v,
413 double &x,
double &y);
414 static void convertPoint(
const cv::Mat &cameraMatrix,
const cv::Mat &distCoeffs,
const vpImagePoint &iP,
double &x,
Generic class defining intrinsic camera parameters.
std::vector< double > getKannalaBrandtDistortionCoefficients() const
@ perspectiveProjWithDistortion
Perspective projection with distortion model.
@ ProjWithKannalaBrandtDistortion
Projection with Kannala-Brandt distortion model.
@ perspectiveProjWithoutDistortion
Perspective projection without distortion model.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static double sqr(double x)
Implementation of a matrix and operations on matrices.
static void convertPoint(const vpCameraParameters &cam, const vpImagePoint &iP, double &x, double &y)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)