WSL2上のOpenCV-PythonからWebカメラの解像度を変更する

問題点

import cv2
w = 1280
h = 720
cap=cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, h)

基本的にはこれで大丈夫と思いますがカメラによってはうまくいかない時もあります。

解決方法

まずは使っているカメラがどの解像度をサポートしているかを知る必要があります。

sudo apt install v4l-utils
sudo chmod 777 /dev/video*
v4l2-ctl -d /dev/video0 --list-formats-ext

このような結果が返ってきます。

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
        [1]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)




「MJPG」と「YUYV」が関係しているらしいです。


このようにするとうまくいきました。

import cv2
w=1280
h=720
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, h)

関連記事

WSL2でカメラを使うには - パソコン関連もろもろ
WSL2でカメラを使うには(2) - パソコン関連もろもろ
【更新記事】WSL2でカメラを使うには(3) - パソコン関連もろもろ