zsig 1.0.0
|
00001 00008 #ifndef ZSIG_HH 00009 #define ZSIG_HH 00010 00116 //== INCLUDES ================================================================= 00117 00118 #include <zpolbasist.hh> 00119 #include <signaturet.hh> 00120 00121 //== NAMESPACES =============================================================== 00122 00123 namespace zsig { 00124 00125 //=== IMPLEMENTATION ========================================================== 00126 00142 template< unsigned R, unsigned C, class T > 00143 void compute_sig( std::vector< SignatureT< R, C, T > >& _sig, 00144 const SignatureMeshT< T >& _m ) { 00145 00146 _sig.clear(); 00147 00148 // vector resize method is not working with signature class, 00149 // something is wrong with operator new I guess: 00150 // _sig.resize( _m.size_of_vertices() ); 00151 00152 _sig.reserve( _m.size_of_vertices() ); 00153 for (unsigned vid = 0; vid < _m.size_of_vertices(); ++vid) 00154 _sig.push_back( SignatureT< R, C, T >() ); 00155 00156 for (unsigned vid = 0; vid < _m.size_of_vertices(); ++vid) 00157 compute_signature( _sig[vid], _m, vid ); 00158 00159 } 00160 00181 template< unsigned Order, class T, unsigned R, unsigned C > 00182 void compute_zsig( std::vector< ZernikePolynomialsBasisT< Order, T > >& _zsig, 00183 const SignatureMeshT< T >& _m, 00184 const std::vector< SignatureT< R, C, T > >& _sig ) { 00185 00186 typedef ZernikePolynomialsBasisT< Order, T > zpolbasis_type; 00187 typedef SignatureT< R, C, zpolbasis_type > zsig_type; 00188 typedef SignatureT< R, C, T > signature_type; 00189 00190 _zsig.clear(); 00191 _zsig.resize( _m.size_of_vertices() ); 00192 00193 zsig_type ZernikeBasis; 00194 00195 compute_basis( &ZernikeBasis, R, C ); 00196 00197 for (unsigned vid = 0; vid < _m.size_of_vertices(); ++vid) 00198 _zsig[vid].project( &_sig[vid], &ZernikeBasis, R, C ); 00199 00200 } 00201 00216 template< unsigned Order, class T, unsigned R, unsigned C > 00217 void compute_zsig( std::vector< ZernikePolynomialsBasisT< Order, T > >& _zsig, 00218 const SignatureMeshT< T >& _m ) { 00219 00220 std::vector< SignatureT< R, C, T > > _sig; 00221 00222 compute_sig< R, C, T >( _sig, _m ); 00223 00224 compute_zsig< Order, T, R, C >( _zsig, _m, _sig ); 00225 00226 } 00227 00256 template< unsigned Order, class T, unsigned R, unsigned C > 00257 void compute_gwzsig( std::vector< ZernikePolynomialsBasisT< Order, T > >& _gwzsig, 00258 const SignatureMeshT< T >& _m, 00259 const std::vector< ZernikePolynomialsBasisT< Order, T > >& _zsig ) { 00260 00261 typedef ZernikePolynomialsBasisT< Order, T > zpolbasis_type; 00262 typedef SignatureT< R, C, zpolbasis_type > zsig_type; 00263 typedef SignatureT< R, C, T > signature_type; 00264 00265 typedef typename SignatureMeshT< T >::vec3 vec3; 00266 00267 // Gaussian-weighted Zernike coefficients to be returned 00268 _gwzsig.clear(); 00269 _gwzsig.resize( _m.size_of_vertices() ); 00270 00271 std::set< unsigned > nv; // neighborhood of vertices to be consider around vertex 00272 00273 T gsigma = _m.maximum_search_distance() / (T)2; // Gaussian sigma 00274 00275 T gw, coff = (T)2 * gsigma * gsigma; // Gaussian weight and cut-off 00276 00277 vec3 v, ov; // current and other vertices 00278 00279 for (unsigned vid = 0; vid < _m.size_of_vertices(); ++vid) { 00280 00281 _m.compute_neighborhood( vid, nv, true ); 00282 00283 T den = (T)0; // Gaussian normalization factor (denominator) 00284 00285 v = _m.vertices()[vid]; 00286 00287 for (std::set< unsigned >::iterator sit = nv.begin(); sit != nv.end(); ++sit) { 00288 00289 ov = _m.vertices()[*sit]; 00290 00291 gw = std::exp( - ( ov - v ).sqrl() / coff ); 00292 00293 for (unsigned p = 0; p <= Order; ++p) 00294 for (unsigned qi = 0; qi <= p/2; ++qi) 00295 _gwzsig[vid][p][qi] += _zsig[*sit][p][qi] * gw; 00296 00297 den += gw; 00298 00299 } // sit 00300 00301 for (unsigned p = 0; p <= Order; ++p) 00302 for (unsigned qi = 0; qi <= p/2; ++qi) 00303 _gwzsig[vid][p][qi] /= den; 00304 00305 } // vid 00306 00307 } 00330 template< unsigned Order, class T, unsigned R, unsigned C > 00331 void compute_gwzsig( std::vector< ZernikePolynomialsBasisT< Order, T > >& _gwzsig, 00332 const SignatureMeshT< T >& _m ) { 00333 00334 std::vector< ZernikePolynomialsBasisT< Order, T > > _zsig; 00335 00336 compute_zsig< Order, T, R, C >( _zsig, _m ); 00337 00338 compute_gwzsig< Order, T, R, C >( _gwzsig, _m, _zsig ); 00339 00340 } 00349 //============================================================================= 00350 } // namespace zsig 00351 //============================================================================= 00352 #endif // ZSIG_HH 00353 //=============================================================================