Ошибка в использовании cvVideoWriter в opencv?

Этот фрагмент кода должен сохранить часть видео, диапазон которого определяется start а также end, Есть массив структур (data[i]), который содержит начальный и конечный кадр видео, снятого в оригинальном видео. Всего 8 выстрелов.

for (int i = 0; i < finalCount-1; ++i) {
    capture = cvCaptureFromAVI("Stats\\Shots\\Cricketc1.avi");
    assert(capture);

    int frame_number = 0;
    int start = data[i].start_frame;
    int end   = data[i].end_frame;

    char shotname[100];
    strcpy_s(shotname, "shot_");
    char shot_id[30];
    _itoa_s(data[i].shot_no, shot_id, 10);
    strcat_s(shotname, shot_id);
    strcat_s(shotname, ".avi");

    IplImage* image = NULL;

    CvVideoWriter* writer = NULL;
    writer = cvCreateVideoWriter (shotname, CV_FOURCC('i','Y','U','V'), fps, cvSize(width, height), 1);
    assert(writer);
    while (frame_number >= start && frame_number < end) {
        image = cvQueryFrame(capture);
        assert(image);
        cvWriteFrame(writer, image);
    }
    cvReleaseImage(&image);
    cvReleaseVideoWriter(&writer);
    cvReleaseCapture(&capture);
    cout << shotname << " saved ..." << endl;
}

После запуска программы создается 8 видеофайлов размером 6 КБ, которые не запускаются. Я пробовал различные кодеки, такие как divx, mjpg, mpg2, iyuv и т. Д., Но все они дают одинаковый результат.

2 ответа

Решение

Если ответ Гюнтера Фокса не поможет попытаться использовать другой кодек - это очень странно, но в моей ситуации iyuv не работает вообще, а некоторые другие кодеки работают нормально, но я не могу прочитать их во время отладки... Для меня - ms видео и радиус cinepak всегда отлично работает (запись и чтение), iyuv не работает вообще, другие коды - запись и чтение, но не во время отладки.

В вашем while петли, frame_number никогда не увеличивается. Поскольку вы говорите, что программа на самом деле выполняется и создает файлы, это ничего не значит в вашем while цикл всегда работает... в противном случае вы застряли бы в бесконечном цикле, потому что frame_number всегда будет 0,

Я бы посоветовал вам инициализировать frame_number в start вместо 0 и нет никаких причин для его существования за пределами цикла, так что for кажется более подходящим:

int start = data[i].start_frame;
int end   = data[i].end_frame;

...

for (int frame_number = start; frame_number < end; frame_number++) {
    image = cvQueryFrame(capture);
    assert(image);
    cvWriteFrame(writer, image);
}
Другие вопросы по тегам