はじめに
USB経由で接続されたWebカメラの起動に30秒~1分ほどかかっており、いらいらしたので対処法を探しておりました。しかし調べ方が未熟なせいもあって解決に時間がかかりました。
capture = cv2.VideoCapture(1) ←具体的にはここがボトルネック。
対象者
この記事は下記のような人を対象にしています。
- 同じ悩みを持ち、ちょっとでも短時間でWebカメラを起動したいと思った人
環境
- Windows10
- Python3.7
結論
opencvのissueをたどってみると解決法がありました。
MSMFバックエンドの設定部分で問題が起きていたみたい。
# cv2のインポート前にカメラに関する設定を行う
# https://github.com/opencv/opencv/issues/17687
import os
os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"
import cv2
検証
Webカメラの起動が本当に速くなったのか手元の環境で実験しました。
使ったWebカメラはロジクール Webカメラ C270n です。
サンプルプログラムをお借りしました。
# cv2のインポート前にカメラに関する設定を行う
import os
os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"
import cv2
from time import time
# VideoCapture オブジェクトを取得します
st_time = time()
capture = cv2.VideoCapture(1)
ed_time = time()
print(f"elapsed time: {ed_time - st_time}")
while(True):
ret, frame = capture.read()
cv2.imshow('title',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()
カメラの設定を入れる前
elapsed time: 33.045
カメラの設定を入れた後
elapsed time: 0.7440
カメラの起動にかかる時間が33秒から0.7秒に短縮された。
おわりに
もちろん個体差があるだろうが、カメラが起動するまでモヤモヤする時間が
少しでも短くなると思うと嬉しい。