Отличия от фона OpenCV / OpenCV / Recog.ru - Распознавание образов для программистов


Отличия от фона OpenCV

В OpenCV 2.2 есть отличный пример, демонстрирующий детектирование отличий от фона bgfg_segm. Листинг функции main представен ниже.
int main(int argc, char** argv)
{
    IplImage*       tmp_frame = NULL;
    CvCapture*      cap = NULL;
    bool update_bg_model = true;

    if( argc < 2 )
        cap = cvCaptureFromCAM(0);
    else
        cap = cvCaptureFromFile(argv[1]);
    help();
    
    if( !cap )
    {
        printf("can not open camera or video file\n");
        return -1;
    }
     
    tmp_frame = cvQueryFrame(cap);
    if(!tmp_frame)
    {
        printf("can not read data from the video source\n");
        return -1;
    }

    cvNamedWindow("BG", 1);
    cvNamedWindow("FG", 1);

    CvBGStatModel* bg_model = 0;
    
    for( int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(cap), fr++ )
    {
        if(!bg_model)
        {
            //create BG model
            bg_model = cvCreateGaussianBGModel( tmp_frame );
            //bg_model = cvCreateFGDStatModel( tmp_frame );
            continue;
        }
        
        double t = (double)cvGetTickCount();
        cvUpdateBGStatModel( tmp_frame, bg_model, update_bg_model ? -1 : 0 );
        t = (double)cvGetTickCount() - t;
        printf( "%d. %.1f\n", fr, t/(cvGetTickFrequency()*1000.) );
        cvShowImage("BG", bg_model->background);
        cvShowImage("FG", bg_model->foreground);
        char k = cvWaitKey(5);
        if( k == 27 ) break;
        if( k == ' ' )
        {
            update_bg_model = !update_bg_model;
            if(update_bg_model)
            	printf("Background update is on\n");
            else
            	printf("Background update is off\n");
        }
    }

    cvReleaseBGStatModel( &bg_model );
    cvReleaseCapture(&cap);

    return 0;
}


Как видим, листинг довольно прост. По сути, в цикле опрашивается камера, и на экран выводятся отличия. Попробовав поискать основные элементы, я обнаружил, что в хелпе к opencv их нет. Не удивительно, к проекту подключается файл
#include <opencv2/video/background_segm.hpp>
Важным элементом является структура CvBGStatModel.

#define CV_BG_STAT_MODEL_FIELDS()                                                   \
    int             type; /*тип заднего фона*/                                      \
    CvReleaseBGStatModel release;                                                   \
    CvUpdateBGStatModel update;                                                     \
    IplImage*       background;   /*8UC3 фоновое изображение*/               \
    IplImage*       foreground;   /*8UC1 изображение переднего плана*/                         \
    IplImage**      layers;       /*8UC3 также отвечает за фон */ \
    int             layer_count;  /* количество уровней фона */                                 \
    CvMemStorage*   storage;      /*хранилище для объектов переднего плана*/                \
    CvSeq*          foreground_regions /*контуры объектов переднего плана*/

typedef struct CvBGStatModel
{
    CV_BG_STAT_MODEL_FIELDS();
} CvBGStatModel;


Мы видим, что эта структура полностью определяет отличия от фона. Первоначально структура инициализируется. Причем могут использоваться два способа. cvCreateFGDStatModel – инициализация процесса обнаружения на переднем плане, cvCreateGaussianBGModel – создает Гауссианов микшер для заднего фона (об этом почитать можно здесь http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf). Как это выглядит, можно посмотреть, перекомпилировав с разными значениями. Ну или пример Гауссианова микшера можно посмотреть в статье:

Затем, на каждом кадре производится обновление функцией cvUpdateBGStatModel, которая выполняем обновлении статической модели и возвращение количества найденных объектов на переднем плане. Ну собственно тема интересная, возможно мы к ней ещё вернемся в будущем.
  • 0
  • 01 декабря 2011, 15:58
  • vidikon

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

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

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