Обнаружение картинок или векторных изображений с помощью OpenCV в C ++ - PullRequest
1 голос
/ 15 июля 2011

У меня есть процесс, который обнаруживает похожие изображения с использованием SURF, и я хочу добавить проверку, чтобы узнать, какие изображения являются реальными фотографиями с камеры, а какие - векторными изображениями, такими как логотипы скриншотов карты.

Примеры

Фото: http://images.gta -travel.com / ЧЧ / Изображения / J / TYO / TYO-NEW3-8.jpg

Логотип: http://estaticos.transhotel.com/img/fotos/hoteles/000137/hft000137578_005.jpg

Логотип: http://live.viajesurbis.com/vuweb/content/fichashotel/13127/HOTEL_13127_2.jpg

Я пытался посмотреть на серую гистограмму (и цветную гистограмму), но ничто не дает мне достаточно информации, чтобы узнать, какие из них являются векторными или нет.

1 Ответ

1 голос
/ 15 июля 2011

Хорошо, решил, следующий код - очистка гистограммы, получение всех цветов в оттенках серого и подсчет различных цветов.Возможно, в будущем я протестирую, улучшит ли алгоритм работа с гистограммами компонентов.

CvHistogram* wImage::getHistogram() {
    IplImage* gray = cvCreateImage(cvGetSize(this->image), 8, 1);

    CvHistogram* hist;
    int hist_size = 256;
    float range[] = {0, 256};
    float* ranges[] = {range};

    cvCvtColor(this->image, gray, CV_RGB2GRAY);
    hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
    cvCalcHist(&gray, hist, 0, NULL);

    return hist;
}

bool wImage::isVectorial() {

    CvHistogram* hist = this->getHistogram();

    int height = 240;

    float max_value = 0, min_value = 0;
    cvGetMinMaxHistValue(hist, &min_value, &max_value);

    int total = 0;
    int colors = 0;

    float value;
    int normalized;

    for(int i=0; i < 256; i++){
        value = cvQueryHistValue_1D(hist, i);
        normalized = cvRound(value * height / max_value);

        if(normalized < 2 || normalized > 230) {
            continue;
        }

        colors++;
        total += normalized;
    }

    if((total < 500 && colors < 100) || (total < 1000 && colors < 85)) {
        return true;
    }

    return false;
}
...