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