2012-04-11 99 views
2

我一直在研究C++接口,通过Micrsoft媒体基金会从所有类型的网络摄像头捕捉图像。我已经有了一些代码,可以连接几种类型的网络摄像头,并能够以不同的分辨率和格式捕捉图像。微软媒体基金会网络摄像头接口

我知道在WinXP下可以通过使用直接显示库来改变摄像头的不同参数(如白平衡,曝光时间等)。不幸的是,直接显示库中的接口使得从网络摄像头中轻松捕获单帧成为可能。有人知道我可以如何使用Microsoft Media Foundation或其他任何可以与Microsoft Media Foundation结合的库来访问这些参数吗?

回答

0

DirectShow在Windows 7中仍然不错(最简单的检查方法是使用Windows SDK中的GraphEditAMCap)。但媒体基金会在Windows的早期版本中缺少必要的支持。

+0

我来到这里(在我的MF程序控制摄像头)完全相同的问题,如OP和你的回答基本上是“你应该使用的DirectShow”。我无法接受如此-1我从 – YePhIcK 2017-03-04 04:36:35

+0

@YePhIcK:“你应该使用DirectShow”,如果你想留下记录的功能 - 是的答案仍然是良好的立场截至目前。 – 2017-03-04 07:56:01

+0

我不打算争论,因为我使用下面发布的答案中的代码,它按预期工作。无需摆弄图形或过滤器(这一切都在引擎盖下)。我的代码看起来就像一个普通的MF代码,没有DirectShow会引起混乱。 – YePhIcK 2017-03-04 08:05:28

0

IAMCameraControl和IANVideoProcAmp仍然支持Windows 8中的白平衡,平移,缩放。相机控制至今不是MFT的一部分。我们必须使用Direct Show来执行这些操作。

2

可以从WMF调用DirectShow QueryInterface方法。示例代码在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; 
} 

原来媒体基金会并没有为这些任务的任何特定的接口 。奇怪的是,它实现通过 定义的接口它的前身,DirectShow的,在它的媒体源(由 IMFMediaSource接口表示),当媒体源是摄像机

+0

你能复制粘贴最相关的作品到这里吗?代码/链接不可访问ATM(提供HTTP 500):( – YePhIcK 2017-03-04 04:34:56

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; 
}