Example #1
0
HaarFeature::HaarFeature(const FloatRect& bb, int type) :
    m_bb(bb) {
    assert(type < 6);

    switch (type) {
    case 0: {
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width(), bb.Height() / 2));
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + bb.Height() / 2, bb.Width(), bb.Height() / 2));
        m_weights.push_back(1.f);
        m_weights.push_back(-1.f);
        m_factor = 255 * 1.f / 2;
        break;
    }

    case 1: {
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width() / 2, bb.Height()));
        m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 2, bb.YMin(), bb.Width() / 2, bb.Height()));
        m_weights.push_back(1.f);
        m_weights.push_back(-1.f);
        m_factor = 255 * 1.f / 2;
        break;
    }

    case 2: {
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width() / 3, bb.Height()));
        m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 3, bb.YMin(), bb.Width() / 3, bb.Height()));
        m_rects.push_back(FloatRect(bb.XMin() + 2 * bb.Width() / 3, bb.YMin(), bb.Width() / 3, bb.Height()));
        m_weights.push_back(1.f);
        m_weights.push_back(-2.f);
        m_weights.push_back(1.f);
        m_factor = 255 * 2.f / 3;
        break;
    }

    case 3: {
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width(), bb.Height() / 3));
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + bb.Height() / 3, bb.Width(), bb.Height() / 3));
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + 2 * bb.Height() / 3, bb.Width(), bb.Height() / 3));
        m_weights.push_back(1.f);
        m_weights.push_back(-2.f);
        m_weights.push_back(1.f);
        m_factor = 255 * 2.f / 3;
        break;
    }

    case 4: {
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width() / 2, bb.Height() / 2));
        m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 2, bb.YMin() + bb.Height() / 2, bb.Width() / 2, bb.Height() / 2));
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin() + bb.Height() / 2, bb.Width() / 2, bb.Height() / 2));
        m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 2, bb.YMin(), bb.Width() / 2, bb.Height() / 2));
        m_weights.push_back(1.f);
        m_weights.push_back(1.f);
        m_weights.push_back(-1.f);
        m_weights.push_back(-1.f);
        m_factor = 255 * 1.f / 2;
        break;
    }

    case 5: {
        m_rects.push_back(FloatRect(bb.XMin(), bb.YMin(), bb.Width(), bb.Height()));
        m_rects.push_back(FloatRect(bb.XMin() + bb.Width() / 4, bb.YMin() + bb.Height() / 4, bb.Width() / 2, bb.Height() / 2));
        m_weights.push_back(1.f);
        m_weights.push_back(-4.f);
        m_factor = 255 * 3.f / 4;
        break;
    }
    }
}