24時間でつくるFlashで画像認識
最近、Adobe CS3を買いました。待望のIntelMacネイティブです。
めちゃくちゃ速いです。PhotoshopもFlashも。これさえあればなにもいらないくらい。
ご存知のようにFlashはビデオを取り込むのがかなり簡単にできます。
しかも取り込んだビデオ映像をピクセル単位で加工するのも簡単です。
だとしたら、最近流行りのAR(拡張現実)のまねごとっぽいこともできるのでは!?
と思ってやってみました。メチャクチャ忙しいほど燃える自由研究です。
1)月曜の夜
ふと思い立って、ネットでビデオ取り込みのサンプルを見つけました。
まず、単純な色認識だけやってみます。
赤いところ、青いところ、緑色のところを見つけ出してそこの重心に白い点を打つ。
簡単ですね。
一時間ほどやったところで友人に呼び出しを食らって銀座のイタリアーナOseiへ。Oseiは「おうせい」と読むのですが、これって逢瀬とかけてるんでしょうか。隠れ家的魅力のある素晴らしいワインバーでした。料理も絶品。
2)水曜朝 9時に起床し、そのままコーディング
ハッシーと飲んで戻っていろいろ別のことをしていたら、五時くらいになっていました。慌てて眠ったものの、9時には目が覚めてしまい、しかたがないのでその勢いでコーディング。
今度は本格的な画像認識に挑戦!?とばかりにいろいろと文献を調べます。
ARToolKitを使った拡張現実感プログラミング
ここによると、加藤博一先生とワシントン大学が開発したARToolKitを使うのがてっとりばやそうです。
しかし、ARToolKitはもちろんC言語。しかもなぜかIntelMacではコンパイルが通りませんでした。
気が短かった僕は、ソースを読むことに。
その結果解ったこと。
[1]画像認識をするためには、まず画像を解析し、関連する点群を結びつける「ラベリング」という処理が不可欠
[2]認識する画像を正方形に限定すれば、自然に正方形の形状を認識するのは簡単そう
とりあえずこのページのソースを参考に、ラベリング処理とやらを実装してみました。
ちょっと苦労したけど難なく完成。先人の知恵はかくあるべしといったところです。
ラベリングができたら、あとはこれの端点を結んで正方形をつくれば、正方形の中身をパターンマッチするだけでそのパターンが画面上のどの位置にあるのか、どんな角度にいるのかを求めることが出来ます。なんだ、簡単じゃないか。
と思ったところで12時になり、溜池山王へ移動
3)水曜三時 会議の合間にコードを書く
次の会議まで30分だけ時間があったのでいそいそと席に戻り、端点を結んで矩形を描画するところを作りました。
ActionScript2.0に慣れてないせいか、ふつうに直線を引く方法がどうしてもわからず、ブレゼンハム法で1ドットづつ描画するという地獄のような無駄コードを書きました。
ちゃんと黒い部分がラベリングされて、しかも矩形で囲まれてる!ちょっと認識っぽい感じがしてきて感動です。
と思ったら会議スタート
4)水曜5時 面接直前にコードを書く
会議が1時間前に終わり、面接まで時間があったのでまたコードを書きます。
といってもここまでくればほぼ終わり。
自分で2次元コードもどきを印刷します。まずは黒い四角で囲まれた真ん中が黄色いコード。
画面上で黒枠に黄色のものだけを囲む処理を入れました。
出来た。と思ったら面接です。
5)水曜深夜 取引先からもどってきてまたコーディング
取引先で打ち合わせをしたあと、水道橋の牛角で夕飯です。牛角大好きです。
帰社してさらにコーディング。
もうほとんどできたようなものですが、ここに画像の方位を検出するため、こんどは赤と黄色で塗り分けたマーカーを用意しました。矩形のそれぞれの辺の中点を通る直線上に画像をスキャンし、赤い部分と黄色い部分でどちらの方が多かったかを測定。赤が最も多い側を「上」と考えることにしました。
出来た。
ついでに方位が出たので、Flashですから画像を重ねてみます。
矩形の重心から方位のある中点に向けて伸びるベクトルのアークタンジェントを求めて、画像を回転させました。
なぜかパンダの画像を貼ったのですが、ネットで適当に拾ってきたものなので一応モザイクをかけてあります。
いやあできました。
Flash、凄いっす。
しかも今回はなにかを間違ってしまい、ActionScript2.0でコーディングしましたが、AS2.0でも画像認識くらいは軽く作れてしまうんですねえ。
複数の認識対象もちゃんと認識。都合によりパンダは一頭しか出ません。
これができるとなにができるかというと、三国志大戦のような、カードを並べることがゲームになっているようなゲームを作ることが出来ます。まあ本当は、ちゃんと認識させるならパターンの部分もちゃんと認識させないとダメですが、とりあえず自由研究なので今回はこのあたりで妥協です。
これはAS3でも使えるようにクラス化したほうがいいかもしれません。
アルゴリズム的には非常にオーソドックスなものの組み合わせで画像認識っぽいことができることが解ったので、これを使ってなにか面白いことが出来ればいいなと思っています。
| 固定リンク







最近のコメント