この記事は何?
WSL2からUSBカメラを認識できるようにして、疎通試験として、OpenCV(Python)でカメラ映像を取得するまでの手順メモです。
WSL2はデフォルトではUSBデバイスにアクセスできません。usbipd-win というプログラムを使って、Windows側からWSL2側へデバイスをアタッチする必要があります。
環境
- Windows 11 + WSL2(Ubuntu)
- Python 3.12
- OpenCV(
opencv-python) - usbipd-win
手順
1. usbipd-win のインストール(Windows側)
未インストールの場合、PowerShellで以下を実行します。
winget install usbipd
2. USBカメラのBUSIDを確認(Windows側)
PowerShell(管理者)で実行します。
usbipd list
出力例:
Connected:
BUSID VID:PID DEVICE STATE
1-5 04bb:0556 XX-XXXXXX Not shared
カメラのBUSIDをメモします(この例では 1-5)。
3. WSL2へアタッチ(Windows側)
# 初回のみ必要(一度 bind したデバイスは次回以降スキップ可)
usbipd bind --busid 1-5
usbipd attach --wsl --busid 1-5
成功すると以下のようなメッセージが表示されます。
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
4. WSL2側でデバイス確認(WSL2側)
ls /dev/video*
/dev/video0 などが表示されれば認識成功です。
5. OpenCVのインストール(WSL2側)
pip install opencv-python
6. OpenCVで動作確認(WSL2側)
import cv2
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
print(f"取得成功: {ret}, 解像度: {frame.shape}" if ret else "取得失敗")
cap.release()
取得成功: True, 解像度: (576, 1024, 3)
映像フレームが取得できれば、カメラは正常に動作しています。
デタッチ・再アタッチ
カメラを切断したい場合や、接続が切れた場合は以下を実行します。
# デタッチ
usbipd detach --busid 1-5
# 再アタッチ
usbipd attach --wsl --busid 1-5
ハマりポイント
デバイスは見えるのにOpenCVで開けない
/dev/video* が見えているのに cv2.VideoCapture(0) が失敗する場合、パーミッションを確認してください。
ls -la /dev/video*
groups
video グループに所属していなければ追加します。
sudo usermod -aG video $USER
変更後、WSLを完全に終了してから再起動してください。
# Windows側PowerShellで実行
wsl --shutdown
その後、WSLを再度起動すると変更が反映されます。