鱼C论坛

 找回密码
 立即注册
查看: 900|回复: 2

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

[复制链接]
发表于 2023-8-26 14:44:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大佬directshow 摄像头采集Resize Filter缩放大小过滤器怎么使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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版本而有所不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[b])&pGraphBuilder);    // 创建Capture Filter对象    ICaptureGraphBuilder2* pCaptureGraphBuilder = NULL;    CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void[/b])&pCaptureGraphBuilder);    pCaptureGraphBuilder->SetFiltergraph(pGraphBuilder);    // 添加摄像头设备到Graph    IBaseFilter* pCameraFilter = NULL;    pCaptureGraphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCameraFilter, IID_IBaseFilter, (void[b])&pCameraFilter);    pGraphBuilder->AddFilter(pCameraFilter, L"Camera Filter");    // 获取视频输入流    IBaseFilter* pVideoInputFilter = NULL;    pCaptureGraphBuilder->FindInterface(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCameraFilter, IID_IBaseFilter, (void[/b])&pVideoInputFilter);    // 创建Resize Filter对象    IBaseFilter* pResizeFilter = NULL;    CoCreateInstance(CLSID_VideoResizerFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void[b])&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[/b])&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回答,如果胡说八道,请不要理会
如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表