WSL2调用摄像头并使用OpenCV

WSL2(Windows Subsystem for Linux 2)默认情况下无法直接访问 USB 设备,包括摄像头。本文将详细介绍如何通过重新编译 WSL2 内核来启用 USB 摄像头支持。

前言

要在 WSL2 中使用 USB 摄像头,我们需要完成以下三个主要步骤:

  1. 将摄像头从 Windows 连接到 WSL2
  2. 重新编译 WSL2 Linux 内核以包含摄像头驱动
  3. 配置 WSL2 使用新编译的内核

一、将摄像头连接到 WSL2

1.1 安装 USB/IP 工具

以管理员身份打开 PowerShell,执行以下命令安装 usbipd

复制代码
winget install usbipd

1.2 列出已连接的 USB 设备

复制代码
usbipd list

该命令会显示所有连接到系统的 USB 设备,找到你的摄像头对应的 BUSID(例如 1-6)。

1.3 绑定摄像头设备

将摄像头绑定以便共享给 WSL2(假设摄像头的 BUSID 是 1-6):

复制代码
usbipd bind -b 1-6

1.4 验证绑定状态

再次查看设备列表,确认摄像头状态已更新为 Shared

复制代码
usbipd list

1.5 将设备附加到 WSL2

复制代码
usbipd attach -w -b 1-6

再次运行usbpid list, 摄像头STATE变为Attached

1.6 在 WSL2 中验证连接

打开 WSL2 终端,使用以下命令验证摄像头已成功连接:

复制代码
lsusb

如果看到摄像头设备信息,说明连接成功。

然而此时运行调用摄像头的代码,会显示报错,因为WSL2是一个独立的子系统,并没有摄像头驱动,需要继续重新编译内核

复制代码
[ WARN:0@8.994] global cap_v4l.cpp:914 open VIDEOIO(V4L2:/dev/video0): can't open camera by index
[ WARN:0@8.994] global cap.cpp:478 open VIDEOIO(V4L2): backend is generally available but can't be used to capture by index
无法打开摄像头 0
错误: 无法打开摄像头

二、重新编译 WSL2 Linux 内核

2.1 更新 WSL

在 PowerShell 中执行:

复制代码
wsl --update

2.2 安装编译依赖

在 WSL2 Ubuntu 终端中,更新系统并安装必要的编译工具:

复制代码
sudo apt update && sudo apt upgrade -y && sudo apt install -y build-essential flex bison dwarves libssl-dev libelf-dev libncurses-dev

2.3 检查 WSL2 内核版本

复制代码
uname -r

记录输出的版本号,例如 6.6.87.2-microsoft-standard-WSL2

2.4 下载对应版本的内核源码

根据上一步获取的版本号,下载对应的 WSL2 内核源码:

复制代码
cd /usr/src
TAGVERNUM=6.6.87.2
TAGVER=linux-msft-wsl-${TAGVERNUM}
sudo git clone \
  -b ${TAGVER} \
  https://github.com/microsoft/WSL2-Linux-Kernel.git \
  ${TAGVERNUM}-microsoft-standard \
  && cd ${TAGVERNUM}-microsoft-standard

2.5 准备内核配置文件

复制代码
sudo cp /proc/config.gz config.gz \
  && sudo gunzip config.gz \
  && sudo mv config .config

2.6 配置内核选项

启动内核配置界面:

依次选择Device Drivers - Multimedia support

将Filter media drivers 的方框中按Y,注意按Y以后显示的是 *

然后继续来到Media device types,Cameras and video grabbers 方框输入Y

上述流程可总结如下

复制代码
sudo make menuconfig
```

在配置界面中,使用方向键导航,按 `Y` 键选中选项(选中后会显示 `[*]`),按照以下路径启用所需的驱动:

**必须启用的选项:**
```
Device Drivers 
  → Multimedia support 
    → Filter media drivers [Y]
    → Media device types 
      → Cameras and video grabbers [Y]

操作说明:

  • 使用方向键上下移动
  • Enter 进入子菜单
  • Y 启用选项(显示为 [*]
  • N 禁用选项
  • M 编译为模块(显示为 <M>

配置完成后,选择 Save 保存配置,然后选择 Exit 退出。

2.7 编译内核

使用多核并行编译以加快速度:

复制代码
sudo make -j$(nproc) KCONFIG_CONFIG=.config \
  && sudo make modules_install -j$(nproc) \
  && sudo make install -j$(nproc)

编译过程可能需要较长时间,请耐心等待。

三、安装和配置新内核

3.1 复制内核文件到 Windows

编译完成后,将生成的 vmlinux 内核文件复制到 Windows 系统:

复制代码
sudo cp vmlinux /mnt/c/Users/<UserName>/WSL2/kernel-6.6.87.2

注意:将 <UserName> 替换为你的 Windows 用户名,目标路径可以自定义。

而且这是将内核文件改路径以后重命名为kernel-6.6.87.2,不是放到kernel-6.6.87.2文件夹中

3.2 创建 WSL 配置文件

在 Windows 用户目录下创建 .wslconfig 配置文件:

复制代码
vim /mnt/c/Users/<UserName>/.wslconfig

i 键进入编辑模式,添加以下内容:

复制代码
[wsl2]
kernel=C:\\Users\\<UserName>\\WSL2\\kernel-6.6.87.2

注意:

  • <UserName> 替换为你的 Windows 用户名
  • Windows 路径需要使用双反斜杠 \\

ESC 退出编辑模式,输入 :wq 保存并退出。

四、测试摄像头

4.1 重启 WSL2

在 PowerShell 中执行:

复制代码
wsl --shutdown

4.2 重新连接摄像头

复制代码
usbipd attach -w -b 1-6

4.3 验证设备连接

在 WSL2 终端中:

复制代码
lsusb

4.4 验证新内核加载

检查内核版本,如果成功加载自定义内核,版本号末尾会显示 + 号:

复制代码
uname -r -v
```

输出示例:
```
6.6.87.2-microsoft-standard-WSL2+ 

4.5 安装和测试摄像头应用

安装 V4L 工具和摄像头查看器:

复制代码
sudo apt install v4l-utils guvcview

启动摄像头应用:

复制代码
sudo guvcview

如果一切正常,你应该能看到摄像头的实时画面。

4.6 使用OpenCV

继续在WSL2中新建如下python脚本,使用OpenCV展示

python 复制代码
import cv2
cap = cv2.VideoCapture(0)  # /dev/video0
cap.set(3,640)
cap.set(4,480)
cap.set(cv2.CAP_PROP_FPS,10)
#cap.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter.fourcc('Y','U','Y','V')) # 下面不行可以尝试这个
cap.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter.fourcc('M','J','P','G'))
while(True):
    ret, frame = cap.read()
    if not ret:
        print("Failed to read the image.")
        break
    cv2.imshow('Video', frame)
    key = cv2.waitKey(1)
cap.release()

即可成功调用摄像头

参考资料

  1. PINTO0309/wsl2_linux_kernel_usbcam_enable_conf
  2. WSL2 Webcam Support - Medium
  3. https://blog.csdn.net/chengpengfei09121870/article/details/142762468?ops_request_misc=elastic_search_misc&request_id=db0ed97b4b37eb05f6c98156194cf227&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~ElasticCommercialInsert~search_v2-3-142762468-null-null.142^v102^pc_search_result_base3&utm_term=WSL2%E8%B0%83%E7%94%A8%E6%91%84%E5%83%8F%E5%A4%B4&spm=1018.2226.3001.4187

总结

通过重新编译 WSL2 内核并启用相应的 USB 摄像头驱动,我们可以在 WSL2 环境中成功使用 USB 摄像头。虽然这个过程较为复杂,但一旦配置完成,就可以在 Linux 环境中进行各种摄像头相关的开发和测试工作。

希望本教程对你有所帮助!如有问题,欢迎在评论区讨论。

相关推荐
汤姆yu1 小时前
基于深度学习的电动车头盔佩戴检测系统
人工智能·深度学习
知识分享小能手1 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04 的软件包管理 —— 全面详解(9)
linux·学习·ubuntu
江上鹤.1481 小时前
Day48TensorBoard使用
人工智能·深度学习·机器学习
whitelbwwww1 小时前
使用神经网络来拟合数据
人工智能·深度学习·神经网络
susu10830189111 小时前
ubuntu系统删除 Docker 启动的所有容器、卸载 Docker 以及清理 Docker 相关保留路径
ubuntu·docker·eureka
爱学习的小道长1 小时前
Ubuntu Python 使用 Redis 缓存
python·ubuntu·缓存
赋创小助手2 小时前
超微SYS-821GE-TNHR深度测评:8卡 NVIDIA H200 风冷 AI 服务器
运维·服务器·人工智能·深度学习·计算机视觉·语言模型·自然语言处理
znhy_232 小时前
day45打卡
python·深度学习·机器学习
charlee442 小时前
Ubuntu下编辑文本文件的方法
ubuntu·vim·mobaxterm·文本编辑·远程管理
sunriver20002 小时前
【Qt】Ubantu安装Qt6.9.1
qt·ubuntu