Как стать автором
Обновить

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 и все её параметры.
На этом ещё один урок закончен, буду рад всем вашим замечаниям и предложениям!
Теги:
Хабы:
Всего голосов 12: ↑11 и ↓1 +10
Просмотры 8.1K
Комментарии Комментарии 8