Максимально стабильные экстремальные области / OpenCV / Recog.ru - Распознавание образов для программистов


Максимально стабильные экстремальные области

В компьютерном зрении, максимально стабильные экстремальные регионы (MSER) используются в качестве метода обнаружения больших двоичных объектов в изображениях. Предложен в работе:
J. Matas, O. Chum, M. Urban, and T. Pajdla. «Robust wide baseline stereo from maximally stable extremal regions.» Proc. of British Machine Vision Conference, pages 384-396, 2002.
http://cmp.felk.cvut.cz/~matas/papers/matas-bmvc02.pdf
В OpenCV есть пример их использования mser_sample.cpp, текст которого приведен ниже
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

static void help()
{
    cout << "\nThis program demonstrates the Maximal Extremal Region interest point detector.\n"
    "It finds the most stable (in size) dark and white regions as a threshold is increased.\n"
    "\nCall:\n"
    "./mser_sample <path_and_image_filename, Default is 'puzzle.png'>\n\n";
}

static const Vec3b bcolors[] =
{
    Vec3b(0,0,255),
    Vec3b(0,128,255),
    Vec3b(0,255,255),
    Vec3b(0,255,0),
    Vec3b(255,128,0),
    Vec3b(255,255,0),
    Vec3b(255,0,0),
    Vec3b(255,0,255),
    Vec3b(255,255,255)
};

int main( int argc, char** argv )
{
    string path;
    Mat img0, img, yuv, gray, ellipses;
    help();

    img0 = imread( argc != 2 ? "puzzle.png" : argv[1], 1 );
    if( img0.empty() )
    {
        if( argc != 2 )
            cout << "\nUsage: mser_sample <path_to_image>\n";
        else
            cout << "Unable to load image " << argv[1] << endl;
        return 0;
    }

    cvtColor(img0, yuv, COLOR_BGR2YCrCb);
    cvtColor(img0, gray, COLOR_BGR2GRAY);
    cvtColor(gray, img, COLOR_GRAY2BGR);
    img.copyTo(ellipses);

    vector<vector<Point> > contours;
    double t = (double)getTickCount();
    MSER()(yuv, contours);
    t = (double)getTickCount() - t;
    printf( "MSER extracted %d contours in %g ms.\n", (int)contours.size(),
           t*1000./getTickFrequency() );

    // draw mser's with different colors
    for( int i = (int)contours.size()-1; i >= 0; i-- )
    {
        const vector<Point>& r = contours[i];
        for ( int j = 0; j < (int)r.size(); j++ )
        {
            Point pt = r[j];
            img.at<Vec3b>(pt) = bcolors[i%9];
        }

        // find ellipse (it seems cvfitellipse2 have error or sth?)
        RotatedRect box = fitEllipse( r );

        box.angle=(float)CV_PI/2-box.angle;
        ellipse( ellipses, box, Scalar(196,255,255), 2 );
    }

    imshow( "original", img0 );
    imshow( "response", img );
    imshow( "ellipses", ellipses );

    waitKey(0);
} 


Рассмотрим суть работы алгоритма.
1. Загружается изображение (для тестов стандартное изображение ниже):

2. Создание дополнительных для алгоритма изображений:
cvtColor(img0, yuv, COLOR_BGR2YCrCb);
cvtColor(img0, gray, COLOR_BGR2GRAY);
cvtColor(gray, img, COLOR_GRAY2BGR);
img.copyTo(ellipses);


yuv – изображение в формате YCrCb, gray – серое, img – 24 битное, но заполненное серым изображением, ellipses – копия серого изображения (d 24-х битном формате).

3.
MSER()(yuv, contours);


На данном этапе производится детектирование экстремальных областей которые записываются в contours – последовательность точек векторного типа.

4. Вывод результатов на изображение осуществляется последовательно для каждого контура – перебор:
for( int i = (int)contours.size()-1; i >= 0; i-- )


Закрашивается контур:

const vector<Point>& r = contours[i];
for ( int j = 0; j < (int)r.size(); j++ )
{
   Point pt = r[j];
   img.at<Vec3b>(pt) = bcolors[i%9];
 }


Строится минимальный ограничивающий эллипс с помощью fitEllipse. И затем этот эллипс отображается на экране

Результаты:



Другие результаты – пример автомобильных номеров:




Видно, что номеру соответствует несколько горизонтальных эллипсов.
  • 0
  • 17 февраля 2015, 12:23
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.