OpenCV / v4l2で、Webカメラ露出固定にして、かつフリッカーを抑える方法

v4l2-ctlから露出時間を設定すると、フリッカーがどうしても発生してしまう。そんな時は、一度自動露出フリッカーの無い映像を取れる状態にした後に、露出モードだけを変更して露出固定にすれば、、、、よい。たぶん。

OpenCVから露出調整するのではなく、v4l2-ctlから設定するのがいいみたい。

OpenCVを使ってて、Webカメラの露出を固定したいとき、ありますよね。

OpenCVからもいじれそう。。。と思って調べてたんだけど、 どうにもいうことを聞いてくれない。

じゃぁ、もう、いいや。

ってことで、v4l2-ctlから設定することに。

で、露出固定にして、露出時間をいじると、なぜかどうしてもフリッカーがのる。
そりゃもう、盛大にのる。
ちらちらしてて、ほんと使えない。

どうしようもないのかー、と諦めそうになったんだけど、 自動露出だとフリッカーがおさえられた映像がとれるので、 一度自動露出にした後に、露出モードだけ変更することに。

import cv2
import subprocess
cap = cv2.VideoCapture(0)

cmd='v4l2-ctl -d /dev/video0 -c exposure_auto=3' # 自動露出
ret = subprocess.check_output([cmd],shell=True)

# 設定した後にすぐ変更するとうまく反映されないので、10回程度ムダにカメラ回す
_ = [cap.read()[:1] for in in range(10)]

cmd='v4l2-ctl -d /dev/video0 -c exposure_auto=1' # 現状で露出固定
ret = subprocess.check_output([cmd],shell=True)

これでいいのかなぁ。。。と思いつつも、動いてるから、まぁ、いいや。