используйте boost :: boyer_moore с boost :: gil

Я хочу найти маленькое изображение из большого, мой алгоритм:

  1. поиск по первой строке
  2. если первая строка совпадает, то сравните остальные

Я хочу использовать boost :: attribute :: boyer_moore для поиска строк, он отлично работает с 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
}

код компилируется, но этот не:

#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
}

Оба они итераторы, что не так со вторым?

Благодарю.

2

Решение

Согласно документы алгоритм использует вспомогательную структуру данных, называемую skip_table, По умолчанию (когда value_type итератора не является char или unsigned char) эта таблица использует tr1::unordered_mapи это требует, чтобы gil::pixel быть в хэш-состоянии. Таким образом, у вас есть два варианта: вы можете изменить skip_table по умолчанию, специализируясь BM_traits для вашего итератора (это, к сожалению, недокументировано), или вы делаете gil::pixel хэш-состояние. Для последнего вы можете создать std::size_t hash_value(pixel<ChannelValue,Layout> const& val) внутри namespace boost::gil, Следующие компилирует с g ++ 4.9.0 и Visual Studio 2013 (и ничего не делает):

#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
}
3

Другие решения


По вопросам рекламы [email protected]