unsigned int HaarDetector::search_faces()
{
        clear_detected_objects();

        //debug out only
        for (unsigned int i = 0; i < (unsigned int)m_object_maps.size(); i++) {
                ObjectMap* pom = m_object_maps[i];                
                pom->get_tmp_object_map().copy(pom->get_object_map());
        }
        //debug out only

        ObjectMap* pom = 0;
        int tmpx = 0, tmpy = 0;
        unsigned int x = 0, y = 0, index = 0;
        float max = 0.0f, tmpmx = 0.0f;        
        while (true) {
                float max = -FLT_MAX;
                index = 0;
                for (unsigned int i = 0; i < (unsigned int)m_object_maps.size(); i++) {
                        pom = m_object_maps[i];
                        unsigned int dx = pom->get_object_width() / 2;
                        unsigned int dy = pom->get_object_height() / 2;
                        pom->get_object_map().max_val(tmpmx, tmpx, tmpy, 5, 5, dx, dy);
                        if (tmpmx > max) {
                                index = i;
                                max = tmpmx;
                                x = tmpx;
                                y = tmpy;
                        }
                }
                
                pom = m_object_maps[index];                
                if (max > detection_sensitivity()) {
                        unsigned int w2 = pom->get_object_width() / 2;
                        unsigned int h2 = pom->get_object_height() / 2;
                        Rect rect;
                        rect.left = x - w2;
                        rect.top = y - h2;
                        rect.right = x + w2;
                        rect.bottom = y + h2;
                        ObjRect obj_rect;
                        obj_rect.rect = rect;
                        obj_rect.x = x;
                        obj_rect.y = y;
                        obj_rect.radius = sqrt(pow(float(w2), 2.0f) + pow(float(h2), 2.0f));
                        if (is_foundobject_overlaps(obj_rect) == false) {
                                obj_rect.object = new vec2Di(pom->get_object_height(), pom->get_object_width());
                                obj_rect.object->copy(*m_pimage, x - w2, y - h2);                                
                                m_detected_objects.push_back(obj_rect);
                                erase_object_rect(rect);            //erase found face region  [left, right)
                        } else {
                                erase_object_rect(x, y);                                                                
                        }
                }
                else
                        break;                
        }

        return (unsigned int)m_detected_objects.size();
}