ラズパイ - Python - fswebcam - Locicool C270 の 問題解決
ラズパイで写真撮影をする場合、専用のカメラモジュールを使うのもいいが、ミィのおすすめは、ウェブカメラを USB 接続して撮影する方法。ウェブカメラはマイクが付いていることが多いので、音声入力 も一個のデバイスでできる。なかでも、Logicool社のC270は、実売1,000円くらいで、コスパが高い。それから、ウェブカメラで写真撮影するアプリは、fswebcamが人気のようである。コマンドラインで実行するので、ラズパイ のようなLinuxマシンなら応用がきく。そんなわけでPythonでfswebcamを起動して、写真撮影するプログラムを書いてみた。ところが、ところが…。2回に1回は撮影に失敗する。どうも 一度撮影に成功すると、デバイスが しばらく ビジーになるようである。そのビジーを解除する方法はないものかと探してみたところ、このページを発見。ありがたや、ありがたや。v4l2-ctlコマンドをぐるぐる回して、ステータスの初期化をしているようである。で、上記 ページのサンプルはshなので、同じことをするプログラムをPythonで書いてみた。必要な方、参考にしてみてください。(自己責任で使ってね)■init_fswebcam.py#!/usr/bin/env python3# -*- coding: utf-8 -*-import subprocessimport time# fswebcamで写真撮影def photo(): # 通常の撮影 cmdline = 'fswebcam -d /dev/video0 -D 2 -r 640x480 -F 1 -S 10 ./photo/test.jpg' r = subprocess.check_output(cmdline, shell=True) # ウェブカメラの初期化 time.sleep(3) cmdline = 'fswebcam /dev/null' # ダミーでfswebcamを実行 r = subprocess.check_call(cmdline, shell=True) r = 1 cmdline = 'v4l2-ctl --all >/dev/null' #v4l2-ctlを繰り返し実行 while r == 1: r = subprocess.call(cmdline, shell=True) time.sleep(3) print('webcam status...', r)# ----------------------------------------if __name__ == '__main__': photo()