OpenCV предоставляет замечательную возможность не только просматривать видео, но так же и сохранять его в файл.
Для этого необходимо сначала инициализировать структуру редактора с помощью функции cvCreateVideoWriter(), в качестве параметров которой передаются название файла для сохранения видео, четырёх-буквенный код видео-кодека, размер кадра и частоту кадров.
Далее при получении кадра с камеры или очередной картинки из набора изображений — он записывается в файл с помощью функции cvWriteFrame(). И в конце — нужно не забыть освободить редактор функцией cvReleaseVideoWriter().
fps — астота кадров созданного видео потока
frame_size — размер кадра
is_color — определяет сохранять цветное изображение (1) или в градациях серого(0) (пока только под Windows)
Как я понял, она должна определять действительную частоту кадров (с fps=15 записанное видео у меня получается ускоренным).
Но после этого стало появляться исключение при инициализации редактора.
Вот такой printf:
printf(" fps: %f\n", fps);
сообщает
fps: 0.000000
Значит я неправильно вызываю cvGetCaptureProperty?
Не подскажете, как ей пользоваться правильно?
Господа, как решить проблему — видеофайл создается, имеет адекватный размер, но не проигрывается никакими плеерами (выдается ошибка — типа недопустимая операция). Пробовал указывать разные кодеки.
Во время записи видео пишется что-то типа такого: «compiler did not align stack variables...» и т.д. что компилятор не может скомпилить libavcodec и это проблема компилятора, а не кодека.
Подскажите, как решить проблему?
компилятор: VS2008, OpenCV 1.1 (так же пробовал с 1.0), OS Win7x64.
думаю, стоит попробовать более свежую версию библиотеки ;)
на данный момент — это 2.2 (в сборе она идёт под 2010-ю студию и чтобы заставить работать её под 2008-й её нужно пересобрать), но можете попробовать и 2.1
сам столкнулся с этой проблемой :(
OpenCV 2.1 при попытке записи видео выпадает ошибка:
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler. You may try recompiling using gcc >= 4.2
примечательно, что в OpenCV 2.0 запись отрабатывает на ура :)
Не получается сохранить видео.
Вчера скопипастил пример, запускаю
OpenCV Error: Unsupported format or combination of formats (cvWriteFrame() needs images with depth = IPL_DEPTH_8U and nChannels = 1.) in CvVideoWriter_FFMPEG::writerFrame, file /home/nefka/Загрузки/opencv/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp, line 1076
terminate called after throwing an instance of 'cv::Exception'
what(): /home/nefka/Загрузки/opencv/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp:1076: error: (-210) cvWriteFrame() needs images with depth = IPL_DEPTH_8U and nChannels = 1. in function CvVideoWriter_FFMPEG::writerFrame
Если делать, как написал Nefka 1 июня 2011, всё работает… НО!!!
В этом примере: CvCapture *var =…
А во всех предыдущих: CvCapture* var =…
Разница лишь в том, где * стоит после CvCapture, IplImage, char* и т д. Но если в этом примере
все CvCapture *, IplImage * и пр. изменить на CvCapture*, IplImage* и пр., уже ничего не работает, и вылазит ошибка
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler...,
уже упомянутая выше.
Win7 64
OpenCV 2.1
Я просто места себе не могу найти — никак не понимаю, ПОЧЕМУ оно так ((((((
Работаю в Xcode 5.0
Система Macintosh Маверик (OS X 10.9.2)
Вылетает ошибка
OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor, file /Users/maksim/Downloads/opencv/modules/imgproc/src/color.cpp, line 4422
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/maksim/Downloads/opencv/modules/imgproc/src/color.cpp:4422: error: (-215) dst.data == dst0.data in function cvCvtColor
подскажите, какими средствами можно выдать поток сделанный в opencv в виде стрима наружу. любой вариант подойдет.
смысл. на raspberry обработал opencv изображение, а как выдать на веб сервер понять не могу. хотя бы направление подскажите.
например на вход GStreamer как можно из opencv подать. или как проще можно
Вероятно, самым простым способом будет передавать картинку в формате MJPEG (Motion JPEG) — это когда, каждый кадр представляет собой изображение в формате JPEG.
Для сжатия можно использовать cvEncodeImage(), а далее просто
открываем серверный сокет и подключившимся клиентам отдаём заголовок и картинку.
За основу можно взять тот же MJPG-streamer, написанный на C.
PS вопросы, напрямую не относящиеся к теме топиков лучше задавать на форуме.
Все работает хорошо(debian 8 qt). Пишет 640х480 (avi). А что надо сделать, чтобы писало в 1280х720? просто поставить cvSize(1280, 720) не записывает(создает файл, но не пишет).
Комментарии (17)
RSS свернуть / развернутьMur
Попробовал раскомментировать строку
Как я понял, она должна определять действительную частоту кадров (с fps=15 записанное видео у меня получается ускоренным).
Но после этого стало появляться исключение при инициализации редактора.
Вот такой printf:
сообщает
Значит я неправильно вызываю cvGetCaptureProperty?
Не подскажете, как ей пользоваться правильно?
Storm
noonv
Во время записи видео пишется что-то типа такого: «compiler did not align stack variables...» и т.д. что компилятор не может скомпилить libavcodec и это проблема компилятора, а не кодека.
Подскажите, как решить проблему?
компилятор: VS2008, OpenCV 1.1 (так же пробовал с 1.0), OS Win7x64.
jimm88
на данный момент — это 2.2 (в сборе она идёт под 2010-ю студию и чтобы заставить работать её под 2008-й её нужно пересобрать), но можете попробовать и
noonv
OpenCV 2.1 при попытке записи видео выпадает
примечательно, что в OpenCV 2.0 запись отрабатывает на ура :)
noonv
Вчера скопипастил пример, запускаю
менял на не помогает.
Пересобрал ffmpeg и opencv, не помогло. ОС Ubuntu 10.04.
если закомментировать строку
и увеличить cvWaitKey() с 1 до 33, как впредыдущем прмимере, то видео показывает.
Nefka
Nefka
noonv
ns5d
Если делать, как написал Nefka 1 июня 2011, всё работает… НО!!!
В этом примере: CvCapture *var =…
А во всех предыдущих: CvCapture* var =…
Разница лишь в том, где * стоит после CvCapture, IplImage, char* и т д. Но если в этом примере
все CvCapture *, IplImage * и пр. изменить на CvCapture*, IplImage* и пр., уже ничего не работает, и вылазит ошибка
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler...,
уже упомянутая выше.
Win7 64
OpenCV 2.1
Я просто места себе не могу найти — никак не понимаю, ПОЧЕМУ оно так ((((((
Заранее спасибо
romik9999
и три варианта ответа: прервать, повтор, пропустить
если пропустить то картинка с камеры есть но не идет запись
brutalis
Система Macintosh Маверик (OS X 10.9.2)
Вылетает ошибка
OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor, file /Users/maksim/Downloads/opencv/modules/imgproc/src/color.cpp, line 4422
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/maksim/Downloads/opencv/modules/imgproc/src/color.cpp:4422: error: (-215) dst.data == dst0.data in function cvCvtColor
На строчке
cvWriteFrame(writer, frame);
Менял writer как сказал Mur — не помогло
Maxon
смысл. на raspberry обработал opencv изображение, а как выдать на веб сервер понять не могу. хотя бы направление подскажите.
например на вход GStreamer как можно из opencv подать. или как проще можно
businka76
Для сжатия можно использовать
открываем серверный сокет и подключившимся клиентам отдаём заголовок и картинку.
За основу можно взять тот же MJPG-streamer, написанный на C.
PS вопросы, напрямую не относящиеся к теме топиков лучше задавать на
noonv
businka76
ilya0606
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.