Перейти к содержимому
Compvision.ru
Storm

Запись в видеофайл средствами OpenCV

Recommended Posts

Здравствуйте.

В процессе изучения OpenCV попробовал запустить программу, которая читает один файл и пишет в другой. Её код:

#include "stdafx.h"

#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);

}

Компилируется без ошибок. Но на стадии выполнения на инструкции cvWriteFrame( writer, logpolar_frame ) появляется исключение

Unhandled exception at 0x01217ef5 in CVHW.exe: 0xC0000005: Access violation reading location 0xffffffff.

Как по-вашему в чем может быть дело?

Кодеки в системе установлены, сомневаюсь, что причина в них, т.к. пример с простым выводом видео в окно работает нормально.

Вызов cvLogPolar тоже исключал, cvWriteFrame( writer, bgr_frame ) в этом случае приводит точно к тому же исключению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Посмотрите чему равны Size и fps.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, действительно, fps и size были равны 0.

Но программу из первого поста мне так и не удалось заставить работать :)

Однако работает немного другая:

//

// Программа получает видео с камеры и записывает в avi файл

//

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include "stdio.h"

int main(int argc, char* argv[])

{

cvNamedWindow("capture");

// получаем любую подключённую камеру

CvCapture *capture = cvCreateCameraCapture(CV_CAP_ANY);

assert(capture!=0);

const char *filename = "capture.avi";

// частота кадров

double fps = 10;

// размер картинки

CvSize size = cvSize(640, 480);

CvVideoWriter *writer = cvCreateVideoWriter(filename, CV_FOURCC('X','V','I','D'), fps, size, 1);

assert(writer!=0);

IplImage *frame = 0;

//int abc = 1;

//bool er2 = true;

//char ame3 = 'c';

//IplImage *frame1 = 0;

bool flag = true;

while(flag)

{

// получаем кадр

frame = cvQueryFrame( capture );

cvFlip(frame,frame,0);

// сохраняем в файл

cvWriteFrame(writer, frame);

char c = cvWaitKey(33);

switch (c)

{

case 27: // если нажата ESC - выходим

flag = false;

break;

default:

break;

}

// показываем

cvShowImage("capture", frame);

}

// освобождаем ресурсы

cvReleaseCapture( &capture );

cvReleaseVideoWriter(&writer);

cvDestroyWindow("capture");

return 0;

}

Не могу понять: почему если раскомментировать любую из строк

//int abc = 1;

//bool er2 = true;

//char ame3 = 'c';

//IplImage *frame1 = 0;

программа начинает падать.

Причем если закомментировать

cvWriteFrame(writer, frame);

исключения уже не появляются.

Как объявление переменных, которые нигде потом и не используются, может приводить к таким последствиям? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×