Приветствую!
В прошлых уроках:
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 и все её параметры.
На этом ещё один урок закончен, буду рад всем вашим замечаниям и предложениям!