crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> вывод видео в OpenCv
larry
  опции профиля:
сообщение 5.5.2011, 11:07
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


Добрый день!Я собрал пример воспроизведения видео, но видео не воспроизводится, отображает серый квадрат и закрывается. Функция 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
  опции профиля:
сообщение 5.5.2011, 13:11
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


поставил паузу после открытия видеофайла и увидел в консоли, что вывело ошибку:
warning: error opening file (C:\User\VP\ocv\opencv\src\highgui\cvcap_ffmpeg.cpp:452)
Непонятно что это за путь, где он ищет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 5.5.2011, 13:53
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Тот код, что вы написали, делает захват видео с камеры/вебки, а не "воспроизводит видео".

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

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

Раскрывающийся текст
#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;
}


Сообщение отредактировал RazrFalcon - 5.5.2011, 14:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
larry
  опции профиля:
сообщение 5.5.2011, 16:43
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


Спасибо, попробую ваш вариант...но я так понял, что может быть проблемы с либой. Там выводит ошибку, что ошибка в cvcap_ffmpeg.cpp в строке 452...а какая у тебя версия opencv?

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


но видео воспроизводит :mellow:
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
larry
  опции профиля:
сообщение 5.5.2011, 17:39
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


Появился вопрос. Дабы не плодить темы, задам его здесь. Скажите пожалуйста, а мне нужно выводить видео в SDL, это возможно? Как преобразовать формат кадра? Спасибо...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 5.5.2011, 21:51
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


opencv использует ffmpeg для воспроизведения видео. Его тоже нужно собрать.
Про SDL не в курсе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 5.5.2011, 22:55
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


ffmpeg использует SDL для воспроизведения видео, в частности, ffplay :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
larry
  опции профиля:
сообщение 6.5.2011, 15:14
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


а не могли бы подсказать, что может быть если программа падает на строке
IplImage *frame = cvQueryFrame(capture);

это стало происходить после подключения SDL. Может проблема в том, что память занимаемая IplImage не освобождается? Хотя первых 4-5 фреймов считывается нормально.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
larry
  опции профиля:
сообщение 6.5.2011, 15:58
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


попробовал освобождать память frame, программа начинает падать на освобождении памяти:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 6.5.2011, 16:43
Сообщение #10


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Насколько мне известно, то у opencv баг с IplImage - утечка памяти. Возможно в этом проблема.
Как вариант: попробовать opencv 2.2.0, но там переписывать, скорее всего, много. Так как ее реструктурировали.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 10:35