acz*_*czh 5 python opencv gstreamer python-gstreamer
我在多个操作系统上用 Python 枚举相机时遇到一些问题。
以下是我尝试过的一些方法:
import cv2 as cv
num = 0
while 1:
cap = cv.VideoCapture(num)
if cap.isOpened():
# working capture
num += 1
else:
break
Run Code Online (Sandbox Code Playgroud)
使用 Opencv 的缺点是 Opencv 不提供任何友好的显示名称。此外,枚举相机的速度很慢,因为您需要实际打开和关闭相机来检查它是否是有效的相机。
我还尝试过使用 PyPylon 和 pyuvc 等库。它们有效,但仅适用于特定品牌。
我对堆栈溢出做了一些研究,有些人建议将 python 的 gstreamer 绑定作为可能的独立于操作系统的解决方案。这是我到目前为止所拥有的。
import pgi
pgi.require_version("Gtk", "3.0")
pgi.require_version("Gst", "1.0")
pgi.require_version("GstVideo", "1.0")
from pgi.repository import Gtk, GObject, Gst, GstVideo
Gst.init("")
dm = Gst.DeviceMonitor()
dm.set_show_all_devices(True)
dm.start()
print("Displaying devices.")
for device in dm.get_devices():
print(device.get_display_name())
print("Displaying providers.")
for provider in dm.get_providers():
print(provider)
dm.stop()
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
Displaying devices.
papalook Microphone
DisplayPort
HDMI
Built-in Output
Built-in Microph
Displaying providers.
osxaudiodeviceprovider
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我没有得到任何网络摄像头,只有音频设备。关于我做错了什么有什么想法吗?我应该采取什么不同的方法?谢谢。
对于 Windows,您可以使用库 pygrabber,它是一个纯 Python 工具,用于从相机捕获照片并使用 DirectShow 和 OpenCV 进行简单的图像处理。它还枚举连接的网络摄像头,如下所示:
from __future__ import print_function
from pygrabber.dshow_graph import FilterGraph
graph = FilterGraph()
print(graph.get_input_devices())
Run Code Online (Sandbox Code Playgroud)
我已经修改了该库以在 Python 2 和 3 下工作。下载地址: https: //github.com/bunkahle/pygrabber
仅适用于 Python 3 的原始源: https ://github.com/andreaschiavinato/python_grabber