2014-06-23 3 views
2

Je veux rechercher une petite image d'un grand, mon algorithme est:utilisation boost :: boyer_moore avec boost :: gil

  1. recherche de la première ligne
  2. si la première correspond à la ligne, puis comparer le reste

Je veux utiliser boost :: :: algorithme boyer_moore pour faire la recherche en ligne, il fonctionne très bien avec std :: string:

#include <string> 
using namespace std; 
#include "boost/algorithm/searching/boyer_moore.hpp" 
using namespace boost::algorithm; 

int main() { 
    string s; 

    boyer_moore<string::iterator> bm(s.begin(), s.end()); // it compiles 
} 

le code compile, mais celui-ci ne:

#include "boost/mpl/vector.hpp" 
using namespace boost; 
#include "boost/gil/gil_all.hpp" 
using namespace boost::gil; 

#include "boost/algorithm/searching/boyer_moore.hpp" 
using namespace boost::algorithm; 

int main() { 
    typedef rgba8_image_t image_t; 
    typedef image_t::view_t view_t; 

    view_t vw; 

    boyer_moore<view_t::x_iterator> bm(vw.row_begin(0), vw.row_end(0)); // compile error 
} 

Les deux sont itérateurs, ce qui ne va pas avec le second?

Merci.

+1

Il est très rare de déformer comprend en faisant 'l'aide namespace' avant de les inclure, en particulier si les bibliothèques TMP-lourd (parce qu'ils s'appuiera souvent sur ADL pour les recherches de nom) – sehe

+0

Par ailleurs, l'étiquette [tag: gil] n'est pas liée à Boost.GIL. Le tag que vous voulez est [tag: boost-gil]. Vous devriez le changer afin de maximiser la probabilité que votre question atteigne un expert dans la bibliothèque. – llonesmiz

Répondre

2

Selon le docs l'algorithme utilise une structure de données auxiliaire appelée skip_table. Par défaut (lorsque le value_type de l'itérateur n'est pas un caractère ou un caractère non signé) cette table utilise un tr1::unordered_map, et cela nécessite que gil::pixel soit hash-able. Vous avez donc deux options: soit vous changez la skip_table par défaut en spécialisant BM_traits pour votre itérateur (ce qui n'est malheureusement pas documenté), soit vous faites gil::pixel en hachage. Pour ce dernier, vous pouvez créer un std::size_t hash_value(pixel<ChannelValue,Layout> const& val) à l'intérieur du namespace boost::gil. Ce qui suit compiles avec g ++ 4.9.0 et Visual Studio 2013 (et ne fait rien):

#include <boost/functional/hash.hpp> //ADDED 
#include <boost/mpl/vector.hpp> 
#include <boost/gil/gil_all.hpp> 
#include <boost/algorithm/searching/boyer_moore.hpp> 

using namespace boost; 
using namespace boost::gil; 
using namespace boost::algorithm; 

namespace boost { 
    namespace gil 
    { 
     template <typename ChannelValue, typename Layout> 
     std::size_t hash_value(pixel<ChannelValue, Layout> const& b) 
     { 
      std::size_t seed = 0; 
      for (int c = 0; c<num_channels<pixel<ChannelValue, Layout> >::value; ++c) 
       hash_combine(seed, b[c]); 
      return seed; 
     } 
    } 
} 

namespace std { //ADDED 
    template <typename ChannelValue, typename Layout> 
    struct hash<boost::gil::pixel<ChannelValue,Layout> > { 
     size_t operator()(boost::gil::pixel<ChannelValue, Layout> const& value) const { 
      return hash_value(value); 
     } 
    }; 
} 

int main() { 
    typedef rgba8_image_t image_t; 
    typedef image_t::view_t view_t; 

    view_t vw; 

    boyer_moore<view_t::x_iterator> bm(vw.row_begin(0), vw.row_end(0)); // compile error 
} 
+0

Merci, mais le code ne compile pas encore avec vs2010, voici la sortie: [link] (http://pastebin.com/aS5NWUss) – aj3423

+0

Suite à [this] (http://stackoverflow.com/questions/14813965/how -to-specialize-stdhash-for-type-from-other-library) et [this] (http://stackoverflow.com/a/24362641/2417774) J'ai modifié le code. Il compile maintenant avec vs2013, espérons que cela fonctionne aussi pour vous. – llonesmiz

+0

Fonctionne pour vs2013. Merci. – aj3423

Questions connexes