使用 Python 和 DirectShow 从相机捕获图像

发布于:2024-04-28 ⋅ 阅读:(30) ⋅ 点赞:(0)

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的原型来说,它们也不够用。例如,不可能列出链接到 PC 的所有摄像机,也没有快速调整摄像机参数的方法来。或者,您可以使用 PyGame 或相机制造商提供的 SDK(如果可用)。VideoCapture

在与相机交互的Windows中,通常使用DirectShow。它的主要优势是:

  • 几乎任何相机都提供了一个驱动程序,允许它从 .DirectShow
  • 这是一项成熟且广泛使用的技术。
  • 它基于 COM 框架,因此设计为从不同的编程语言使用。

相反,这是一项相当古老的技术,正在被Windows Media Foundation所取代,Microsoft不再开发它。但这没什么大不了的,因为它具有所需的所有功能,并且用于许多应用程序,以至于(在我看来),Microsoft 将长期保持它可用。

在这里,我想提出一个完全用 Python 编写的简单应用程序,它允许您使用 、在屏幕上显示它们并使用 OpenCV 对它们进行简单的处理。该应用程序基于一个类,该类公开了某些功能,并且可以在其他应用程序中重用。该代码设计为易于更改和扩展。DirectShowDirectShow

使用应用程序

  1. 请确保安装了以下 Python 包:numpymatplotlibopencv-pythoncomtypes
  2. 运行 main.py
  3. 启动应用程序后,将显示对话框“选择视频设备”。选择一个摄像机,然后按下确定

Image 1

  1. 将显示一个允许您选择相机分辨率的屏幕。选择所需的分辨率或保留默认值,然后按确定。
  2. 摄像机直播显示在屏幕的左侧。
  3. 按 Grab 卡普照片,照片将显示在屏幕右侧。您可以使用屏幕右侧的按钮对照片应用一些滤镜,或按保存保存图片。

在 Windows 10 上,如果文本大小已设置为不同于 100% 的值(在 Windows 的“显示设置”屏幕上),则相机的实时图像可能在包含的帧上显示未完全对齐。这似乎是DirectShow的问题,因为我在其他应用程序上也有相同的行为。

简言之DirectShow

DirectShow是编写多媒体应用程序的框架。应用程序的构建基块是一个筛选器,一个执行基本操作的对象,例如:DirectShow

  • 从相机或文件中读取音频\视频
  • 将音频\视频从一种格式转换为另一种格式
  • 将音频\视频渲染到屏幕或文件

滤波器可以具有输入和输出引脚,并且可以将它们连接在一起以执行所需的工作

DirectShow提供一个名为 Filter Graph 的对象,该对象负责收集、链接和运行过滤器。

对于我们的应用程序,我们需要以下过滤器:

  • 相机源过滤器,用于读取相机中的图像
  • 一个过滤器,允许我们对相机提供的每个帧进行一些操作SampleGrabber
  • 在 GUI 上显示摄像机实时流的视频渲染过滤器


网站公告

今日签到

点亮在社区的每一天
去签到