// Copyright (C) 2011 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #ifndef DLIB_SETUP_HAShED_FEATURES_Hh_ #define DLIB_SETUP_HAShED_FEATURES_Hh_ #include "setup_hashed_features_abstract.h" #include "scan_image_pyramid.h" #include "scan_image_boxes.h" #include "../lsh.h" #include "../statistics.h" #include "../image_keypoint.h" #include "../geometry.h" namespace dlib { // ---------------------------------------------------------------------------------------- class image_hash_construction_failure : public error { public: image_hash_construction_failure( const std::string& a ): error(a) {} }; // ---------------------------------------------------------------------------------------- template < typename image_scanner > void use_uniform_feature_weights ( image_scanner& scanner ) { typename image_scanner::feature_extractor_type fe; fe.copy_configuration(scanner.get_feature_extractor()); fe.use_uniform_feature_weights(); scanner.copy_configuration(fe); } // ---------------------------------------------------------------------------------------- template < typename image_scanner > void use_relative_feature_weights ( image_scanner& scanner ) { typename image_scanner::feature_extractor_type fe; fe.copy_configuration(scanner.get_feature_extractor()); fe.use_relative_feature_weights(); scanner.copy_configuration(fe); } // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- // stuff for scan_image_pyramid // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- template < typename image_array, typename pyramid, typename feature_extractor, template <typename fe, typename hash> class feature_image > void setup_hashed_features ( scan_image_pyramid<pyramid, feature_image<feature_extractor, projection_hash> >& scanner, const image_array& images, const feature_extractor& fe, int bits, unsigned long num_samples = 200000 ) { // make sure requires clause is not broken DLIB_ASSERT(0 < bits && bits <= 32 && num_samples > 1 && images.size() > 0, "\t void setup_hashed_features()" << "\n\t Invalid inputs were given to this function. " << "\n\t bits: " << bits << "\n\t num_samples: " << num_samples << "\n\t images.size(): " << images.size() ); pyramid pyr; const random_subset_selector<typename feature_extractor::descriptor_type>& samps = randomly_sample_image_features(images, pyr, fe, num_samples); if (samps.size() <= 1) throw dlib::image_hash_construction_failure("Images too small, not able to gather enough samples to make hash"); projection_hash phash = create_random_projection_hash(samps, bits); feature_image<feature_extractor, projection_hash> hfe; hfe.copy_configuration(scanner.get_feature_extractor()); hfe.set_hash(phash); hfe.copy_configuration(fe); scanner.copy_configuration(hfe); } // ---------------------------------------------------------------------------------------- template < typename image_array, typename pyramid, typename feature_extractor, template <typename fe, typename hash> class feature_image > void setup_hashed_features ( scan_image_pyramid<pyramid, feature_image<feature_extractor, projection_hash> >& scanner, const image_array& images, int bits, unsigned long num_samples = 200000 ) { // make sure requires clause is not broken DLIB_ASSERT(0 < bits && bits <= 32 && num_samples > 1 && images.size() > 0, "\t void setup_hashed_features()" << "\n\t Invalid inputs were given to this function. " << "\n\t bits: " << bits << "\n\t num_samples: " << num_samples << "\n\t images.size(): " << images.size() ); feature_extractor fe; setup_hashed_features(scanner, images, fe, bits, num_samples); } // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- // stuff for scan_image_boxes // ---------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------- template < typename image_array, typename feature_extractor, template <typename fe, typename hash> class feature_image, typename box_generator > void setup_hashed_features ( scan_image_boxes<feature_image<feature_extractor, projection_hash>,box_generator >& scanner, const image_array& images, const feature_extractor& fe, int bits, unsigned long num_samples = 200000 ) { // make sure requires clause is not broken DLIB_ASSERT(0 < bits && bits <= 32 && num_samples > 1 && images.size() > 0, "\t void setup_hashed_features()" << "\n\t Invalid inputs were given to this function. " << "\n\t bits: " << bits << "\n\t num_samples: " << num_samples << "\n\t images.size(): " << images.size() ); pyramid_disable pyr; const random_subset_selector<typename feature_extractor::descriptor_type>& samps = randomly_sample_image_features(images, pyr, fe, num_samples); if (samps.size() <= 1) throw dlib::image_hash_construction_failure("Images too small, not able to gather enough samples to make hash"); projection_hash phash = create_random_projection_hash(samps, bits); feature_image<feature_extractor, projection_hash> hfe; hfe.copy_configuration(scanner.get_feature_extractor()); hfe.set_hash(phash); hfe.copy_configuration(fe); scanner.copy_configuration(hfe); } // ---------------------------------------------------------------------------------------- template < typename image_array, typename feature_extractor, template <typename fe, typename hash> class feature_image, typename box_generator > void setup_hashed_features ( scan_image_boxes<feature_image<feature_extractor, projection_hash>,box_generator>& scanner, const image_array& images, int bits, unsigned long num_samples = 200000 ) { // make sure requires clause is not broken DLIB_ASSERT(0 < bits && bits <= 32 && num_samples > 1 && images.size() > 0, "\t void setup_hashed_features()" << "\n\t Invalid inputs were given to this function. " << "\n\t bits: " << bits << "\n\t num_samples: " << num_samples << "\n\t images.size(): " << images.size() ); feature_extractor fe; setup_hashed_features(scanner, images, fe, bits, num_samples); } // ---------------------------------------------------------------------------------------- } #endif // DLIB_SETUP_HAShED_FEATURES_Hh_