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
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
動作環境¶
ウェブカメラ¶
- IO-DATA Qwatch TS-WLCAMシリーズ
- USBケーブルしか付属してないので、電源TS-WLCAM用ADアダプター( TVC-XGA2 )があるとよい
パソコン¶
- 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
タイムラプス動画の作成 : 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文の状態でも括弧でくくってよかったため(たぶん)、この部分に限っては変更しなくていいはず。