Python 使用正确的设备名称在 Windows 10 中显示 OpenCV 视频

标签 python python-3.x opencv windows-10 video-capture

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

以下 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()

但是我想从命令行运行该应用程序

python show_video.py /dev/video0

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

我试过https://stackoverflow.com/a/4286790枚举设备。它可以在 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“集成网络摄像头”并得到类似的错误。

我使用的是 OpenCV 3.4.1 和 Python 3.6.6。

最佳答案

据我所知,OpenCV 不提供此类功能。要获取连接设备的名称,您需要进一步使用 DirectShow 或 WMF API 来获取设备枚举列表。所以这不能用纯Python来完成。

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

这是一个很好的 post这将帮助你做你想做的事,但不能用 OpenCV。

关于Python 使用正确的设备名称在 Windows 10 中显示 OpenCV 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55737801/

相关文章:

opencv 方形检测示例检测窗口衬里,当我使用 imageroi 时,它会裁剪整个图像

c++ - 如何在opencv c++中画两点之间的线

Python telnet 库问题,没有设置陷阱级别就无法读取输出

python - 带成绩的直方图

python - 如果我使用 celery 作为我的任务调度程序,我如何从我的 python 应用程序登录到 splunk?

python - 如何处理 "Incompatible return value type (got overloaded function)"问题

python - 如何编写在 Postgres 列中查找单词的 Django 查询?

python-3.x - Python argparse的字符串值可能为空

php - 如何将 PHP 中从网络摄像头捕获的图像发送到 Python

python - 省略 matplotlib 图中的连接线,例如y = tan(x)