1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Pseudo-database used to handle dependencies between moment features.
33  *
34  * Authors:
35  * Filip Novotny
36  *
37  *****************************************************************************/
38 
39 /*!
40   \file vpFeatureMomentDatabase.h
41   \brief Pseudo-database used to handle dependencies between moment features.
42 */
43 
44 #ifndef _vpFeatureMomentDatabase_h_
45 #define _vpFeatureMomentDatabase_h_
46 
47 #include <cstring>
48 #include <iostream>
49 #include <map>
50 #include <visp3/core/vpConfig.h>
51 
52 class vpFeatureMoment;
53 class vpMomentObject;
54 /*!
55   \class vpFeatureMomentDatabase
56 
57   \ingroup group_visual_features
58 
59   \brief This class allows to register all feature moments (implemented in
60 vpFeatureMoment... classes) so they can access each other according to their
61 dependencies.
62 
63   Like moments (implemented in vpMoment... classes), a vpFeatureMoment needs
64 to have access to other vpFeatureMoment's values to be computed. In most
65 cases, a vpFeatureMoment needs both: vpMoments and vpFeatureMoments which
66 explains the two databases (see vpFeatureMoment::vpFeatureMoment). For example
67 vpFeatureMomentAlpha needs additionnal information about centered moments
68 vpMomentCentered AND their interaction matrices obtained by
69 vpFeatureMomentCentered in order to compute the moment's value from a
70 vpMomentObject. Like the vpMomentCentered is stored in a vpMomentDatabase, the
71 vpFeatureMomentCentered should be stored in a vpFeatureMomentDatabase.
72 
73   All moment features in a database can access each other freely at any time.
74 They can also verify if a moment feature is present in the database or not.
75   This code illustrates the use of both databases to handle dependencies
76 between moment primitives and moment features:
77 
78 \code
79 #include <visp3/core/vpPoint.h>
80 
81 #include <visp3/core/vpMomentObject.h>
82 #include <visp3/core/vpMomentBasic.h>
83 #include <visp3/core/vpMomentCInvariant.h>
84 #include <visp3/core/vpMomentCentered.h>
85 #include <visp3/core/vpMomentCInvariant.h>
86 #include <visp3/core/vpMomentGravityCenter.h>
87 #include <visp3/core/vpMomentDatabase.h>
88 
89 #include <visp3/visual_features/vpFeatureMomentCInvariant.h>
90 #include <visp3/visual_features/vpFeatureMomentBasic.h>
91 #include <visp3/visual_features/vpFeatureMomentCentered.h>
92 #include <visp3/visual_features/vpFeatureMomentDatabase.h>
93 #include <iostream>
94 #include <vector>
95 
96 int main()
97 {
98   try {
99 
100     vpPoint p;
101     std::vector<vpPoint> vec_p; // vector that contains the vertices
102 
103     p.set_x(1); p.set_y(1); // coordinates in meters in the image plane (vertex 1)
104     vec_p.push_back(p);
105     p.set_x(2); p.set_y(2); // coordinates in meters in the image plane (vertex 2)
106     vec_p.push_back(p);
107 
108     //////////////////////////////REFERENCE VALUES////////////////////////////////
109     vpMomentObject obj(6); // Init object of order 6 because we are
110                            // computing C-invariants
111     obj.setType(vpMomentObject::DISCRETE); // Discrete mode for object
112     obj.fromVector(vec_p);
113 
114     vpMomentDatabase mdb;     // database for moment primitives. This will
115                               // only contain the basic moment.
116     vpMomentCentered mc;      // Centered moment
117     vpMomentBasic bm;         // Basic moment
118     vpMomentGravityCenter gc; // gravity center
119     vpMomentCInvariant ci;    // C-type invariant
120 
121     bm.linkTo(mdb); //add basic moment to moment database
122     mc.linkTo(mdb); //add centered moment to moment database
123     gc.linkTo(mdb); //add gravity center to moment database
124     ci.linkTo(mdb); //add C-invariant to moment database
125 
126     vpFeatureMomentDatabase fmdb; // feature moment database to store
127                                   // feature dependencies
128 
129     // Declare and link moments to database
130     vpFeatureMomentBasic fmb(mdb,0.,0.,1.,&fmdb); fmb.linkTo(fmdb);
131     vpFeatureMomentCentered fmc(mdb,0.,0.,1.,&fmdb); fmc.linkTo(fmdb);
132     vpFeatureMomentCInvariant fci(mdb,0.,0.,1.,&fmdb); fci.linkTo(fmdb);
133 
134     // update the whole moment database
135     mdb.updateAll(obj);
136 
137     // Compute moments in the correct order with the object
138     bm.compute();
139     gc.compute();
140     mc.compute();
141     ci.compute();
142 
143     // update the whole feature moment database with a plane
144     fmb.update(0.,0.,1.);
145     fmc.update(0.,0.,1.);
146     fci.update(0.,0.,1.);
147 
148     std::cout << fci.interaction(vpFeatureMomentCInvariant::selectC1()) << std::endl;
149   }
150   catch(const vpException &e){
151       std::cout << e.getMessage() << std::endl;
152   }
153 
154   return 0;
155 }
156 \endcode
157 */
158 class VISP_EXPORT vpFeatureMomentDatabase
159 {
160 private:
161   struct cmp_str {
operatorcmp_str162     bool operator()(const char *a, const char *b) const { return std::strcmp(a, b) < 0; }
163     char *operator=(const char *) { return NULL; } // Only to avoid a warning under Visual with /Wall flag
164   };
165   std::map<const char *, vpFeatureMoment *, cmp_str> featureMomentsDataBase;
166   void add(vpFeatureMoment &featureMoment, char *name);
167 
168 public:
169   /*!
170     Default constructor.
171   */
vpFeatureMomentDatabase()172   vpFeatureMomentDatabase() : featureMomentsDataBase() {}
173   /*!
174     Virtual destructor that does nothing.
175   */
~vpFeatureMomentDatabase()176   virtual ~vpFeatureMomentDatabase() {}
177   virtual void updateAll(double A = 0.0, double B = 0.0, double C = 1.0);
178 
179   vpFeatureMoment &get(const char *type, bool &found);
180 
181   // friend VISP_EXPORT std::ostream & operator<<(std::ostream& os, const
182   // vpFeatureMomentDatabase& m);
183   friend class vpFeatureMoment;
184 };
185 
186 #endif
187