WSL - 网络摄像头 USB:无法通过索引打开摄像头

问题描述 投票:0回答:2

我已遵循本教程:https://github.com/dorssel/usbipd-win/wiki/WSL-support#usbip-client-tools

我成功将 USB 摄像头与 WSL2 连接,但无法打开摄像头。

$lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 046d:08cb Logitech, Inc. Mic (Notebooks Pro)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

我的相机 USB 是 Logitech, Inc. Mic (Notebooks Pro) 和我的程序:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):

    ret, frame = cap.read()
    if ret:

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        cv2.imshow('frame',gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

它显示了

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

我使用 v4l-utils 来查询容器的视频设备

v4l2-ctl --list-devices
Failed to open /dev/video0: No such file or directory

我在设备驱动程序中添加了一些配置,如 @NotTheDr01ds 所说,现在我的相机通过命令显示在 WSL2 中

v4l2-ctl --list-devices
UVC Camera (046d:08c9) (usb-vhci_hcd.0-1):
        /dev/video0
        /dev/video1

但是当我尝试运行我的程序时,它显示了

[ WARN:[email protected]] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1000) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.

相机灯亮但拍不到东西。我已经尝试过以下命令:

lsmod
rmmod uvcvideo
modprobe uvcvideo nodrop=1 timeout=5000

但是显示错误

rmmod uvcvideo
rmmod: ERROR: Module uvcvideo is builtin.

我还没有找到任何解决方案。有什么建议吗??

python opencv windows-subsystem-for-linux wsl-2 uvc
2个回答
2
投票

我目前无法提供完整的答案,但这是我迄今为止所了解的有关 WSL2 下相机支持的信息:

  • 通过 USB/IP 共享相机,您已经完成了正确的第一步,但不幸的是,这只是该过程的一部分。

  • WSL2 的内核默认也不包含任何媒体驱动程序,因此您肯定需要将它们添加到内核中:

    sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev 
    libncurses-dev
    mkdir ~/src
    cd ~/src
    git clone --depth=1 https://github.com/microsoft/WSL2-Linu
    x-Kernel.git
    make KCONFIG_CONFIG=Microsoft/config-wsl menuconfig
    

    启用以下选项。所有这些都应该作为内置启用,而不是模块。该选项旁边应该有一个“*”而不是“M”:

    • 选择设备驱动程序 -> 启用多媒体支持

    • 选择多媒体支持 -> 媒体驱动程序:启用媒体 USB 适配器

    • 选择媒体 USB 适配器:启用 USB 视频类 (UVC)

    • 将配置保存到“Microsoft/config-wsl.uvc”(或任何您想要的名称)

    • 退出菜单配置

    make KCONFIG_CONFIG=Microsoft/config-wsl.uvc
    
    • (这里的细节有点模糊,因为我已经做了几周了)将平台

      bzImage
      复制到 Windows 驱动器上的某个位置。

    • 更新

      Windows
      用户配置文件目录中的 .wslconfig 文件以指向新内核(初学者请参阅此处)。

    • wsl --shutdown
      并重新启动以加载新内核

    • 确认正在播放

      uname -a

    • 仍在研究这部分,但如果您在 Windows 中禁用相机的设备驱动程序,它似乎会有所帮助。否则 Linux 和 Windows 将会争夺控制权。

即使一切就绪,我仍然无法捕获视频。之后我至少可以让相机出现在 WSL2 中,正如

v4l2-ctl --list-devices
所证明的那样。

希望这至少可以帮助您取得一些进步。我很想知道你是否完全解决了这个问题。


0
投票

@NotTheDr01ds 你解决问题了吗?我现在在使用 Infiray P2 Pro 热像仪时遇到了同样的问题。首先它被识别为 USB 设备,但未被识别为 /dev/video0 设备。根据您的提示和链接中的提示,video0 设备已存在。我可以运行基于 python 的程序,但它显示蓝屏,显示 -273°C。这意味着没有数据从相机传输到 python 应用程序 (Thermal-Camera-Redux)。

© www.soinside.com 2019 - 2024. All rights reserved.