2012-04-11 100 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; 
}