xianyubbt 发表于 2023-8-26 14:44:01

directshow 摄像头采集Resize Filter过滤器怎么使用

大佬directshow 摄像头采集Resize Filter缩放大小过滤器怎么使用

isdkz 发表于 2023-8-26 14:48:13

要使用DirectShow中的Resize Filter过滤器来缩放摄像头采集的图像大小,您需要按照以下步骤进行操作:

1. 创建一个DirectShow图形,并添加摄像头采集过滤器和Resize Filter过滤器到该图形中。

2. 配置摄像头采集过滤器的输出格式。您可以使用IAMStreamConfig接口来设置摄像头采集过滤器的输出格式,以确保它与Resize Filter过滤器兼容。

3. 配置Resize Filter过滤器的缩放参数。您可以使用ISpecifyPropertyPages接口来获取Resize Filter过滤器的属性页,然后使用IPropertyBag接口来设置缩放参数。通常,您需要设置宽度和高度参数来指定目标图像的大小。

4. 连接摄像头采集过滤器和Resize Filter过滤器。使用ICaptureGraphBuilder2接口的RenderStream方法来连接两个过滤器,并确保它们的输出和输入类型匹配。

5. 运行DirectShow图形并开始采集。使用IMediaControl接口的Run方法来启动图形的运行。

通过按照上述步骤操作,您就可以使用DirectShow中的Resize Filter过滤器来缩放摄像头采集的图像大小了。请注意,具体的代码实现可能会因您使用的编程语言和DirectShow版本而有所不同。

琅琊王朝 发表于 2023-8-26 15:48:43

在DirectShow中,可以使用`IAMVideoProcAmp`接口来实现摄像头采集图像的缩放大小。以下是一个简单的示例代码,展示了如何使用`IAMVideoProcAmp`接口来设置摄像头图像的缩放大小过滤器:

#include <dshow.h>

// 定义宏用于检查DirectShow函数返回值
#define SAFE_RELEASE(x) if (x) { x->Release(); x = NULL; }

void main()
{
    // 初始化COM库
    CoInitialize(NULL);

    // 创建Filter Graph Manager对象
    IGraphBuilder* pGraphBuilder = NULL;
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void)&pGraphBuilder);

    // 创建Capture Filter对象
    ICaptureGraphBuilder2* pCaptureGraphBuilder = NULL;
    CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void)&pCaptureGraphBuilder);
    pCaptureGraphBuilder->SetFiltergraph(pGraphBuilder);

    // 添加摄像头设备到Graph
    IBaseFilter* pCameraFilter = NULL;
    pCaptureGraphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCameraFilter, IID_IBaseFilter, (void)&pCameraFilter);
    pGraphBuilder->AddFilter(pCameraFilter, L"Camera Filter");

    // 获取视频输入流
    IBaseFilter* pVideoInputFilter = NULL;
    pCaptureGraphBuilder->FindInterface(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCameraFilter, IID_IBaseFilter, (void)&pVideoInputFilter);

    // 创建Resize Filter对象
    IBaseFilter* pResizeFilter = NULL;
    CoCreateInstance(CLSID_VideoResizerFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void)&pResizeFilter);
    pGraphBuilder->AddFilter(pResizeFilter, L"Resize Filter");

    // 连接摄像头输出到Resize Filter输入
    pGraphBuilder->ConnectDirect(GetPin(pCameraFilter, PINDIR_OUTPUT), GetPin(pResizeFilter, PINDIR_INPUT), NULL);

    // 设置Resize Filter的缩放大小属性
    IAMVideoProcAmp* pVideoProcAmp = NULL;
    pVideoProcAmp = GetInterfaceFromFilter<IBaseFilter, IAMVideoProcAmp>(pResizeFilter);
    if (pVideoProcAmp)
    {
      // 设置宽度和高度的缩放比例(例如:0.5缩小一半,2.0放大两倍)
      long min, max, step, def, flags;
      pVideoProcAmp->GetRange(VideoProcAmp_Resize, &min, &max, &step, &def, &flags);
      pVideoProcAmp->Set(VideoProcAmp_Resize, 0.5, flags);
    }

    // 渲染Resize Filter的输出
    pCaptureGraphBuilder->RenderStream(NULL, NULL, pResizeFilter, NULL, pGraphBuilder);

    // 启动图形运行
    IMediaControl* pMediaControl = NULL;
    pGraphBuilder->QueryInterface(IID_IMediaControl, (void)&pMediaControl);
    pMediaControl->Run();

    // 等待用户按下任意键停止
    system("pause");

    // 停止图形运行
    pMediaControl->Stop();

    // 释放资源
    SAFE_RELEASE(pGraphBuilder);
    SAFE_RELEASE(pCaptureGraphBuilder);
    SAFE_RELEASE(pCameraFilter);
    SAFE_RELEASE(pVideoInputFilter);
    SAFE_RELEASE(pResizeFilter);
    SAFE_RELEASE(pVideoProcAmp);

    // 反初始化COM库
    CoUninitialize();
}


在上述示例代码中,我们创建了一个Filter Graph Manager对象来构建图形,然后使用`ICaptureGraphBuilder2`接口添加摄像头设备到图中。接着,我们创建了一个Resize Filter对象,并将其添加到图中。最后,通过调用`IAMVideoProcAmp`接口的`Set`方法,设置Resize Filter的缩放大小属性。

请注意,示例代码中使用了一些辅助函数,例如`GetPin`和`GetInterfaceFromFilter`,它们用于获取连接摄像头和Resize Filter的输入/输出引脚以及从Filter中获取特定接口。

希望这能帮助到你理解如何使用DirectShow中的缩放大小过滤器。如果你还有其他问题,请随时提问!
此内容为ChatGPT回答,如果胡说八道,请不要理会
如果对你有帮助,请设置一个最佳答案!
页: [1]
查看完整版本: directshow 摄像头采集Resize Filter过滤器怎么使用