La Fonera 2.0、FON2202を使ってUVCのデバイスからスナップショットをキャプチャする企画完結編。
一連のエントリは以下。
まずUVCからスナップショットを撮る目的のプログラムを探してみると、そのままずばりなuvccaptureというソフトを発見。
ソースを見てみると、結構簡単。これなら動かすのに修正が必要でも何とかなるかな、と。
あ、ちなみにストリーミング配信したいだけなら、パッケージがすでにあるのでfonera.beから探してください。
今回はそこそこ綺麗な画質で数秒おきに画像が撮りたいニーズなんで、上記のuvccaptureを使うことに。
使ったのはuvccapture-0.5.tar.bz2
で、uvccaptureをFonera本体でコンパイルすればいいかなーとか思ってたのだけれども、どうにも開発環境がどこに入ったのかわからない。
あ、上記のfonera.beからgccとか入れてみたんですけれどもね?
じゃあということで、VirtualPC 2007上に構築したDebian(lenny)でクロスコンパイルすることに。
Debian上には、以前OpenWRTをmake worldしようとして途中で失敗して放置しっぱなしの環境が。
でもmips-linux-gccとかはディスク上に見つかったので、どうやらこれで行けるっぽい。
ここまで構築したい人は以下のサイト参照。
色々やってよくわからなくなったetchと、これのために新規にインストールしたlennyで試してみたけど、どちらも成功しませんでした。
etchの方はlibdigest-crc-perlが古かったらしく、CPANからDigest::CRCをインストールしたらもう少し進んだけど。
ちなみに隣にいたUbuntu使いに頼んでやってみてもらったら全部通ったらしいです。謎。
確認してないけど、svnからcheckoutしてくればいいだけの気がする。
で、さっそくuvccaptureのクロスコンパイル開始。
とりあえず基礎知識を仕入れる。Makefileの環境変数の意味だけ確認しておこう。
作業用のディレクトリを作成
$ cd ~/fonera/trunk/openwrt/
$ mkdir test
$ cd test/
FON用のgccはここに入ってる。
trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/bin/mips-linux-gcc
uvccaptureにはlibjpegが必要になるので、aptitudeで…と言いたくなるのですが、mips-linux-gcc用にインストールしないといけないので、今回はソースから。
参考にしたサイトはLinkStation-Debianテストサイト::2008年12月10日の、libjpegの項。
ほぼそのまんまですけど一応書いておきます。
あ、PATHを通すのを忘れずに。
$ export PATH=~/fonera/trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/bin:$PATH
$ wget ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
$ tar xvzf jpegsrc.v6b.tar.gz
$ cd jpeg-6b/
$ ./configure –build=i686-linux –host=mips-linux –enable-shared –prefix=~/fonera/trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/
で、できあがったMakefileを手で修正。
$ vi Makefile
CC=mips-linux-gcc
AR=mips-linux-ar rc
の2行だけ直せばOK。これってconfigure時点で設定できないのかなぁ。わからんけど。
その後の手順も参考サイトの通りに
$ make CC=mips-linux-gcc
$ make install
でOK。make installするのにsudoする必要はなし。
これでtrunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2/lib/にlibjpeg関連のファイルが一通り入る。
というところでuvccaptureのmakeに移る。
$ cd ~/fonera/trunk/openwrt/test/
$ wget http://staticwave.ca/source/uvccapture/uvccapture-0.5.tar.bz2
$ tar xjf uvccapture-0.5.tar.bz2
$ cd uvccapture-0.5/
こちらはすでにMakefileがあるので、書き換えてやるところから。
CC=mips-linux-gcc
PREFIX=~/fonera/trunk/openwrt/staging_dir/toolchain-mips_gcc4.1.2
CPP書き換えるの忘れたままコンパイルしちゃったけど、通ったので問題なし。
書き換えるなら多分CPP=mips-linux-g++かな。
installしないので、PREFIXとか書き換える必要あるのか不明。
で、
$ make
成功すればuvccaptureというファイルが同じところに作成される。
で、これをFON本体に転送する。面倒なので、Apache起動してHTTP経由で転送する。
$ sudo aptitude install apache2
$ sudo cp uvccapture /var/www/
併せてlibjpeg.so.62というファイルが実行に必要なので、それもコピーする。
$ sudo cp ../../staging_dir/toolchain-mips_gcc4.1.2/lib/libjpeg.so.62 /var/www/
ここまででdebian側の作業は終了!
FONのSSHに戻って作業を続けます。あと少し。
FON側からはDebianのIP指定してファイルをwgetで取ってくればOK。
# cd ~
# wget http://192.168.0.x/uvccapture
# wget http://192.168.0.x/libjpeg.so.62
# mv libjpeg.so.62 /lib/
で、
# ./uvccapture
で、
snap.jpgができたー!ヽ(´ー`)ノ
# ./uvccapture -h
でヘルプ出せます。
2台目のカメラにアクセスしたいときは/dev/video1を指定してやればOK。
# ./uvccapture -d/dev/video1 -osnap1.jpg -x960 -y720
とかすれば、2台目のカメラから960×720でスナップショットを撮影して、snap1.jpgというファイルに保存できます。
思ったより処理も遅くないので使えそう。
ちなみに960×720よりも大きい解像度で撮影しようとすると、YUYVフォーマットに変更するらしいのだけど、試しに1280×960にしてみたら問答無用でFONが落ちたのでもうやりません。
YUYVフォーマットモードは-mオプションでも指定可能。YUYVにするだけなら落ちない。-qオプションでJPEG圧縮率変更するとYUYVになります。
以下は全滅の例。
# ./uvccapture -d/dev/video1 -osnap1.jpg -x1280 -y960 -q60
# ./uvccapture -d/dev/video1 -osnap1.jpg -x1600 -y1200 -m -q30
# ./uvccapture -d/dev/video1 -osnap1.jpg -x2304 -y1728 -q30 -v
あとuvccapture、便利なことにインターバル撮影機能も付いてます。撮影したあとに指定したコマンドも実行できるという。
これでファイルPOSTすればいいってことですな。uvccaptureをふたつ起動してしまうと同期取れないのでその辺はちょっとこれから改造。
しかしこれは結構遊べるなぁ。コンセント差すだけで動くリモートWebカメラを作りたい。