OpenCV. Видео с камеры. Пишем в файл

    image
    Приветствую!

    В прошлых уроках:
    OpenCV. Вывод видео
    OpenCV (компьютерное зрение). Установка под MSVS 2008. «Hello World»

    Мы научились устанавливать OpenCV, написали первую программу и считывали видео из файла.

    Сейчас я хочу показать вам, как просто захватывать видео с камеры и научимся сохранять видео в файл.
    Поехали!


    Видео с камеры.


    В последнем уроке было описано, как можно прочитать видео из файла. Но вряд ли OpenCV стоит использовать для обработки уже записанного видео. Более широкое применение этой библиотеке можно найти в обработке real-time видео.

    Посмотрим на код:

    #include "highgui.h"

    int main( int argc, char** argv )
    {
    cvNamedWindow( "CAM Capture", CV_WINDOW_AUTOSIZE );
    CvCapture* capture = cvCreateCameraCapture(-1);
    assert(capture != NULL);
    IplImage* frame;
    while(1)
    {
    frame = cvQueryFrame( capture );
    if( !frame ) break;
    cvShowImage( "CAM Capture", frame );
    char c = cvWaitKey(33);
    if( c == 27 ) break;
    }
    cvReleaseCapture( &capture );
    cvDestroyWindow( "CAM Capture" );
    }


    По сравнению с кодом предыдущего урока отличий особых незаметно.
    Только функцию cvCreateFileCapture() мы заменяем на
    cvCreateCameraCapture(), в качестве параметра мы передаём ей не путь к файлу, а ID камеры — если у вас одна камера, то смело выставляйте значение -1.
    А дальше всё происходит, как и с видео-файлом.

    Пишем в файл.


    В некоторых ситуациях требуется записать полученное видео в файл, в том числе после его обработки. Библиотека OpenCV позволяет это делать. Когда мы уже создали устройство захвата, которое позволяет нам забирать кадры из видео-потока, то далее нам потребуется создать устройство записи, чтобы записывать полученные кадры в видео-файл. Для этого нам пригодится функция cvCreateVideoWriter().
    Далее для каждого кадра мы должны использовать cvWriteFrame() и в заключении всего мы воспользуемся cvReleaseVdeoWriter().

    #include "highgui.h"
    #include "cv.h"

    int main(int argc, char** argv[])
    {
    CvCapture* capture = cvCreateFileCapture("f.avi");

    if( !capture )
    {
    return -1;
    }

    IplImage* bgr_frame = cvQueryFrame( capture );
    double fps = cvGetCaptureProperty( capture, CV_CAP_PROP_FPS);
    CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
    (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
    CvVideoWriter* writer = cvCreateVideoWriter("1.avi", CV_FOURCC('M','J','P','G'), fps, size);
    IplImage* logpolar_frame = cvCreateImage( size, IPL_DEPTH_8U, 3);

    while( (bgr_frame=cvQueryFrame(capture)) != NULL )
    {
    cvLogPolar( bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),
    40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
    cvWriteFrame( writer, logpolar_frame );
    }

    cvReleaseVideoWriter( &writer );
    cvReleaseImage( &logpolar_frame );
    cvReleaseCapture( &capture );
    return(0);
    }


    Сложностей, я думаю, возникнуть не должно.
    В этой программке мы выполняем небольшое преобразование (log-polar), а проще говоря делаем наше видео чёрно-белым, а ещё точнее — в оттенках серого. :)
    Ширина, высота и fps выходного видео будут такими же, как и у входного, для этого мы и используем строчки:
    double fps = cvGetCaptureProperty( capture, CV_CAP_PROP_FPS);
    CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
    (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
    CvVideoWriter* writer = cvCreateVideoWriter("1.avi", CV_FOURCC('M','J','P','G'), fps, size);


    CV_FOURCC('M','J','P','G') — здесь мы задаём кодек MJPG (motion jpeg).

    А цикл:

    while( (bgr_frame=cvQueryFrame(capture)) != NULL )
    {
    cvLogPolar( bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),
    40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
    cvWriteFrame( writer, logpolar_frame );
    }

    непосредственно выполняет преобразование.

    Позже мы более подробно изучим функцию cvLogPolar и все её параметры.
    На этом ещё один урок закончен, буду рад всем вашим замечаниям и предложениям!
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 8

      –2
      Добавил в избранное.
        –1
        Спасибо Вам за OpenCV!
        Теперь в моем арсенале еще одна библиотека для изучения :)
        Скажите можно/как читать/писать h264 видео с помощью OpenCV?
          0
          да можно, OpenCV пользуется кодеками, которые установлены в системе
            0
            меня интересует именно захват с нескольких камер одновременно и риалтайм кодирование в х264
            библиотека мне понравилась :) может посоветуете сайты/книги/форум чтобы почитать о ней?
              0
              мне по многим вопросам помогла документация которая идет с самой библиотекой.
              Также очень большой плюс это практически все простые моменты изложены в примерах (опять же идут в архиве с исходниками)
              А так по этой библиотеке на русском практически нету инфы (хоть и делали ее наши программисты)
          0
          я думаю, было бы интересно включать запись в файл после наступления какого-либо события, например, при появлении в кадре нового объекта (т.е. при сменившейся обстановке). Или все к этому и идет?
            0
            дык а кто вам мешает?)
            процесс записи видео можно запускать в любой момент, можно сделать например чтобы раз 10 в секунду делался кадр с камеры, кадр сравивался с эталоном, и если он отличается (на картинке есть еще какой то объект), то запускаем запись, пока объект не исчезнет.
              0
              Я просто автора решил порадовать предложением. Это пока единственное (и самое очевидное?), что мне пришло в голову среди ночи. Мне то никто не мешает, и я сделаю. Может и вы что-нибудь предложите?

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

          Самое читаемое