RaspberryPiでLogicool C270を使いたい
USBカメラのLogicool HD Webcam C270は、安価でRaspberryPiとの相性が良いため利用されている方も多いのではないでしょうか。
私もRaspi+OpenCV+c270という組み合わせを検討していたのですが、その際、c270の自動露出を解除して任意の値を設定する方法にハマってしまいましたので、解決方法をメモ書きしておきます。
実行環境
- Raspbian-stretch date:2017-11-29
- python:3.6.1
- OpenCV:3.3.0
- PyQt5:5.10.1
- USBカメラ:Logicool HD Webcam C270
本内容は、PyQt5で作成したGUIアプリにOpenCVでキャプチャした画像を表示させた状態で確認しました。
問題点
Linux上でUSBカメラの設定を行う場合は、Video4Linuxを使うと良いらしいので、v4l2-ctl
コマンドを用いて任意の露出を設定しました。
その結果、露出のパラメータであるexposure_absolute
の変更には成功したのですが、キャプチャした画像に設定内容が反映されません。
ちなみに、同様の手順をLogicool HD Webcam C615を用いて実行すると、こちらはキャプチャ画像に露出の設定が反映されます。なのでC270固有の問題なのかもしれません。
解決方法
こちらを参考にすることで解決できました。
How can I change webcam properties that OpenCV doesn't support but v4l2 API does?
理由は分かりませんが、cv2.VideoCaputure()
の後、最初の一回のみcv2.read()
を実行した時点でカメラの設定がリセットされてしまうみたいです。
なので一度cv2.read()
を実行し意図的に設定をリセットしておいて、その後にVideo4Linuxで露出設定を行うようにすれば任意の値を反映できます。
具体的には以下のような感じです
import subprocess
import cv2
cap = cv2.VideoCapture(0)
# v4l2で設定を行う前にread()を1回実行しておく
_, _ = cap.read() # <-対策としてこの1行を追加
# v4l2の設定をsubprocessを用いて実行
cmd = 'v4l2-ctl -d /dev/video0 -c exposure_auto=1 -c exposure_absolute=20'
ret = subprocess.check_output(cmd, shell=True)
# v4l2の設定値を確認
cmd = 'v4l2-ctl --list-ctrls'
ret = subprocess.check_output(cmd, shell=True)
print(ret)
# 以降の処理でread()を実行しても、設定がリセットされることはないみたいです・・・
2019/4/11追記
下記の様なコメントを頂きました。
当時の環境が残っていないため当方では確認できておりませんが、動作しない場合は修正してみてください。
Description: Raspbian GNU/Linux 9.8 (stretch)
Release: 9.8
こちらのバージョンではコマンドが以下のように変更となっていました。
cmd = "v4l2-ctl -d /dev/video0 -c auto_exposure=1 -c exposure_time_absolute=300"