directshow 类 显示图像
时间: 2025-01-06 10:46:03 浏览: 2
### 使用 DirectShow 类显示图像
为了实现通过 DirectShow 显示图像的功能,通常会构建一个过滤图 (Filter Graph),并将其配置为连接摄像头设备和其他必要的滤镜来处理和呈现视频流。下面是一个基于 `dshow_graph.py` 文件中的类实例化对象,并设置其属性以捕获来自摄像机的数据并展示的方法。
#### 创建 FilterGraph 实例
首先创建一个新的 FilterGraph 对象:
```python
from dshow_graph import FilterGraph # 假设这是自定义模块的位置
graph = FilterGraph()
```
此部分代码初始化了一个新的图形管理器,它负责管理和协调整个数据传输过程[^1]。
#### 构建过滤链路
接着要做的就是向这个图表里添加合适的源滤波器(Source Filters),比如代表物理硬件的 Video Input Device 滤波器,以及渲染目标 Renderers:
```python
import win32com.client as wc
# 获取系统中存在的所有视频输入设备列表
devices = graph.get_input_devices()
if devices:
device_name, device_path = devices[0] # 默认选择第一个可用设备
# 添加视频捕捉设备到过滤图中
source_filter = graph.add_source_filter(device_path)
sample_grabber = graph.add_sample_grabber() # 如果需要抓取帧的话
null_renderer = graph.add_null_render() # 或者使用 Null Renderer 来丢弃不需要的画面输出
# 连接各组件形成完整的路径
graph.connect(source_filter, sample_grabber)
graph.connect(sample_grabber, null_renderer)
else:
raise Exception('No video input devices found.')
```
上述脚本尝试获取计算机上安装的第一个视频采集装置,并建立一条从该装置经过 Sample Grabber 到 Null Renderer 的简单管线;Sample Grabber 可用于截取特定时刻的画面以便进一步分析或保存,而 Null Renderer 则是用来测试目的——当不希望实际看到任何视觉反馈时可以采用这种方式。
对于想要真正显示出画面的情况,则应当替换掉最后一步使用的 NullRenderer 成 ImageRender 或 VideoWindow 控件之一来进行可视化操作:
```python
video_window = graph.add_video_window() # 替代方案一:Video Window
image_renderer = graph.add_image_renderer() # 替代方案二:Image Renderer
graph.connect(sample_grabber, image_renderer) # 将样本抓手链接至选定渲染方式
```
这段逻辑修改了之前版本里的终点节点,使得最终能够将捕获到的内容呈现在屏幕上而不是被忽略掉。这里提供了两种不同的方法来做这件事 —— 一种是利用 Windows Media Player 组件提供的窗口控件 (`VideoWindow`) ,另一种则是更底层一点的选择 (`ImageRenderer`) 。具体选用哪一个取决于应用场景和个人偏好。
#### 启动预览/回放
完成以上准备工作之后就可以启动媒体流了:
```python
media_control = graph.get_media_control()
media_control.run()
```
这行命令激活了整个管道的工作流程,从而实现了实时查看由所选摄像头传来的影像资料的目的。
阅读全文