質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

WSL2のUbuntu上で、OpenCVでWebカメラの映像を処理したい

neg315
neg315

総合スコア12

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

1グッド

0クリップ

311閲覧

投稿2022/08/24 03:57

編集2022/08/26 02:34

前提

WSL2のUbuntu上で、OpenCVによるUSB接続されたWebカメラの映像の処理を行いたいのですが、プログラムを実行するとエラーが起きてしまいます。

WSL2にWebカメラを認識させるための環境構築は以下のサイトを参考にしました。
https://zenn.dev/pinto0309/articles/7c7ce81bea8b6c

システム

  • Windows11:OS ビルド 22000.318
  • WSL2
  • Ubuntu:20.04.4 LTS
  • Python:3.7.8
  • OpenCV:4.6.0
  • Webカメラ:Logicool C270n HD WEBCAM

発生している問題・エラーメッセージ

プログラムを実行した結果、以下のようなエラーが出ました。この時、カメラのランプは光っています。

[ WARN:0@10.255] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout. [ WARN:0@20.266] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout. [ WARN:0@30.276] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout. ^CTraceback (most recent call last): File "tools/webcamtest.py", line 29, in <module> ret, frame = cap.read() KeyboardInterrupt

該当のソースコード

以下が実行したプログラムのソースコードです。

Python

1import cv2 2 3W=640 4H=480 5cap = cv2.VideoCapture(0) 6cap.set(cv2.CAP_PROP_FRAME_WIDTH, W) 7cap.set(cv2.CAP_PROP_FRAME_HEIGHT, H) 8 9while True: 10 ret, frame = cap.read() 11 if not ret: 12 continue 13 cv2.imshow('usb cam test', frame) 14 if cv2.waitKey(1) & 0xFF == ord('q'): 15 break 16 17cap.release() 18cv2.destroyAllWindows()

試したこと

上記のソースコードのW(width)を640から160に、H(height)を480から120に設定して実行すると、ちゃんと映像が表示されました。
しかし、それ以上フレームの画面を大きく設定すると上記のエラーコードが出ます。

また、参考サイト(https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf) において、上記のエラーコード(select() timeout.)についての対策が書かれていたので、その通りに進めてみたのですが、同じエラーが吐かれてしまいます。
以下に使用したコマンドとその実行結果を示します。

$ v4l2-ctl -d /dev/video0 --all Driver Info: Driver name : uvcvideo Card type : C270 HD WEBCAM Bus info : usb-vhci_hcd.0-1 Driver version : 5.10.102 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 : 'YUYV' (YUYV 4:2:2) Field : None Bytes per Line : 1280 Size Image : 614400 Colorspace : sRGB Transfer Function : Rec. 709 YCbCr/HSV Encoding: ITU-R 601 Quantization : Default (maps to Limited 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=0 max=255 step=1 default=128 value=128 contrast 0x00980901 (int) : min=0 max=255 step=1 default=32 value=32 saturation 0x00980902 (int) : min=0 max=255 step=1 default=32 value=32 white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1 gain 0x00980913 (int) : min=0 max=255 step=1 default=0 value=8 power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=1 0: Disabled 1: 50 Hz 2: 60 Hz white_balance_temperature 0x0098091a (int) : min=0 max=10000 step=10 default=4000 value=4280 flags=inactive sharpness 0x0098091b (int) : min=0 max=255 step=1 default=24 value=24 backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=1 value=1 exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3 1: Manual Mode 3: Aperture Priority Mode exposure_absolute 0x009a0902 (int) : min=1 max=10000 step=1 default=156 value=156 flags=inactive exposure_auto_priority 0x009a0903 (bool) : default=0 value=1 $ v4l2-ctl -d /dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YUYV' (YUYV 4:2:2) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 176x144 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Size: Discrete 1280x720 Interval: Discrete 0.133s (7.500 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.133s (7.500 fps) Interval: Discrete 0.200s (5.000 fps) [1]: 'MJPG' (Motion-JPEG, compressed) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 160x120 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 176x144 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Size: Discrete 1280x720 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps)

参考サイトによると、この実行結果により映像のフレームをWidth640、Height480とすればいいらしいので、上記に記載したPythonのプログラムのように640と480に設定して実行したのですが、上手くいきません。
Widthを1280、Heightを720などにしても同じエラーが吐かれました。

また、このコマンドの実行結果はこのサイト(https://qiita.com/ghibi/items/50a40a4f56efd0bda767) を参考にして強制的にフォーマットを640x480 YUYVにした後の実行結果となっています。
ただ、これをする前にも上記のコマンドの実行結果にはWidthが640、Heigthが480となっていた(と思う)ので、どちらにしろ結果は変わらなかったと思います。

PCの内臓のWebカメラでも上記と同様の操作をしましたが、同様のエラーが起きました。

どうすれば640×480 かそれ以上の大きさで映像を映せるでしょうか?

以下が参考にしたサイトです。
https://zenn.dev/pinto0309/articles/7c7ce81bea8b6c
https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf
https://qiita.com/ghibi/items/50a40a4f56efd0bda767

tanat👍を押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

Pythonプログラムのソースコードにcap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G'))という1文を加えてフォーマットをYUYVからMJPGに変更することで、640×480で映像が出力されました。

Python

1import cv2 2W=640 3H=480 4cap = cv2.VideoCapture(0) 5cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G')) 6cap.set(cv2.CAP_PROP_FRAME_WIDTH, W) 7cap.set(cv2.CAP_PROP_FRAME_HEIGHT, H) 8while True: 9 ret, frame = cap.read() 10 if not ret: 11 continue 12 13 # frame = cv2.resize(frame, (160, 120)) 14 cv2.imshow('usb cam test', frame) 15 if cv2.waitKey(1) & 0xFF == ord('q'): 16 break 17cap.release() 18cv2.destroyAllWindows()

投稿2022/08/28 07:44

neg315

総合スコア12

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。