zsig 1.0.0

include/zsig.hh

Go to the documentation of this file.
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 //=============================================================================
 All Classes Files Functions Variables Typedefs Friends