在 WSL2 中使用 OpenCV 捕获网络摄像头视频

在 WSL2 中使用 OpenCV 捕获网络摄像头视频

我正在尝试通过 WSL2 (Ubuntu) 中的 OpenCV 访问我的网络摄像头。我发现博客文章中解释了如何将 USB 设备连接到 WSL2。usbipd wsl list在 Windows 命令提示符中运行会列出以下设备:

> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
1-1    0c45:6725  Integrated Webcam                                             Not attached
1-2    046d:c534  USB Input Device                                              Not attached
1-3    0cf3:e007  Qualcomm QCA61x4A Bluetooth                                   Not attached
1-4    27c6:639c  Goodix Moc Fingerprint                                        Not attached
2-2    8564:7000  USB Mass Storage Device                                       Not attached

这里我的机器的集成网络摄像头是一个带有的 USB 设备BUSID 1-1。我跑去usbipd wsl attach --busid 1-1将我的集成网络摄像头连接到 WSL。

现在从 WSL 中输入lsusb以下内容列出设备:

> lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0c45:6725 Microdia Integrated_Webcam_HD
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

看起来集成网络摄像头已成功连接到 WSL(列为Microdia Integrated_Webcam_HD)。

这是用于访问网络摄像头的代码:

import cv2
import sys

source = cv2.VideoCapture(0)

win_name = 'Camera Preview'
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)

while cv2.waitKey(1) != 27:  # Escape
    has_frame, frame = source.read()
    if not has_frame:
        break
    cv2.imshow(win_name, frame)

source.release()
cv2.destroyWindow(win_name)

这里cv2.VideoCapture()以索引作为参数。OpenCV文档提及: 文档

如果我使用作为参数运行上面的代码0,我会得到以下输出:

[ WARN:[email protected]] global /io/opencv/modules/videoio/src/cap_v4l.cpp (889) open VIDEOIO(V4L2:/dev/video0): can't open camera by index

我已将 USB 设备连接到 WSL,但仍然无法访问集成网络摄像头。如果您能提供任何解决此问题的建议,我将不胜感激!

答案1

TL;DL:我遇到了同样的问题,有人在评论中提到的这个 GitHub 对我有用:

https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf


我花了一整天时间尝试了很多解决方法,但这是唯一对我有用的方法。

我事先就知道这是与 WSL Kernel 相关的问题,因为网络摄像头在 Virtual Box 上运行的 Ubuntu 22.04 虚拟机上运行良好。

GitHub 页面上没有指定,但你需要先:

1 - 安装usbipd-win

您可以在此处执行所有步骤: https://github.com/dorssel/usbipd-win/wiki/WSL-support

在您设法将您的设备连接到 WSL 之后,并且它会通过命令显示lsusb,您可以按照他们的教程进行操作。

2-按照此存储库中描述的步骤进行操作

https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf

他们在这里描述的所有内容,您都可以在usbipd安装完成后自行完成,但最大的区别是,他们已经预先配置了一个 .config 文件来编译内核,以便网络摄像头正常工作。(对我来说,它就像魔术一样有效)


我在Windows 11 Pro Build 22621 ,我的网络摄像头是集成的,兼容uvcvideo,我将在这里发布完整的规格:

$ v4l2-ctl -d /dev/video0 --all

Driver Info:
        Driver name      : uvcvideo
        Card type        : Integrated_Webcam_HD: Integrate
        Bus info         : usb-vhci_hcd.0-1
        Driver version   : 5.15.90
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height      : 640/480
        Pixel Format      : 'MJPG' (Motion-JPEG)
        Field             : None
        Bytes per Line    : 0
        Size Image        : 614989
        Colorspace        : Default
        Transfer Function : Default (maps to Rec. 709)
        YCbCr/HSV Encoding: Default (maps to ITU-R 601)
        Quantization      : Default (maps to Full Range)
        Flags             :
Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 640, Height 480
        Default     : Left 0, Top 0, Width 640, Height 480
        Pixel Aspect: 1/1
Selection Video Capture: crop_default, Left 0, Top 0, Width 640, Height 480, Flags:
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags:
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 30.000 (30/1)
        Read buffers     : 0
                     brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast 0x00980901 (int)    : min=0 max=95 step=1 default=0 value=0
                     saturation 0x00980902 (int)    : min=0 max=100 step=1 default=64 value=64
                            hue 0x00980903 (int)    : min=-2000 max=2000 step=1 default=0 value=0
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                          gamma 0x00980910 (int)    : min=100 max=300 step=1 default=100 value=100
                           gain 0x00980913 (int)    : min=1 max=8 step=1 default=1 value=1
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=1 (50 Hz)
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      white_balance_temperature 0x0098091a (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive
                      sharpness 0x0098091b (int)    : min=1 max=7 step=1 default=2 value=2
         backlight_compensation 0x0098091c (int)    : min=0 max=3 step=1 default=3 value=3
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3 (Aperture Priority Mode)                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=9 max=625 step=1 default=157 value=157 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=0

下面是我的相机工作的截图(当然,我把手指放在了它前面,但图像很好) 相机与来自 PINTO0309 的 github 教程脚本配合使用

相关内容