Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
testCameraParametersConversion.cpp
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 *
30 * Description:
31 * Performs various tests on the vpPixelMeterConversion and
32 * vpPixelMeterConversion class.
33 */
34
41
42#include <stdio.h>
43#include <stdlib.h>
44#include <visp3/core/vpCameraParameters.h>
45#include <visp3/core/vpDebug.h>
46#include <visp3/core/vpMath.h>
47#include <visp3/core/vpMeterPixelConversion.h>
48#include <visp3/core/vpPixelMeterConversion.h>
49
50int main()
51{
52#ifdef ENABLE_VISP_NAMESPACE
53 using namespace VISP_NAMESPACE_NAME;
54#endif
55 try {
56 {
57 std::cout << "* Test operator=()" << std::endl;
58 vpCameraParameters cam1, cam2;
59 cam1.initPersProjWithDistortion(700.0, 700.0, 320.0, 240.0, 0.1, 0.1);
60 cam2.initPersProjWithoutDistortion(700.0, 700.0, 320.0, 240.0);
61 if (cam1 == cam2) {
62 std::cerr << "Issue with vpCameraParameters comparison operator." << std::endl;
63 return EXIT_FAILURE;
64 }
65
66 cam2 = cam1;
67 if (cam1 != cam2) {
68 std::cerr << "Issue with vpCameraParameters comparison operator." << std::endl;
69 return EXIT_FAILURE;
70 }
71
72 std::cout << "* Test computeFov()" << std::endl;
73 cam2.computeFov(640u, 480u);
74 if (cam1 == cam2) {
75 std::cerr << "Issue with vpCameraParameters comparison operator." << std::endl;
76 return EXIT_FAILURE;
77 }
78 }
79
81 double px, py, u0, v0;
82 px = 1657.429131;
83 py = 1658.818598;
84 u0 = 322.2437833;
85 v0 = 230.8012737;
86 vpCameraParameters camDist;
87 double px_dist, py_dist, u0_dist, v0_dist, kud_dist, kdu_dist;
88 px_dist = 1624.824731;
89 py_dist = 1625.263641;
90 u0_dist = 324.0923411;
91 v0_dist = 245.2421388;
92 kud_dist = -0.1741532338;
93 kdu_dist = 0.1771165148;
94
95 cam.initPersProjWithoutDistortion(px, py, u0, v0);
96 camDist.initPersProjWithDistortion(px_dist, py_dist, u0_dist, v0_dist, kud_dist, kdu_dist);
97
98 double u1 = 320;
99 double v1 = 240;
100 double x1 = 0, y1 = 0;
101 double u2 = 0, v2 = 0;
102 std::cout << "* Test point conversion without distortion" << std::endl;
103 vpPixelMeterConversion::convertPoint(cam, u1, v1, x1, y1);
104 vpMeterPixelConversion::convertPoint(cam, x1, y1, u2, v2);
105 if (!vpMath::equal(u1, u2) || !vpMath::equal(v1, v2)) {
106 std::cerr << "Error in point conversion without distortion:\n"
107 << "u1 = " << u1 << ", u2 = " << u2 << std::endl
108 << "v1 = " << v1 << ", v2 = " << v2 << std::endl;
109 return EXIT_FAILURE;
110 }
111
112 std::cout << "* Test point conversion with distortion" << std::endl;
113 vpPixelMeterConversion::convertPoint(camDist, u1, v1, x1, y1);
114 vpMeterPixelConversion::convertPoint(camDist, x1, y1, u2, v2);
115 if (!vpMath::equal(u1, u2) || !vpMath::equal(v1, v2)) {
116 std::cerr << "Error in point conversion without distortion:\n"
117 << "u1 = " << u1 << ", u2 = " << u2 << std::endl
118 << "v1 = " << v1 << ", v2 = " << v2 << std::endl;
119 return EXIT_FAILURE;
120 }
121
122#if defined(HAVE_OPENCV_IMGPROC) && \
123 (((VISP_HAVE_OPENCV_VERSION < 0x050000) && defined(HAVE_OPENCV_CALIB3D)) || ((VISP_HAVE_OPENCV_VERSION >= 0x050000) && defined(HAVE_OPENCV_CALIB)))
124
125 {
126 std::cout << "* Compare ViSP and OpenCV point pixel meter conversion without distortion" << std::endl;
127 cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << px, 0, u0, 0, py, v0, 0, 0, 1);
128 cv::Mat distCoeffs = cv::Mat::zeros(5, 1, CV_64FC1);
129 double x2, y2;
130
131 vpPixelMeterConversion::convertPoint(cam, u1, v1, x1, y1);
132 vpPixelMeterConversion::convertPoint(cameraMatrix, distCoeffs, u1, v1, x2, y2);
133 if (!vpMath::equal(x1, x2, 1e-6) || !vpMath::equal(y1, y2, 1e-6)) {
134 std::cerr << "Error in point pixel meter conversion: visp result (" << x1 << ", " << y1 << ") "
135 << "differ from OpenCV result (" << x2 << ", " << y2 << ")" << std::endl;
136 return EXIT_FAILURE;
137 }
138
139 vpImagePoint ip(v1, u1);
141 vpPixelMeterConversion::convertPoint(cameraMatrix, distCoeffs, ip, x2, y2);
142 if (!vpMath::equal(x1, x2, 1e-6) || !vpMath::equal(y1, y2, 1e-6)) {
143 std::cerr << "Error in point pixel meter conversion: visp result (" << x1 << ", " << y1 << ") "
144 << "differ from OpenCV result (" << x2 << ", " << y2 << ")" << std::endl;
145 return EXIT_FAILURE;
146 }
147
148 std::cout << "* Compare ViSP and OpenCV point meter pixel conversion without distortion" << std::endl;
149 vpMeterPixelConversion::convertPoint(cam, x1, y1, u1, v1);
150 vpMeterPixelConversion::convertPoint(cameraMatrix, distCoeffs, x1, y1, u2, v2);
151 if (!vpMath::equal(u1, u2, 1e-6) || !vpMath::equal(v1, v2, 1e-6)) {
152 std::cerr << "Error in point meter pixel conversion: visp result (" << u1 << ", " << v1 << ") "
153 << "differ from OpenCV result (" << u2 << ", " << v2 << ")" << std::endl;
154 return EXIT_FAILURE;
155 }
156
157 vpImagePoint iP1, iP2;
158 vpMeterPixelConversion::convertPoint(cam, x1, y1, iP1);
159 vpMeterPixelConversion::convertPoint(cameraMatrix, distCoeffs, x1, y1, iP2);
160 if (vpImagePoint::distance(iP1, iP2) > 1e-6) {
161 std::cerr << "Error in point meter pixel conversion: visp result (" << u1 << ", " << v1 << ") "
162 << "differ from OpenCV result (" << u2 << ", " << v2 << ")" << std::endl;
163 return EXIT_FAILURE;
164 }
165 }
166
167 {
168 std::cout << "* Compare ViSP and OpenCV point pixel meter conversion with distortion" << std::endl;
169 cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << px_dist, 0, u0_dist, 0, py_dist, v0_dist, 0, 0, 1);
170 cv::Mat distCoeffs = cv::Mat::zeros(5, 1, CV_64FC1);
171 distCoeffs.at<double>(0, 0) = kdu_dist;
172 double x2, y2;
173
174 vpPixelMeterConversion::convertPoint(camDist, u1, v1, x1, y1);
175 vpPixelMeterConversion::convertPoint(cameraMatrix, distCoeffs, u1, v1, x2, y2);
176 if (!vpMath::equal(x1, x2, 1e-6) || !vpMath::equal(y1, y2, 1e-6)) {
177 std::cerr << "Error in point conversion: visp result (" << x1 << ", " << y1 << ") "
178 << "differ from OpenCV result (" << x2 << ", " << y2 << ")" << std::endl;
179 return EXIT_FAILURE;
180 }
181
182 std::cout << "* Compare ViSP and OpenCV point meter pixel conversion with distortion" << std::endl;
183 distCoeffs.at<double>(0, 0) = kud_dist;
184 vpMeterPixelConversion::convertPoint(camDist, x1, y1, u1, v1);
185 vpMeterPixelConversion::convertPoint(cameraMatrix, distCoeffs, x1, y1, u2, v2);
186 if (!vpMath::equal(u1, u2, 1e-6) || !vpMath::equal(v1, v2, 1e-6)) {
187 std::cerr << "Error in point meter pixel conversion: visp result (" << u1 << ", " << v1 << ") "
188 << "differ from OpenCV result (" << u2 << ", " << v2 << ")" << std::endl;
189 return EXIT_FAILURE;
190 }
191 }
192
193 {
194 std::cout << "* Compare ViSP and OpenCV line pixel meter conversion without distortion" << std::endl;
195 cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << px, 0, u0, 0, py, v0, 0, 0, 1);
196 double rho_p = 100, theta_p = vpMath::rad(45);
197 double rho_m1, theta_m1, rho_m2, theta_m2;
198
199 vpPixelMeterConversion::convertLine(cam, rho_p, theta_p, rho_m1, theta_m1);
200 vpPixelMeterConversion::convertLine(cameraMatrix, rho_p, theta_p, rho_m2, theta_m2);
201 if (!vpMath::equal(rho_m1, rho_m2, 1e-6) || !vpMath::equal(theta_m1, theta_m2, 1e-6)) {
202 std::cerr << "Error in line pixel meter conversion: visp result (" << rho_m1 << ", " << theta_m1 << ") "
203 << "differ from OpenCV result (" << rho_m2 << ", " << theta_m1 << ")" << std::endl;
204 return EXIT_FAILURE;
205 }
206
207 std::cout << "* Compare ViSP and OpenCV line meter pixel conversion without distortion" << std::endl;
208 double rho_p1, theta_p1, rho_p2, theta_p2;
209 vpMeterPixelConversion::convertLine(cam, rho_m1, theta_m1, rho_p1, theta_p1);
210 vpMeterPixelConversion::convertLine(cameraMatrix, rho_m1, theta_m1, rho_p2, theta_p2);
211 if (!vpMath::equal(rho_p1, rho_p2, 1e-6) || !vpMath::equal(theta_p1, theta_p2, 1e-6)) {
212 std::cerr << "Error in line meter pixel conversion: visp result (" << rho_p1 << ", " << theta_p1 << ") "
213 << "differ from OpenCV result (" << rho_p2 << ", " << theta_p1 << ")" << std::endl;
214 return EXIT_FAILURE;
215 }
216 }
217
218 {
219 std::cout << "* Compare ViSP and OpenCV moments pixel meter conversion without distortion" << std::endl;
220 cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << px, 0, u0, 0, py, v0, 0, 0, 1);
221 unsigned int order = 3;
222 double m00 = 2442, m10 = 414992, m01 = 470311, m11 = 7.99558e+07, m02 = 9.09603e+07, m20 = 7.11158e+07;
223
224 vpMatrix mp(order, order);
225 vpMatrix m1(order, order), m2(order, order);
226
227 mp[0][0] = m00;
228 mp[1][0] = m10;
229 mp[0][1] = m01;
230 mp[2][0] = m20;
231 mp[1][1] = m11;
232 mp[0][2] = m02;
233
234 vpPixelMeterConversion::convertMoment(cam, order, mp, m1);
235 vpPixelMeterConversion::convertMoment(cameraMatrix, order, mp, m2);
236 for (unsigned int i = 0; i < m1.getRows(); i++) {
237 for (unsigned int j = 0; j < m1.getCols(); j++) {
238 if (!vpMath::equal(m1[i][j], m1[i][j], 1e-6)) {
239 std::cerr << "Error in moments pixel meter conversion: visp result for [" << i << "][" << j << "] ("
240 << m1[i][j] << ") "
241 << "differ from OpenCV result (" << m2[i][j] << ")" << std::endl;
242 return EXIT_FAILURE;
243 }
244 }
245 }
246 }
247
248 {
249 std::cout << "* Compare ViSP and OpenCV ellipse from circle meter pixel conversion without distortion"
250 << std::endl;
251 cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << px, 0, u0, 0, py, v0, 0, 0, 1);
252 vpCircle circle;
253 circle.setWorldCoordinates(0, 0, 1, 0, 0, 0, 0.1); // plane:(Z=0),X0=0,Y0=0,Z=0,R=0.1
254 vpHomogeneousMatrix cMo(0.1, 0.2, 0.5, vpMath::rad(10), vpMath::rad(5), vpMath::rad(45));
255 circle.changeFrame(cMo);
256 circle.projection();
257 vpImagePoint center_p1, center_p2;
258 double n20_p1, n11_p1, n02_p1, n20_p2, n11_p2, n02_p2;
259
260 vpMeterPixelConversion::convertEllipse(cam, circle, center_p1, n20_p1, n11_p1, n02_p1);
261 vpMeterPixelConversion::convertEllipse(cameraMatrix, circle, center_p2, n20_p2, n11_p2, n02_p2);
262
263 if (!vpMath::equal(n20_p1, n20_p2, 1e-6) || !vpMath::equal(n11_p1, n11_p2, 1e-6) ||
264 !vpMath::equal(n02_p1, n02_p2, 1e-6)) {
265 std::cerr << "Error in ellipse from circle meter pixel conversion: visp result (" << n20_p1 << ", " << n11_p1
266 << ", " << n02_p1 << ") "
267 << "differ from OpenCV result (" << n20_p2 << ", " << n11_p2 << ", " << n02_p2 << ")" << std::endl;
268 return EXIT_FAILURE;
269 }
270 if (vpImagePoint::distance(center_p1, center_p2) > 1e-6) {
271 std::cerr << "Error in ellipse from circle meter pixel conversion: visp result (" << center_p1 << ") "
272 << "differ from OpenCV result (" << center_p2 << ")" << std::endl;
273 return EXIT_FAILURE;
274 }
275
276 std::cout << "* Compare ViSP and OpenCV ellipse from sphere meter pixel conversion without distortion"
277 << std::endl;
278 vpSphere sphere;
279 sphere.setWorldCoordinates(0, 0, 0, 0.1); // X0=0,Y0=0,Z0=0,R=0.1
280 circle.changeFrame(cMo);
281 circle.projection();
282 vpMeterPixelConversion::convertEllipse(cam, sphere, center_p1, n20_p1, n11_p1, n02_p1);
283 vpMeterPixelConversion::convertEllipse(cameraMatrix, sphere, center_p2, n20_p2, n11_p2, n02_p2);
284
285 if (!vpMath::equal(n20_p1, n20_p2, 1e-6) || !vpMath::equal(n11_p1, n11_p2, 1e-6) ||
286 !vpMath::equal(n02_p1, n02_p2, 1e-6)) {
287 std::cerr << "Error in ellipse from sphere meter pixel conversion: visp result (" << n20_p1 << ", " << n11_p1
288 << ", " << n02_p1 << ") "
289 << "differ from OpenCV result (" << n20_p2 << ", " << n11_p2 << ", " << n02_p2 << ")" << std::endl;
290 return EXIT_FAILURE;
291 }
292 if (vpImagePoint::distance(center_p1, center_p2) > 1e-6) {
293 std::cerr << "Error in ellipse from sphere meter pixel conversion: visp result (" << center_p1 << ") "
294 << "differ from OpenCV result (" << center_p2 << ")" << std::endl;
295 return EXIT_FAILURE;
296 }
297 }
298#endif
299
300 std::cout << "Test successful" << std::endl;
301 return EXIT_SUCCESS;
302 }
303 catch (const vpException &e) {
304 std::cout << "Catch an exception: " << e << std::endl;
305 return EXIT_FAILURE;
306 }
307}
Generic class defining intrinsic camera parameters.
void initPersProjWithoutDistortion(double px, double py, double u0, double v0)
void initPersProjWithDistortion(double px, double py, double u0, double v0, double kud, double kdu)
void computeFov(const unsigned int &w, const unsigned int &h)
Class that defines a 3D circle in the object frame and allows forward projection of a 3D circle in th...
Definition vpCircle.h:87
void changeFrame(const vpHomogeneousMatrix &noMo, vpColVector &noP) const VP_OVERRIDE
Definition vpCircle.cpp:273
void projection() VP_OVERRIDE
Definition vpCircle.cpp:151
void setWorldCoordinates(const vpColVector &oP) VP_OVERRIDE
Definition vpCircle.cpp:58
error that can be emitted by ViSP classes.
Definition vpException.h:60
Implementation of an homogeneous matrix and operations on such kind of matrices.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static double distance(const vpImagePoint &iP1, const vpImagePoint &iP2)
static double rad(double deg)
Definition vpMath.h:129
static bool equal(double x, double y, double threshold=0.001)
Definition vpMath.h:470
Implementation of a matrix and operations on matrices.
Definition vpMatrix.h:175
static void convertLine(const vpCameraParameters &cam, const double &rho_m, const double &theta_m, double &rho_p, double &theta_p)
static void convertPoint(const vpCameraParameters &cam, const double &x, const double &y, double &u, double &v)
static void convertEllipse(const vpCameraParameters &cam, const vpSphere &sphere, vpImagePoint &center_p, double &n20_p, double &n11_p, double &n02_p)
static void convertMoment(const vpCameraParameters &cam, unsigned int order, const vpMatrix &moment_pixel, vpMatrix &moment_meter)
static void convertLine(const vpCameraParameters &cam, const double &rho_p, const double &theta_p, double &rho_m, double &theta_m)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Class that defines a 3D sphere in the object frame and allows forward projection of a 3D sphere in th...
Definition vpSphere.h:80
void setWorldCoordinates(const vpColVector &oP) VP_OVERRIDE
Definition vpSphere.cpp:60