Python 显示 OpenCV 视频 Windows 10 正确的设备名称

Python Display OpenCV Video Windows 10 With Correct Device Name

如何向 OpenCV 提供正确的设备名称以在 Windows 10 上使用 Python 显示视频? Windows 10 上的摄像头设备如何在Python 中被枚举?

以下 Python 代码可以很好地在 Ubuntu 上显示视频,但在 Windows 10 上显示失败,如下所述:

#!/usr/bin/env python
# show_video.py # Open and play a video using OpenCV 4 and Python 3.
# see https://docs.opencv.org/3.4.1/dd/d43/tutorial_py_video_display.html

import sys
import cv2 as cv

dev_name = sys.argv[1] if len(sys.argv) > 1 else '/dev/video0'
window_name = dev_name + ' OpenCV ' + cv.__version__ + ' python ' + sys.version

print('opening '  + window_name)
cap = cv.VideoCapture(dev_name)

if not cap.isOpened():
    print('error: unable to open:', dev_name)
    sys.exit(0)

k = 0
ret, frame = cap.read() # Capture frame-by-frame
while cap.isOpened() and ret and k!=27 and k!=ord('q'):
    # Display the resulting frame
    cv.imshow(window_name, frame)

    k = cv.waitKey(30) & 0xff # press <esc> or 'q' to quit
    ret, frame = cap.read()

# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

我想从 cmd 行 运行 应用程序,但是

python show_video.py /dev/video0

不起作用,因为 /dev/video0 在 Windows 中不存在。

我尝试 枚举设备。它适用于 C++,我不知道如何将其翻译成 Python。我系统上的输出是:

Integrated Webcam
Device path: \?\usb#vid_0bda&pid_58c2&mi_00#6&f4034f5&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
Microphone (Realtek Audio)
WaveIn ID: 0

我尝试了以下方法来显示来自 Windows 10 cmd 的视频:

python show_video.py "\?\usb#vid_0bda&pid_58c2&mi_00#6&f4034f5&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"

输出:

opening \?\usb#vid_0bda&pid_58c2&mi_00#6&f4034f5&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global OpenCV 3.4.1 python 3.6.6 |Anaconda custom (64-bit)| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:834)
warning: \?\usb#vid_0bda&pid_58c2&mi_00#6&f4034f5&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:835)
error: unable to open: \?\usb#vid_0bda&pid_58c2&mi_00#6&f4034f5&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global

我也尝试了 python show_video.py "\\?\usb#vid_0bda&pid_58c2&mi_00#6&f4034f5&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"python show_video.py "Integrated Webcam" 并得到了类似的错误。

我正在使用 OpenCV 3.4.1 和 Python 3.6.6.

if (args.image=="webcam0"):
    cap = cv.VideoCapture(0)
else:
    cap = cv.VideoCapture(args.image)

据我所知,OpenCV 不提供此类功能。要获取连接设备的名称,您需要降低并使用 DirectShow 或 WMF API 获取设备枚举列表。所以这不能用纯 python.

来完成

我看到有一个 already made cpython module 可以实现你想要的。你可以试试看。

这里有一个很好的 post 可以帮助你做你想做的事,但不能用 OpenCV。