2012-04-11 2 views
2

Я работаю над интерфейсом C++ для захвата изображений со всех типов веб-камер через Micrsoft Media Foundation. У меня уже есть немного кода, который может подключаться к нескольким типам веб-камер и способен записывать изображения в разных разрешениях и форматах.Интерфейс веб-камеры Microsoft Media Foundation

Я знаю, что под WinXP можно изменять различные параметры веб-камеры (например, баланс белого, время экспозиции, например), используя библиотеку Direct Show. К сожалению, интерфейс в библиотеке Direct Show, позволяющий легко захватывать отдельные кадры с веб-камеры, удаляется из Direct Show под Win7. Кто-нибудь знает, как я могу использовать эти параметры с помощью Microsoft Media Foundation или любой другой библиотеки, которую я могу объединить с Microsoft Media Foundation?

ответ

0

DirectShow по-прежнему хорош в Windows 7 (проще всего использовать GraphEdit и AMCap из Windows SDK). Однако Media Foundation не имеет существенной поддержки в более ранних версиях Windows.

+0

Я пришел сюда с тем же вопросом, что и OP (контрольная камера в моей программе MF), и ваш ответ в основном «вы должны использовать DirectShow». Неприемлемо, поэтому -1 из меня – YePhIcK

+0

@YePhIcK: «Вы должны использовать DirectShow», если хотите остаться с документальной функциональностью - да, ответ по-прежнему остается в хорошем состоянии. –

+0

Я не буду спорить, поскольку я использую код из ответа, который я разместил ниже, и он работает как ожидалось. Не нужно возиться с графиком или фильтрами (все под капотом). Мой код выглядит * просто *, как обычный MF-код, при этом DirectShow не посыпается, чтобы вызвать путаницу. – YePhIcK

0

IAMCameraControl и IANVideoProcAmp по-прежнему поддерживают баланс белого, панорамирование, увеличение в Windows 8. Управление камерой пока не является частью MFT. Мы должны использовать Direct Show для выполнения этих задач.

2

С помощью WMF можно вызвать метод QueryInterface DirectShow. Пример кода указан в Windows Media Foundation: Controlling Camera Properties. Это должно позволить вам установить доступные параметры камеры, как фокус и баланс белого и т.д.

HRESULT CMFVideoCaptureDlg::SetupCamera(IMFMediaSource* pCameraSource) { 
    CComQIPtr<IAMCameraControl> spCameraControl(pCameraSource); 
    HRESULT hr = S_OK; 
    if(spCameraControl) { 
     long min, max, step, def, control; 
     hr = spCameraControl->GetRange(CameraControl_Exposure, &min, &max, &step, &def, &control); 
     if(SUCCEEDED(hr)) 
      hr = spCameraControl->Set(CameraControl_Exposure, 1, CameraControl_Flags_Manual); 
    } 
    CComQIPtr<IAMVideoProcAmp> spVideo(pCameraSource); 
    if(spVideo) 
     hr = spVideo->Set(VideoProcAmp_WhiteBalance, 0, VideoProcAmp_Flags_Auto); 
    return hr; 
} 

Оказывается Media Foundation не определяет каких-либо конкретных интерфейсов для выполнения этих задач. Как ни странно, он реализует интерфейсы, определенные его предшественник, DirectShow, на его медиа-источника (представлен интерфейс IMFMediaSource), когда этот источник медиа-видео камера,

+0

Не могли бы вы скопировать-вставить наиболее подходящую деталь сюда? Код/ссылка недоступна ATM (дает HTTP 500) :( – YePhIcK

0

This article имеет следующий код и он работает как Шарм!


HRESULT CMFVideoCaptureDlg::SetupCamera(IMFMediaSource* pCameraSource) { 
    CComQIPtr spCameraControl(pCameraSource); 
    HRESULT hr = S_OK; 
    if(spCameraControl) { 
     long min, max, step, def, control; 
     hr = spCameraControl->GetRange(CameraControl_Exposure, &min, &max, &step, &def, &control); 
     if(SUCCEEDED(hr)) 
      hr = spCameraControl->Set(CameraControl_Exposure, 1, CameraControl_Flags_Manual); 
    } 
    CComQIPtr spVideo(pCameraSource); 
    if(spVideo) 
     hr = spVideo->Set(VideoProcAmp_WhiteBalance, 0, VideoProcAmp_Flags_Auto); 
    return hr; 
} 
Смежные вопросы