如何显示视频捕获过滤器对话框(相机设置,如亮度、曝光)?
How to show Video capture Filter dialog (camera settings like brightness, exposure)?
我正在做一个基于 windows 的应用程序,我在其中使用相机。我想允许用户更改相机设置 (VfwCaptureDialog_Source),因为它在 Skype 或 amcap 应用程序中很常见。现在,我发现该对话框来自 vfw,可以从 dshow api 激活它。当我从 AmCap 执行此操作时,它正在运行。你能帮我让这段代码适用于给定的网络摄像头吗(需要多摄像头支持)?我在使用相机时使用 Qt 和 OpenCV。在 opencv 中,仅相机索引用于 select 适当的相机。该索引来自 Qt,我在哪里可以获得很好的相机名称列表。我从这段代码中得到的错误是 1170 :"The property set specified does not exist on the object"
//libs -lDxva2 -lstrmiids -lvfw32 -lole32 -loleaut32
#include <Windows.h>
#include "strmif.h"
#include "dshow.h"
#include "Vfw.h"
...
HRESULT hr ;
IGraphBuilder* graph= nullptr;
hr = CoCreateInstance( CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph );
IMediaControl* ctrl = nullptr;
hr = graph->QueryInterface( IID_IMediaControl, (void **)&ctrl );
IMediaEventEx* mediaEvent=nullptr;
hr = graph->QueryInterface(IID_IMediaEvent, (LPVOID *) &mediaEvent);
ICreateDevEnum* devs = nullptr;
hr = CoCreateInstance (CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &devs);
IEnumMoniker* cams = nullptr;
hr = devs?devs->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &cams, 0):0;
IMoniker* mon = nullptr;
hr = cams?cams->Next (1, &mon, nullptr):0;
IBaseFilter* cam = nullptr;
hr = mon?mon->BindToObject(nullptr,nullptr,IID_IBaseFilter, (void**)&cam):0;
IEnumPins* pins = nullptr;
hr = cam?cam->EnumPins(&pins):0;
IPin* cap = nullptr;
hr = pins?pins->Next(1,&cap, nullptr):0;
IAMVfwCaptureDialogs *pVfw = nullptr;
hr = cap->QueryInterface(IID_IAMVfwCaptureDialogs, (void**)&pVfw);
if (SUCCEEDED(hr))
{
// Check if the device supports this dialog box.
if (S_OK == pVfw->HasDialog(VfwCaptureDialog_Source))
{
// Show the dialog box.
hr = pVfw->ShowDialog(VfwCaptureDialog_Source, HWND(this->winId()));
}
}
else
{
error("cap->QueryInterface");
}
首先,你跳过了一个非常重要的部分。在您的 Qt/OpenCV 应用程序中,使用的 API 是什么以及给定的网络摄像头到底有什么。如果是 Windows 的视频,那么您应该在对话框界面上查看 VFW API。如果是DirectShow那你基本上对VFW对话框不感兴趣
假设您通过 DirectShow 与相机交互(好吧,使用 VFW 没有多大意义,尤其是对于多个相机)。然后我怀疑 AMCap 是否使用了您在问题中提到的代码路径。注意 AMCap 来源评论:
// we use this interface to bring up the 3 dialogs
// NOTE: Only the VfW capture filter supports this. This app only brings
// up dialogs for legacy VfW capture drivers, since only those have dialogs
hr = gcap.pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, gcap.pVCap,
IID_IAMVfwCaptureDialogs, (void **)&gcap.pDlg);
使用 DirectShow,您通常会弹出带有 ISpecifyPropertyPages
和 OleCreatePropertyFrame
的配置界面。 AMCap也有相关代码:
else if(id - MENU_DIALOG0 == gcap.iVCapDialogPos)
{
ISpecifyPropertyPages *pSpec;
CAUUID cauuid;
hr = gcap.pVCap->QueryInterface(IID_ISpecifyPropertyPages,
(void **)&pSpec);
if(hr == S_OK)
{
hr = pSpec->GetPages(&cauuid);
hr = OleCreatePropertyFrame(ghwndApp, 30, 30, NULL, 1,
(IUnknown **)&gcap.pVCap, cauuid.cElems,
(GUID *)cauuid.pElems, 0, 0, NULL);
CoTaskMemFree(cauuid.pElems);
pSpec->Release();
}
}
MSDN 上的 Displaying a Filter's Property Pages 应该对您有更多帮助(您在问题的代码片段中已经有 IBaseFilter
接口指针)。
我正在做一个基于 windows 的应用程序,我在其中使用相机。我想允许用户更改相机设置 (VfwCaptureDialog_Source),因为它在 Skype 或 amcap 应用程序中很常见。现在,我发现该对话框来自 vfw,可以从 dshow api 激活它。当我从 AmCap 执行此操作时,它正在运行。你能帮我让这段代码适用于给定的网络摄像头吗(需要多摄像头支持)?我在使用相机时使用 Qt 和 OpenCV。在 opencv 中,仅相机索引用于 select 适当的相机。该索引来自 Qt,我在哪里可以获得很好的相机名称列表。我从这段代码中得到的错误是 1170 :"The property set specified does not exist on the object"
//libs -lDxva2 -lstrmiids -lvfw32 -lole32 -loleaut32
#include <Windows.h>
#include "strmif.h"
#include "dshow.h"
#include "Vfw.h"
...
HRESULT hr ;
IGraphBuilder* graph= nullptr;
hr = CoCreateInstance( CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph );
IMediaControl* ctrl = nullptr;
hr = graph->QueryInterface( IID_IMediaControl, (void **)&ctrl );
IMediaEventEx* mediaEvent=nullptr;
hr = graph->QueryInterface(IID_IMediaEvent, (LPVOID *) &mediaEvent);
ICreateDevEnum* devs = nullptr;
hr = CoCreateInstance (CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &devs);
IEnumMoniker* cams = nullptr;
hr = devs?devs->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &cams, 0):0;
IMoniker* mon = nullptr;
hr = cams?cams->Next (1, &mon, nullptr):0;
IBaseFilter* cam = nullptr;
hr = mon?mon->BindToObject(nullptr,nullptr,IID_IBaseFilter, (void**)&cam):0;
IEnumPins* pins = nullptr;
hr = cam?cam->EnumPins(&pins):0;
IPin* cap = nullptr;
hr = pins?pins->Next(1,&cap, nullptr):0;
IAMVfwCaptureDialogs *pVfw = nullptr;
hr = cap->QueryInterface(IID_IAMVfwCaptureDialogs, (void**)&pVfw);
if (SUCCEEDED(hr))
{
// Check if the device supports this dialog box.
if (S_OK == pVfw->HasDialog(VfwCaptureDialog_Source))
{
// Show the dialog box.
hr = pVfw->ShowDialog(VfwCaptureDialog_Source, HWND(this->winId()));
}
}
else
{
error("cap->QueryInterface");
}
首先,你跳过了一个非常重要的部分。在您的 Qt/OpenCV 应用程序中,使用的 API 是什么以及给定的网络摄像头到底有什么。如果是 Windows 的视频,那么您应该在对话框界面上查看 VFW API。如果是DirectShow那你基本上对VFW对话框不感兴趣
假设您通过 DirectShow 与相机交互(好吧,使用 VFW 没有多大意义,尤其是对于多个相机)。然后我怀疑 AMCap 是否使用了您在问题中提到的代码路径。注意 AMCap 来源评论:
// we use this interface to bring up the 3 dialogs
// NOTE: Only the VfW capture filter supports this. This app only brings
// up dialogs for legacy VfW capture drivers, since only those have dialogs
hr = gcap.pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, gcap.pVCap,
IID_IAMVfwCaptureDialogs, (void **)&gcap.pDlg);
使用 DirectShow,您通常会弹出带有 ISpecifyPropertyPages
和 OleCreatePropertyFrame
的配置界面。 AMCap也有相关代码:
else if(id - MENU_DIALOG0 == gcap.iVCapDialogPos)
{
ISpecifyPropertyPages *pSpec;
CAUUID cauuid;
hr = gcap.pVCap->QueryInterface(IID_ISpecifyPropertyPages,
(void **)&pSpec);
if(hr == S_OK)
{
hr = pSpec->GetPages(&cauuid);
hr = OleCreatePropertyFrame(ghwndApp, 30, 30, NULL, 1,
(IUnknown **)&gcap.pVCap, cauuid.cElems,
(GUID *)cauuid.pElems, 0, 0, NULL);
CoTaskMemFree(cauuid.pElems);
pSpec->Release();
}
}
MSDN 上的 Displaying a Filter's Property Pages 应该对您有更多帮助(您在问题的代码片段中已经有 IBaseFilter
接口指针)。