在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的原型来说,它们也不够用。例如,不可能列出链接到 PC 的所有摄像机,也没有快速调整摄像机参数的方法来。或者,您可以使用 PyGame 或相机制造商提供的 SDK(如果可用)。VideoCapture
在与相机交互的Windows中,通常使用DirectShow。它的主要优势是:
- 几乎任何相机都提供了一个驱动程序,允许它从 .
DirectShow
- 这是一项成熟且广泛使用的技术。
- 它基于 COM 框架,因此设计为从不同的编程语言使用。
相反,这是一项相当古老的技术,正在被Windows Media Foundation所取代,Microsoft不再开发它。但这没什么大不了的,因为它具有所需的所有功能,并且用于许多应用程序,以至于(在我看来),Microsoft 将长期保持它可用。
在这里,我想提出一个完全用 Python 编写的简单应用程序,它允许您使用 、在屏幕上显示它们并使用 OpenCV 对它们进行简单的处理。该应用程序基于一个类,该类公开了某些功能,并且可以在其他应用程序中重用。该代码设计为易于更改和扩展。DirectShow
DirectShow
使用应用程序
- 请确保安装了以下 Python 包:
numpy
matplotlib
opencv-python
comtypes
- 运行 main.py。
- 启动应用程序后,将显示对话框“选择视频设备”。选择一个摄像机,然后按下确定。
- 将显示一个允许您选择相机分辨率的屏幕。选择所需的分辨率或保留默认值,然后按确定。
- 摄像机直播显示在屏幕的左侧。
- 按 Grab 卡普照片,照片将显示在屏幕右侧。您可以使用屏幕右侧的按钮对照片应用一些滤镜,或按保存保存图片。
在 Windows 10 上,如果文本大小已设置为不同于 100% 的值(在 Windows 的“显示设置”屏幕上),则相机的实时图像可能在包含的帧上显示未完全对齐。这似乎是DirectShow的问题,因为我在其他应用程序上也有相同的行为。
简言之DirectShow
DirectShow
是编写多媒体应用程序的框架。应用程序的构建基块是一个筛选器,一个执行基本操作的对象,例如:DirectShow
- 从相机或文件中读取音频\视频
- 将音频\视频从一种格式转换为另一种格式
- 将音频\视频渲染到屏幕或文件
滤波器可以具有输入和输出引脚,并且可以将它们连接在一起以执行所需的工作
DirectShow
提供一个名为 Filter Graph 的对象,该对象负责收集、链接和运行过滤器。
对于我们的应用程序,我们需要以下过滤器:
- 相机源过滤器,用于读取相机中的图像
- 一个过滤器,允许我们对相机提供的每个帧进行一些操作
SampleGrabber
- 在 GUI 上显示摄像机实时流的视频渲染过滤器