使用boost::boyer_moore和boost::gil。

3

我希望从一张大图中找到一个小图,我的算法如下:

  1. 查找第一行
  2. 如果第一行匹配,则比较剩余部分

我想使用boost::algorithm::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
}

它们两个都是迭代器,第二个有什么问题吗?

谢谢。


1
在包含它们之前使用using namespace来扭曲包含是非常不寻常的,特别是对于TMP-heavy库(因为它们通常依赖于ADL进行名称查找)。 - sehe
顺便提一下,标签[tag:gil]与Boost.GIL无关。你需要的标签是[tag:boost-gil]。为了最大化问题达到库中专家的可能性,你应该更改它。 - llonesmiz
1个回答

4
根据文档,该算法使用了一个名为skip_table的辅助数据结构。默认情况下(当迭代器的value_type不是char或unsigned char时),此表使用tr1::unordered_map,这要求gil::pixel可哈希。所以你有两个选择:一是通过为您的迭代器特化BM_traits来更改默认的skip_table(这很遗憾没有记录在案),二是使gil::pixel可哈希。对于后者,您可以在namespace boost::gil内创建一个std::size_t hash_value(pixel<ChannelValue,Layout> const& val)。以下编译使用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
}

谢谢,但是这段代码仍然无法在vs2010中编译,以下是输出结果:链接 - aj3423
1
根据这个这个,我已经编辑了代码。现在它也可以在vs2013中编译,希望对你也有效。 - llonesmiz
适用于vs2013。谢谢。 - aj3423

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接