неточность времени веб-камеры, установка времени экспозиции - PullRequest
2 голосов
/ 01 декабря 2010

У меня сложная проблема, я работаю над ней уже несколько недель. Моя программа - это обучающее программное обеспечение, которое использует веб-камеру для анализа физических экспериментов (например, колебательное движение). Я испытал следующее:

  • Если процессор занят, время измерение неточно (ISampleGrabberCB.BufferCB (SampleTime))
  • Если я не использую время, просто посчитай образцы: 0, 1, 2 ... это выглядит лучше. Я чувствую это, когда я смотрю на кривой движения.

Моя основная цель - уменьшить неточность, чего я пытаюсь достичь с ограничением FPS (которое вызывает занятость процессора).

  • Моя веб-камера (ПК Intel Classmate построен в вебкамере) имеет авто фпс и выдержку время. В зависимости от освещения они колеблются.
  • IAMStreamConfig.AvgTimePerFrame не действует.
  • IAMCameraControl не поддерживается веб-камерой.
  • IKsPropertySet: я не знаю, как используйте это, так как у меня нет никаких поддержка веб-камеры. В этом пример, они могут использовать его для Logitech Веб-камера: http://social.msdn.microsoft.com/Forums/en/windowsdirectshowdevelopment/thread/47b1317d-87e6-4121-9189-0defe1e2dd44

1 Ответ

1 голос
/ 01 декабря 2010

из статьи MSDN о Время и часы в DirectShow :

Любой объект, который поддерживает интерфейс IReferenceClock, может служить опорным тактовым сигналом. Фильтр с доступом к аппаратному таймеру может предоставить часы (например, аудио рендерер), или менеджер графиков фильтров может создать часы, использующие системное время.

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

Этот ТАК пост на таймерах высокого разрешения может быть тем, что вам нужно.

IAMStreamConfig.AvgTimePerFrame предназначен для информационных целей, и попытка его настройки не будет иметь никакого эффекта. Это просто значение, из которого вы можете рассчитать среднюю частоту кадров для вашего видеопотока.

, например

VIDEOINFOHEADER* pVih = (VIDEOINFOHEADER*)m_MediaTypes.VideoType.pbFormat;

if( pVih )  
    int nFrameRate = (int)( (double) (10000000.0f / pVih->AvgTimePerFrame) );   
...