Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вывод видео в OpenCv
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Мультимедиа
larry
Добрый день!Я собрал пример воспроизведения видео, но видео не воспроизводится, отображает серый квадрат и закрывается. Функция cvCreateFileCapture не возвращает указатель на capture. что это может быть? Подскажите пожалуйста...
Вот код примера:
Раскрывающийся текст
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

IplImage* frame = 0;

int main(int argc, char* argv[])
{
        // имя файла задаётся первым параметром
        char* filename = argc == 2 ? argv[1] : "test.avi";

        printf("[i] file: %s\n", filename);
        // окно для отображения картинки
        cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

        // получаем информацию о видео-файле
        CvCapture* capture = cvCreateFileCapture( filename );

        while(1){
                // получаем следующий кадр
                frame = cvQueryFrame( capture );
                if( !frame ) {
                        break;
                }

                // здесь можно вставить
                // процедуру обработки

                // показываем кадр
                cvShowImage( "original", frame );

                char c = cvWaitKey(33);
                if (c == 27) { // если нажата ESC - выходим
                        break;
                }
        }

        // освобождаем ресурсы
        cvReleaseCapture( &capture );
        // удаляем окно
        cvDestroyWindow("original");
        return 0;
}
larry
поставил паузу после открытия видеофайла и увидел в консоли, что вывело ошибку:
warning: error opening file (C:\User\VP\ocv\opencv\src\highgui\cvcap_ffmpeg.cpp:452)
Непонятно что это за путь, где он ищет?
RazrFalcon
Тот код, что вы написали, делает захват видео с камеры/вебки, а не "воспроизводит видео".

Нет, вру, но очень похоже. Там по другому надо. Щяс найду, где то у меня был пример воспроизведения.

Вот мой, рабочий, пример:

Раскрывающийся текст
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <stdlib.h>
#include <stdio.h>

CvCapture *capture;

void trackbarCallback(int pos)
{
    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, pos);
}

int main(int argc, char **argv)
{
    // имя файла задается 1 параметром или “test.avi” по умолчанию
    const char *filename = argc == 2 ? argv[1] : "/media/data/Razr Cut's/Ru.Comix.2.avi";

    // создание окна
    cvNamedWindow("Video Tracking", CV_WINDOW_AUTOSIZE);
    capture = cvCreateFileCapture(filename);

    // число кадров видео-файла
    int frames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);

    int currentPosition = 0;
    if (frames != 0) // показываем ползунок
        cvCreateTrackbar("Position", "Video Tracking", &currentPosition, frames, trackbarCallback);

    while(1)
    {
        // получаем следующий кадр
        IplImage *frame = cvQueryFrame(capture);

        if (!frame)
            break;

       // показываем кадр
       cvShowImage("Video Tracking", frame);

       char c = cvWaitKey(33); // выход при нажатии ESC
       if (c == 27)
           break;
    }

    // освобождаем ресурсы
    cvReleaseCapture(&capture);
    cvDestroyWindow("Video Tracking");
    return 0;
}
larry
Спасибо, попробую ваш вариант...но я так понял, что может быть проблемы с либой. Там выводит ошибку, что ошибка в cvcap_ffmpeg.cpp в строке 452...а какая у тебя версия opencv?

Попробовал, теперь той ошибки не выдает, а пишет


но видео воспроизводит :mellow:
larry
Появился вопрос. Дабы не плодить темы, задам его здесь. Скажите пожалуйста, а мне нужно выводить видео в SDL, это возможно? Как преобразовать формат кадра? Спасибо...
RazrFalcon
opencv использует ffmpeg для воспроизведения видео. Его тоже нужно собрать.
Про SDL не в курсе.
ufna
ffmpeg использует SDL для воспроизведения видео, в частности, ffplay :)
larry
а не могли бы подсказать, что может быть если программа падает на строке
IplImage *frame = cvQueryFrame(capture);

это стало происходить после подключения SDL. Может проблема в том, что память занимаемая IplImage не освобождается? Хотя первых 4-5 фреймов считывается нормально.
larry
попробовал освобождать память frame, программа начинает падать на освобождении памяти:)
RazrFalcon
Насколько мне известно, то у opencv баг с IplImage - утечка памяти. Возможно в этом проблема.
Как вариант: попробовать opencv 2.2.0, но там переписывать, скорее всего, много. Так как ее реструктурировали.
larry
в openсv баг с lplImage только в отладочном режиме, в релизе все работает нормально. Осталось преобразовать lplImage в SDL_Surface.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.