Welcome to KumaWatch’s documentation!

ウェブカメラを使って定点観測&タイムラプス動画の自動生成ができるPythonスクリプト

クイックスタート

リポジトリのチェックアウト

$ git clone https://github.com/shotakaha/kumawatch.git
$ ls kumawatch/
LICENSE
README.md
docs/
kumawatch.py
kwcapture.py
kwconf.example
kwcron.example
kwtimelapse.py

設定ファイルの用意

$ cp kwconf.example myconf.conf
$ emacs myconf.conf

画像のキャプチャ

$ ./kwcapture.py -h
$ ./kwcapture.py myconf.conf

タイムラプスの動画の生成

$ ./kwtimelapse.py -h
$ ./kwtimelapse.py <date> myconf.conf
$ ./kwtimelapse.py today myconf.conf
$ ./kwtimelapse.py yesterday myconf.conf

自動実行したい場合

自動実行はcronにお願いする

$ cp qwcron.example mycron.txt
$ emacs mycron.txt
$ crontab mycron.txt

Python2.x 系を使う場合

  • タグ v1.5 をチェックアウトする
  • このタグの実行スクリプト内では #!/usr/bin/env python2 を直書きしている
  • myconf.conf の編集方法は変わらない
$ git clone https://github.com/shotakaha/QwatchCapture.git
$ cd QwatchCapture/
$ git checkout -b v1.5 v1.5
$ cp qwconf.example myconf.conf    ## --> myconf.confを編集する
$ ./qwcapture.py myconf.conf

注釈

python3 でも python2 でも、どちらでも動くようにしたかったが、モジュール名が変わってたりしてめんどくさそうだったから諦めた

事前準備

  • Python
  • wget
  • FFmpeg

wgetのインストール

Homebrewを使ってインストールしたものを使っている。

$ brew install wget
$ wget --version
GNU Wget 1.18 built on darwin15.5.0.

-cares +digest -gpgme +https +ipv6 -iri
+large-file -metalink -nls +ntlm +opie
-psl +ssl/openssl

FFmpegのインストール

Homebrewを使ってインストールしたものを使っている。 別の用途で必要だったので --with-libx265 しているが、KumaWatchでは必須ではない

$ brew install ffmpeg --with-libx265
$ ffmpeg -version
ffmpeg version 3.0.2 Copyright (c) 2000-2016 the FFmpeg developers
built with Apple LLVM version 7.3.0 (clang-703.0.31)

configuration: --prefix=/usr/local/Cellar/ffmpeg/3.0.2
--enable-shared --enable-pthreads --enable-gpl --enable-version3
--enable-hardcoded-tables --enable-avresample --cc=clang
--host-cflags= --host-ldflags= --enable-opencl --enable-libx264
--enable-libmp3lame --enable-libxvid --enable-libx265 --enable-vda

動作環境

ウェブカメラ

パソコン

  • MacOS X(10.11.5 El Capitan) + Python(2.7.11) + wget(1.18) + ffmpeg(3.0.2)
  • MacOS X(10.10 Yosemite) + Python(2.7.9) + wget(1.16.2) + ffmpeg(2.6)
  • Ubuntu (14.04LTS) + Python(2.7.6) + wget(1.15) + ffmpeg(2.6)

使い方

設定ファイルの準備

  • qwconf.example をコピーして myconf.conf を新規に作成する
  • myconf.conf の中身を自分のQwatchの設定に書き換える

設定ファイルの書式

[WEBCAM]
name = CAMNAME
uri = http://QWatchADDRESS/snapshot.jpg
user = USER
pass = PASS
base = EXPERIMENTS/%(name)s
変数名 説明
WEBCAM
ConfigParserで「セクション」と呼ぶ。
カメラごとに異なった名前にする。
name
名前。
カメラ毎に保存先を分けるために使う。
(全部同じにしても動くが、後で編集することを考えると非推奨)
uri
JPEGファイルの場所。
TS-WLCAMシリーズの場合は「QwatchADDRESS」の部分を該当のIPアドレスに書き換えればOK
user ユーザー名
pass パスワード
base
画像/動画を保存するディレクトリ。
%(name)sの部分は、上にある「name」で置換される。
EXPERIMENTSには各実験グループ名(とか用途)をいれるつもり。

画像/動画の保存先

  • スクリプト内部で日付ごとに管理している

  • ファイルパスの例

    画像:EXPERIMENTS/CAMNAME/snapshots/2015/03/11/2015-0311-2230-15.jpg
    動画:EXPERIMENTS/CAMNAME/timelapse/2015-03-11.jpg
  • ブラウザで確認したい場合は EXPERIMENTS を公開ディレクトリへのシンボリックにするとよい

$ ln -s ~/public_html/qwatch/snap EXPERIMENTS

複数台カメラを設定する場合(みかくにん)

  • 1台ごとにconfファイルを用意して、引数にしてもOK
  • 1つのconfファイルに複数台の設定を書いてもOK
[WEBCAM1]
name = CAMNAME1
uri = http://QWatchADDRESS-1/snapshot.jpg
user = USER
pass = PASS
base = WEBHOME/%(name)s

[WEBCAM2]
name = CAMNAME2
uri = http://QWatchADDRESS-2/snapshot.jpg
user = USER
pass = PASS
base = WEBHOME/%(name)s

画像をキャプチャする : qwcapture

  • confファイルを引数にして実行する
$ ./qwcapture.py QWCONF.conf
  • 複数のconfファイルを指定することもできる
$ ./qwcapture.py QWCONF.conf QWCONF2.conf

オプションについて

  • いちおうwgetのオプションが使えるようになっている
  • ヘルプを確認すること
$ ./qwatch.py -h

タイムラプス動画の作成 : qwtimelapse

  • 日付とconfファイルを引数にして実行する
  • 日付には、「 today 」「 yesterday 」「 YYYY/mm/dd の書式」が使える
  • 日付は 1個 しか指定できない(confファイルは複数指定できる)
    • 基本的に毎日更新するため、複数日をまとめてやる必要が(とりあえず)ないと思うから
$ ./qwtimelapse.py DATE QWCONF.conf

自動実行する : cron

警告

crontab は上書きされてしまうので、すでに設定がある場合はバックアップを取っておく

$ crontab -l > mycront.bk    ## Backup crontab
  • qwcron.example をコピーして mycron.txt を作成する(拡張子はなんでもよい)
$ cp qwcron.example mycron.txt    ## Copy example and modify
$ crontab mycron.txt              ## Eat mycron.txt
$ crontab -l                      ## Check crontab

cronの書式

分 時 日 月 曜日 実行コマンド

10分ごとに画像をキャプチャする場合

  • QwatchCaptureのあるディレクトリまでのパスを指定する
  • confファイルも指定する
QWDIR=      ## qwatch.py があるディレクトリを指定する
QWCONFIGS=  ## confファイルを指定(複数指定できる、半角スペースで区切る(みかくにん))

*/10 * * * * `cd $QWDIR && ./qwcapture.py $QWCONFIG`

1時間ごとにタイムラプス動画を作る場合

  • 毎時5分に作成(キャプチャの実行と時間をずらしてある)
  • 毎日00時08分に、前日の動画をまとめる(これも時間をずらしてある)
5 * * * * `cd $QWDIR && ./qwtimelapse.py today QWCONFIGS`
8 0 * * * `cd $QWDIR && ./qwtimelapse.py yesterday QWCONFIGS`

ログの確認

  • cronのログは以下のディレクトリ/ファイルで確認できる
$ tail /var/log/syslog
$ sudo ls -ltrh /var/spool/nullmailer/queue/ | tail   ## ログファイル名、タイムスタンプ、サイズを確認する
$ sudo less /var/spool/nullmailer/queue/LOGFILE       ## 上で調べたLOGFILE名の中には、cron実行時のログが吐き出されている

ちょっと詳しいこと

画像のキャプチャ

  • ウェブカメラ内に保存されている画像を wget を使って取得
  • 画像のURLは http://www.ispyconnect.com/man.aspx?n=IO+Data で調べた
  • 右上の検索ボックスに型番とか入れるとたぶん見つかる
  • 取得した画像は、その時の時刻でリネーム
$ wget --http-user=USER --http-password=PASS http://QwatchIPADDRESS/snapshot.jpg
$ mv snapshot.jpg snapshots/YYYY-MMDD-hhmm-ss.jpg

タイムラプス動画の生成

  • 画像がある程度たまったら ffmpeg を使って連結
$ ffmpeg -y -f image2 -r 15 -pattern_type glob -i 'snapshots/*.jpg' -r 15 -an -vcodec libx264 -pix_fmt yuv420p video.mp4
$ mv video.mp4 snapshots/

自動実行

  • これらの動作を cron に食べさせて、定期的に実行している

もうちょいやってること

  • ユーザ情報( USER , PASS )をファイル中に書くのは嫌
    • PythonのConfigParserモジュールを使って外部ファイルから読むことにする
  • 以下の wget のオプションを使えるようにしている
    • アクセスできなかった場合にタイムアウトする秒数(デフォルト 10秒に設定)
    • タイムアウトした際にリトライする回数(デフォルト 1回に設定)
    • ログをファイルを残すときのファイル名(デフォルト qwatch.log に設定)

FFmpegのインストール

MacOS Xの場合

  • MacPortsを使って ffmpeg をインストールする( variants はお好みで)
$ sudo port install ffmpeg
  • Homebrewを使って ffmpeg をインストールする( Options はお好みで)
$ brew install ffmpeg

Ubuntuの場合

  • 14.04 LTS ではそのままでは apt-get できないみたいなので、PPAリポジトリを追加する
  • 詳しくは https://launchpad.net/~mc3man/+archive/ubuntu/trusty-media を読むこと
  • 14.10 以上にアップグレードしないほうがいいらしい。その場合はクリーンインストールがオススメだそう。
$ sudo add-apt-repository ppa:mc3man/trusty-media
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install ffmpeg

kumawatch module

Python2からPython3へ

Python2からPython3対応へ変更した時のメモです。

変更すべき箇所の確認

2to3 コマンドを実行して、変更すべき箇所を確認

$ 2to3 kumawatch.py
...
RefactoringTool: Refactored kumawatch.py
--- kumawatch.py     (original)
+++ kumawatch.py     (refactored)

@@ -5,7 +5,7 @@
-import ConfigParser
+import configparser

@@ -149,7 +149,8 @@
-except OSError as (errno, strerror):
+except OSError as xxx_todo_changeme:
+    (errno, strerror) = xxx_todo_changeme.args
     ...

@@ -189,7 +190,8 @@
-except OSError as (errno, strerror):
+except OSError as xxx_todo_changeme1:
+    (errno, strerror) = xxx_todo_changeme1.args
     ...

@@ -232,10 +234,10 @@
## Print config files
for f in args.conffile:
-    print(f, os.path.exists(f))
+    print((f, os.path.exists(f)))

## Read config files
-    config = ConfigParser.SafeConfigParser()
+    config = configparser.SafeConfigParser()

configparserモジュールへの変更

- import ConfigParser
+ import configparser

Python2では ConfigParser というモジュール名だったが、Python3では configparser に変更された。

OSErrorの書き方の変更

- except OSError as (errno, strerror):
+ except OSError(errno, strerror):

as が不要だった

Python2.7の場合:https://docs.python.org/2.7/library/exceptions.html
Python3.5の場合:https://docs.python.org/3.5/library/exceptions.html

print文の変更

print文からprint関数に変更になったため、 (...) で括らないといけなくなった。 ただ、print文の状態でも括弧でくくってよかったため(たぶん)、この部分に限っては変更しなくていいはず。