webcamでの動体認識には以下のオープンソースがあります
-
motion - Cで書かれた軽量なコード。V4Lなどのデバイスが使えます。
-
ZoneMinder - 超巨大な実装。onvifというperlのライブラリを使っている。
-
OpenCV - 画像処理用のライブラリで、動体認識もできます。
motionをちょっと見てみることにしました。
FreeBSDのportsをビルドしようとしたらエラーになったのでgithubにあったソースをforkしてcloneしてビルドを試しました。
githubのソースにはconfigureがないので、autoheader/autoconfして作ります。configure.acのpkg-configの記述がエラーになるので、これはコメントアウトしました。
libmicrohttpdとjpegのpkgがあれば以下のようにconfigureしてgmakeでビルドできます。
% ./configure --without-ffmpeg --without-sqlite3
motionはなんとbktrもサポートしていてBSDな開発者もいたようです。bktrは自分がいじった最初のFreeBSDのコードでした。BT878のボードはまだ持っていて、Hammerなマシンに入ってます。
FreeBSDではV4L互換のwebcamdを使って利用できるようなのですが、webcamdが依存がひどくていけてなかったので、なにか他に良い方法がないか考えてみました。
いろいろ探していたらたまたまSAITOU Toshihideさんが書かれたUVCのコードをMLで見つけて、これをがっちゃんこすることにしました。
当初、キャプチャ初めて1フレームとって止めての実装にしていたのですが、あまり効率が良くないので、pthreadで連続してキャプチャーして、フレームが必要な時だけメモリに落とすようにしました。
UVCから送られてくるデータはYUVという1ピクセル16ビットのデータでmotionに変換コードがすでにあったので、それを使って変換しています。
とりあえず動くようになったのでPullReqしたら中の人にlibuvcがいいなみたいな事いわれてます。:(
usbがrootでしかアクセスできない場合はsudoで起動します。
% sudo ./motion -c motion-dist.conf
使い方はmotion-dist.confのwebcontrol_localhostとstream_localhostをoffにするとネットワーク越しに確認できるようになります。ブラウザで8080にアクセスすると以下のような表示になります。
動くものが入るとコマンドラインに以下のログがでます。
[1:Unknown] [NTC] [ALL] motion_detected: Motion detected - starting event 1
[1:Unknown] [NTC] [ALL] mlp_actions: End of event 1
confのevent_gapで認識からEndまでの間隔が指定できます。またpicture_outputをonにすると認識中の画像をjpegで保存できます。on_event_startにshスクリプトを指定すると認識開始時に実行されます。
FreeBSD/mipsで動かしたいのですがusbがちょっと辛そうです。。。
ちなみに1フレームが640x480x2で614400バイトで1フレーム/Secでも1msのパケットに614バイトになります。結構大きいです。
FreeBSD/amd64のmotionのpkgは変なコンフィグレーションで依存がたくさん発生してます。よかれと思ってやってるんでしょうが、いけてません。
Linuxでもlibusbが入っていれば使えると思うので、uvc_device_listのwebcamを持っていて、configureを--without-v4lでビルドすれば試せると思います。と思ったんですが、Ubuntuで落ちるみたいです。誰かデバッグしてください。
中の人に複数カメラ対応してくださいと言われたので、bktrのコードなどを参考にいじってみました。cameraディレクティブでconfを分けると複数のカメラが使えるみたいなので、誰か試してくれませんか?