fswebcam
WebCam を作る際に基盤となるコマンドがfswebcam である。このコマンドをただ実行するとWeb カメラでの撮影が行える。しかしそのまま撮影すると少し白っぽい画像となった。
原因を調べるべくcheese という動画を見るGUI のアプリケーションを起動し、様子を見た。すると起動直後は少し白く、その後調整してくっきりとした色になったことから、開始直後の数フレームは飛ばす必要がある。
それを踏まえてコマンドの引数が決定した。
fswebcam -d /dev/video0 -S 20 -r 1600x1200 --png 0 temp_0.png
# コマンドの引数
-d デバイスを指定する。省略すると/dev/video0 が選択される。
-S 飛ばすフレーム数で今回は20 にした。省略すると0 になる。
-r サイズ指定。これを省略すると中途半端なサイズ(384x288) が指定されうまく撮影できずタイムアウトする。
--png 出力する画像形式をPNG にする。0 の意味は良く分からない。
temp_0.png 出力ファイル名。
これで色のくっきりした画像temp_0.png が生成できる。
ディレクトリ構成
今回はディレクトリの構造を以下のようにする。
+ log_[Web カメラの番号]
+ [年4 桁][月2 桁][日2 桁]
+ pic
+ 大きな画像達
+ thumb
+ サムネイル達
この[年4 桁][月2 桁][日2 桁]( 20100531 など) と言うディレクトリを残すログの数だけ保存し、それを読み込む。基本的にサムネイル一覧を表示し、それをクリックすると日付や撮影時間がつけられた画像を大きく表示することができるようにする。
大きな画像とサムネイル名を一致させることで、ディレクトリ名を置換するだけでもう片方にもアクセスできるようにする。
このディレクトリの自動生成やサムネイルの作成などは全てPerl に任せる。
PerlScript
次にサムネイル等を生成する。
今回はPerl の画像処理を行うImage::Magick モジュールを採用する。(開発環境にはGDしか入らず、Debian にはImage::Magick しか入らなかったのでこれで頑張るしかない。) 処理の手順は以下のようになる。
  • Web カメラが撮影したtemp_0.png を読み込む。
  • ファイル名の生成とディレクトリが存在しない場合にはディレクトリを作る。
  • Image::Magick で画像を大きな画像サイズにリサイズしてコピーする。
  • Image::Magick でコピーした画像をリサイズする。
  • 大きな画像をファイルに出力する。
  • サムネイルをファイルに出力する。
ページがサムネイル一覧を作るので、サムネイルが存在するときに大きな画像が存在している必要がある。そのために大きな画像をより早く生成するようにしている。
基本的に上のことしかしてないので比較的簡単な(モジュール任せの) 処理となる。
ShellScript
ここでWeb カメラで撮影し、その画像を適切に加工するシェルスクリプトを作る。
まずは撮影するコマンドに関してだが、これはシェルスクリプトにして簡単に実行できるようにする。ここでファイル名をcap_0.sh とする。(cap_[Web カメラの番号].sh)
01 | #!/bin/sh
02 | fswebcam -d /dev/video0 -S 20 -r 1600x1200 --png 0 temp_0.png
03 |
04 | perl photograph.pl 0
この後chmod 0705 cap_0.sh を実行して、./cap_0.sh というコマンドだけで実行できるようにする。次のコマンドのperl photograph.pl はPerl のphotograph.pl を実行する。このPerl-Script は画像を適切に加工して、サムネイルとタイムスタンプのある大きな画像を生成する。最後の引数0 はビデオ0 番に指定したもの(/dev/video0とは限らない。設定による) を使うと言う意味になる。
ここでスケジューリングに用いるcron について触れておく。
cron はLinux のスケジュールを管理するプログラムで、ユーザーが独自に時間と実行ユーザーとコマンドを登録することで、指定時間に実行ユーザー権限でコマンドを実行する。
ただし、ここでシェルは実行した場所でパスが決定してしまうので、必ずcd でWebCamのプログラムがある場所まで移動しなければ正常に動作しない。
それを考慮した上で、先ほど作ったcap_0.sh を実行するシェルを作る。プログラムを置いたディレクトリを/home/x68/public_html/webcam/ とし、作るシェルはcapture.shとする。
01 | #!/bin/sh
02 |
03 | #カレントディレクトリ移動。
04 | cd /home/x68/public_html/webcam/
05 |
06 | #撮影と画像加工をする。
07 | ./cap_0.sh
これをcron に登録すれば自動的に実行される。その前にchmod を使って実行権限を書き変えておく必要がある。
cron
最後にcron に登録する。
vi 等のエディタで/etc/crontab を編集する。そして末尾に以下の文を追加する。WebCamを実行するユーザーをx68 とする。
*/5 * * * * x68 /home/x68/public_html/webcam/capture.sh
cron は[分時日月曜日実行ユーザーコマンド] でコマンドを定期的に実行する。*は毎回と言う意味で分のところが*なら毎分で、日のところならば毎日という意味になる。*/5は5 で割り切れる時間なので5 分ごととなる。これで5 分ごとに撮影する。