スキップしてメイン コンテンツに移動

投稿

7月, 2009の投稿を表示しています

Processingを使ってWebカメラを監視カメラにする

Processingvideoライブラリを利用して、手持ちのWebカメラを防犯・監視カメラにしてみることにした。監視カメラとして、以下の2点を満たすこととする。

動くものを捕らえたときだけ写真を残す。写真は指定のメールアドレスに直ちに送信される。
今回、コードを書くに当たって、Webカメラ関連については建築発明工作ゼミ2008、メール送信についてはE-mail Processingを参考にさせてもらった。特に建築発明工作ゼミ2008については他にもProcessing関連の有益な情報があって重宝する。

因みに、今回用いたWebカメラはずいぶん前に購入したLogitechのQuickCam for Notebooks Proだ。多分、大抵のWebカメラで問題なく動作すると思う。

それでは、早速作成してみる。

下準備

まず、ProcessingでWebカメラを利用するには、QuickTimeが必要になるので予め用意しておく。また、WindowsについてはQuickTimeでWebカメラを利用するためのVDIG (QuickTime-compatible video digitizer)をインストールする必要がある。このとき、最新バージョン(1.04/1.05)では動作時にエラーが起こるようなので、バージョンは1.01を用意すること。

次に、Processingでメール送信を行うために、JavaMailJavaBeans Activation Framework (JAF)をダウンロードする。JavaMailからmailapi.jarとsmtp.jar、JAFからactivation.jarを取り出す。そして、Processingの作業フォルダ(コーディングしているファイルの存在するフォルダ)にcodeという名前のフォルダを作成し、その中にその3つのjarファイルをコピーする。

これで下準備は完了だ。

コーディング

ライブラリについては、ビデオ関連でprocessing.video、電子メール関連でjavax.mailをインポートする。setup関数でvideoオブジェクトを作成し、draw関数で映像を表示する。今回は320×240の解像度に設定した。次にカメラの映像から、以前の画像と現在の画像との差をピクセルごとで比較し、その差が許容値(torelance…

Google App Engine: 簡単にグラフ・チャートを作成する

ブログなどでちょっとしたグラフを表示させたい場合、Google Chart APIを使っていた。しかし、手作業で入力するのはかなり面倒だ。ウェブ上にはグラフやチャートを作成するサービスなどもあるが、登録が必要だったり、手順が面倒だったりと、個人的にはあまり手軽だと思えない。数値をコピー&ペーストしてクリック一つでグラフを作成したいのだ。そこで、使いたいサービスは自分で作ってしまえということで、Google App Engine (GAE)とGoogle Chart APIを使って簡単にグラフ・チャートを作成するウェブアプリを作ってみた。

簡易グラフ・チャート作成

即席で作成したウェブアプリなので不備な点もあるが、取り敢えず自分で使う分にはこの程度で十分なのでGAEに登録しておいた。気が向いたら機能を拡張していくかもしれない。

以下に使い方を示す。

使い方

まず、以下のデータをテキストエリアに入れてみる。

1.2 2.2 3.5 5.6 2.8

次に、「作成」ボタンを押す。チャートの種類が「折れ線グラフX」になっていれば、入力データをもとに以下のようなグラフが描かれる。


グラフのX軸、Y軸の下限と上限、およびその目盛り分割は自動で行われる。もちろん、手動での設定もできるし、自動で設定された数値を修正することも可能だ。また、出力画像ファイルの大きさも、グラフの色(16進数6桁[RGB]で表示)も変更できる。タイトルを表示したければタイトル欄に入力すればよい。因みにタイトルを改行させるには | を入れる。さらに、下記のようなGoogle Chart APIによるURLも表示するようにした。このURLを画像URLとしてブログなどで利用すれば、上のグラフを表示させるのも簡単だ。

http://chart.apis.google.com/chart?chs=300x200&chd=t:1.2,2.2,3.5,5.6,2.8&chds=1,6&cht=lc&chco=4d89f9,c6d9fd&chxt=y&chxl=0:|1|2|3|4|5|6

現時点で利用できるグラフの種類は、「折れ線グラフX」、「折れ線グラフXY」、「スパークライン」、「積上横棒グラフ」、「積上縦棒グラフ」、「集合横棒グラフ」、「集合縦棒グラフ…

Python: 階層的クラスタリングのデンドログラム描画と閾値による区分け

前回、「C++: マルチコアCPUを利用した並列化による高速な階層的クラスタリング」でクラスタリングを行ったのだが、ここではその出力データをPython+PILにより、デンドログラムを描画したり、指定した閾値で区分けを行ってみる。

まず、クラスタリングの出力データは前回のtest.outを使用する。内容は以下の通りだ。

0.0833487 4 14 0.11483 3 15 0.123895 0 5 0.126783 7 11 0.144271 16 -4 0.14854 8 9 0.253505 -5 -6 0.264889 -1 -3 0.301108 2 10 0.366858 6 -2 0.382649 13 -7 0.439469 17 19 0.588505 18 -8 0.648837 -10 -11 0.80762 -9 -13 1.03717 1 12 1.16488 -14 -15 1.46078 -12 -16 2.92199 -17 -18

これを下記のPythonのコードで処理すると、以下のようなデンドログラムが作成される。


使い方は、

draw_clusters.py test.out test.jpg

または、

draw_clusters.py test.out test.jpg labels.txt

とする。test.outは入力するクラスタデータ、test.jpgは出力されるデンドログラムの画像ファイルだ。また、二つ目に示した使い方では、labels.txtにデータ数分の文字列を入れておくことで、デンドログラムの数字を任意のラベルにすることができる。因みにこのデンドログラム表示プログラムについても、「集合知プログラミング」を参考にさせてもらった。

draw_clusters.py

#!/usr/bin/env python """ Draw dendrogram for hierarchical clustering by nox, 2009.07.02 """ import sys, os from PIL import Image, ImageDraw HEAD_LENGTH = 50 TAIL_LENGTH = 150 WIDTH = 1200 H…

C++: マルチコアCPUを利用した並列化による高速な階層的クラスタリング

比較的データ数の多い階層的クラスタリングを行う必要があり、手元にあるRで処理を始めたのだが思ったよりも遅かった。そこで、マルチコアCPUを利用した並列化で高速化することにした。RでもGPGPUを使って高速化したプログラムがあるようなのだが、すぐに使える高性能GPUを用意できなかったし、それに、TBBライブラリを使った並列化は手間も時間も掛からないので作ってしまった方が良いと判断した。

尚、このプログラムで作成したクラスタデータのデンドログラム描画や閾値による区分けについては一つの記事で書くには大きすぎるので、記事を分けて、「Python: 階層的クラスタリングのデンドログラム描画と閾値による区分け」に回すことにする。

まずは、「集合知プログラミング」にPythonによる階層的クラスタリングのソースコードが載っていたのでそれをC++で書き直した。アルゴリズム自体はそれほど複雑なものではないのでコーディングは簡単だった。ただ、クラスタ同士の距離を最遠隣法(complete link)にしたかったので、それについては変更を加えた。また、TBBライブラリを利用するために、分割して計算を行う部分については関数オブジェクトで実装した。

余談だが、この「集合知プログラミング」はかなり良い書籍だと思う。Pythonを使っているのでコードも読みやすい。興味のある方は是非読んでみて欲しい。

完成したソースコードは最後に示しておいた。赤で示した部分がユークリッド距離を計算する関数であり、この部分を変更することで、べき乗距離にすることも、マンハッタン距離にすることも、別のどんな指標にすることも、簡単にできる。因みに自分はRMSDの2乗で計算を行った。また、青で示した部分が最遠隣法の計算部分であり、ここを書き換えることで群平均法や重心法などの他の結合方法に変更することができる。

入出力データについてだが、任意の次元数の1データをスペース区切りの一行とし、複数データを格納したファイルを入力ファイルとしている。そして、結合する距離、データの番号のペアを一行としたデータが出力ファイルとして書き出される。番号は入力データを正の整数(0~)として、データの集合体であるクラスタを負の整数(-1~)として扱っている。

それでは実際に計算してみよう。まず、以下のような入力ファイルを用意する。この…