41#include <visp3/core/vpMomentAlpha.h>
42#include <visp3/core/vpMomentBasic.h>
43#include <visp3/core/vpMomentCentered.h>
44#include <visp3/core/vpMomentDatabase.h>
45#include <visp3/core/vpMomentGravityCenter.h>
46#include <visp3/core/vpMomentObject.h>
47#include <visp3/io/vpImageIo.h>
49#ifdef ENABLE_VISP_NAMESPACE
53int test_moment_alpha(
const std::string &name,
bool symmetry,
const std::vector<int> &vec_angle,
double tolerance_deg,
54 double symmetry_threshold = 1e-6);
56int test_moment_alpha(
const std::string &name,
bool symmetry,
const std::vector<int> &vec_angle,
double tolerance_deg,
57 double symmetry_threshold)
61 std::cout <<
"** Test " << (symmetry ==
true ?
"symmetric " :
"non symmetric ") << name <<
" object" << std::endl;
64 std::cout <<
"*** Test symmetry detection from mu 3rd order moments" << std::endl;
66 std::vector<double> mu_ref;
67 double alpha_ref = 0.;
68 for (
unsigned int i =
static_cast<unsigned int>(vec_angle.size()); i >= 1; --i) {
71 ss << name <<
"-" << vec_angle[
i - 1] <<
"deg.pgm";
72 std::cout <<
"Process image " << ss.str() << std::endl;
94 mu_ref.push_back(mc.
get(3, 0));
95 mu_ref.push_back(mc.
get(2, 1));
96 mu_ref.push_back(mc.
get(1, 2));
97 mu_ref.push_back(mc.
get(0, 3));
98 alpha_ref = malpha_ref.
get();
104 obj.fromImage(I, 127,
118 if (malpha.is_symmetric() != symmetry) {
119 std::cout <<
"Error in symmety detection" << std::endl;
126 std::cout <<
"*** Compute angle in relative mode using the last reference from the previous test" << std::endl;
128 for (
size_t i = 0;
i < vec_angle.size();
i++) {
129 std::stringstream ss;
130 ss << name <<
"-" << vec_angle[
i] <<
"deg.pgm";
131 std::cout <<
"Process image " << ss.str() << std::endl;
151 double angle = vec_angle[
i];
157 std::cout <<
"alpha expected " << angle <<
" computed " <<
vpMath::deg(malpha.get()) <<
" deg" << std::endl;
160 std::cout <<
"Error: result is not in the tolerance: " << tolerance_deg << std::endl;
166 double angle_des1 = vec_angle[
i];
167 double angle_des2 = vec_angle[
i] - 180;
172 std::cout <<
"alpha expected " << angle_des1 <<
" or " << angle_des2 <<
" computed " << alpha <<
" deg"
177 std::cout <<
"Error: result is not in the tolerance: " << tolerance_deg << std::endl;
182 std::cout <<
"Test succeed" << std::endl;
190 double tolerance_deg;
191 std::vector<int> vec_angle;
192 double symmetry_threshold;
201 vec_angle.push_back(0);
202 vec_angle.push_back(45);
203 vec_angle.push_back(90);
204 vec_angle.push_back(135);
205 vec_angle.push_back(180);
206 vec_angle.push_back(225);
207 vec_angle.push_back(270);
208 vec_angle.push_back(315);
210 if (test_moment_alpha(name, symmetry, vec_angle, tolerance_deg) == EXIT_FAILURE) {
221 vec_angle.push_back(0);
222 vec_angle.push_back(45);
223 vec_angle.push_back(90);
224 vec_angle.push_back(135);
226 if (test_moment_alpha(name, symmetry, vec_angle, tolerance_deg) == EXIT_FAILURE) {
233 name =
"ellipse-xfig";
236 symmetry_threshold = 1
e-2;
238 vec_angle.push_back(0);
239 vec_angle.push_back(45);
240 vec_angle.push_back(90);
241 vec_angle.push_back(135);
243 if (test_moment_alpha(name, symmetry, vec_angle, tolerance_deg, symmetry_threshold) == EXIT_FAILURE) {
254 vec_angle.push_back(0);
255 vec_angle.push_back(45);
256 vec_angle.push_back(90);
257 vec_angle.push_back(135);
258 vec_angle.push_back(180);
259 vec_angle.push_back(225);
260 vec_angle.push_back(270);
261 vec_angle.push_back(315);
263 if (test_moment_alpha(name, symmetry, vec_angle, tolerance_deg) == EXIT_FAILURE) {
Generic class defining intrinsic camera parameters.
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition of the vpImage class member functions.
static bool equal(double x, double y, double threshold=0.001)
static double deg(double rad)
This class defines the orientation of the object inside the plane parallel to the object.
void compute() VP_OVERRIDE
This class defines the double-indexed centered moment descriptor .
void compute() VP_OVERRIDE
double get(unsigned int i, unsigned int j) const
This class allows to register all vpMoments so they can access each other according to their dependen...
virtual void updateAll(vpMomentObject &object)
Class describing 2D gravity center moment.
void compute() VP_OVERRIDE
Class for generic objects.
void linkTo(vpMomentDatabase &moments)