2010-06-05 4 views
1

Как и в моих предыдущих вопросах, я пытаюсь создать простой трекер для глаз. Решил начать с версии Linux (запустите Ubuntu).Синхронизация screencasting (ffmpeg) и захват с веб-камеры (OpenCV)

Чтобы выполнить эту задачу, необходимо организовать скринкастинг и захват веб-камеры таким образом, чтобы кадры из обоих потоков точно совпадали друг с другом и в каждом из них было одинаковое количество кадров.

Screencasting fps полностью зависит от fps камеры, поэтому каждый раз, когда мы получаем изображение с веб-камеры, мы можем потенциально захватить рамку экрана и оставаться счастливой. Тем не менее, все инструменты быстрого screencasting, например ffmpeg, возвращают файл .avi в качестве результата и требуют уже известных fps.

С другой стороны, для таких инструментов, как Java + Robot или ImageMagick, требуется около 20 мс, чтобы вернуть снимок .jpg, что довольно медленно для задачи. Но они могут быть запрошены сразу после каждого захвата кадра веб-камеры и обеспечения необходимой синхронизации.

Так подвопросы являются:

  1. Изменяется ли частота кадров USD камеры во время одной сессии?
  2. Есть ли какие-либо инструменты, которые обеспечивают быструю скринкастизацию кадр за кадром?
  3. Есть ли способ сделать ffmpeg нажимать новый кадр на файл .avi только тогда, когда программа инициирует этот запрос?

Для моей задачи я могу либо использовать C++, либо Java.

Я, на самом деле, дизайнер интерфейса, а не программист-драйвер, и эта задача выглядит довольно низкоуровневой. Я был бы благодарен за любое предложение и подсказку!

+0

Вы имеете в виду (кадров в секунду), а не FSP, правильно? – metaliving

+0

Конечно, спасибо! :) – lyuba

+0

И USB вместо доллара США? –

ответ

1

Используйте функцию cvGetCaptureProperty(CvCapture* capture, int property_id) от HighGUI от OpenCV с помощью property_id = CV_CAP_PROP_FPS, чтобы определить количество кадров в секунду, захваченных вашей веб-камерой.

Пример использования:

CvCapture *capture = 0; 
double fps = 0.0; 

capture = cvCaptureFromCAM(0); 
fps = cvCaptureProperty(capture, CV_CAP_PROP_FPS); 
+0

Хорошая идея, однако как бы вы порекомендовали организовать одновременное точное совмещение захвата в этом случае? Должен ли я использовать два потока? Или просто инициализировать ffmpeg capturer сразу после получения первого кадра с веб-камеры, и мы знаем fps? Любые предложения приветствуются, спасибо! – lyuba

+0

Не уверен в ffmpeg, но вы можете использовать функцию 'cvCreateVideoWriter()' создать файл .avi с видеопотоком, извлекая в цикле каждый кадр с помощью функции 'cvGrabFrame()' и записывая его в видеофайл с ' cvWriteFrame() '. В том же цикле вы можете извлечь изображение с экрана и записать его в другой видеофайл. Я уверен, что если вы установите FPS вашего screencaster равным камере, вы достигнете синхронизации. – metaliving

+0

Металлизация. Я пробовал ваш метод, но, к сожалению, свойство CV_CAP_PROP_FPS работает только в Windows, как из документации OpenCV. Ошибка: HIGHGUI ERROR: V4L2: получение свойства # 5 не поддерживается. Я работаю под Ubuntu, а также хочу, чтобы мой проект был кросс-платформенным, поэтому нужно искать другой способ его выполнения. Кстати, у вашего кода есть ошибка: там должен быть cvGetCaptureProperty (а не cvCaptureProperty). В любом случае, спасибо за ваши комментарии! – lyuba

Смежные вопросы