AR (Augmented Reality) の技術が知りたくなり、物体認識をJavascriptで試してみた時のメモ。
画像処理で物体を認識するには下記のようなステップが必要になる。
マークを利用したARでは色情報は使わないので、扱いやすさの観点からまずグレースケールにしてしまう。
ノイズ低減のためにぼかす。今回はガウスフィルタを使用したが、輪郭もぼけてしまうので、メディアンフィルタを利用した方がいいかもしれない。
いくつかアルゴリズムが存在するが、単一のしきい値を用いるアルゴリズムでは、濃度が異なるときにうまくいかない。そこで、適応的二値化を用いて、画素ごとに近傍のヒストグラムの中間値からしきい値を算出した。これにより、暗い中での白黒と明るい中での白黒を同じように二値化できる。近傍のヒストグラムの作成では、ひとつ飛ばしでサンプリングを行ってもあまり結果は変わらないので、高速化につながる。
しかし、このままだと濃淡がない領域で無理に二値化されてしまい、ノイズとなってしまうため、減算定数を利用する。
連結した複数の画素をひとつのグループとして認識するために、ラベリングを行う。LUTの更新作業につまづいたが、常にルックアップ先のラベル番号を見て番号の更新を行えばよい。
色付け表示はラベル番号をもとに三角関数を使いRGBの値を変動させた。
ここでやっとオブジェクト認識の入り口に入ることができる。今回は簡単にxyzに傾きのないマークだけを想定する。
ラベリングができているので、ラベル番号ごとにTop-Left、Bottom-Rightが分かるため、外接矩形の縦横比から形の推測ができる。また、マークの白黒比を条件に含めれば、なんとなくマーク部分が抽出できる。
以上のステップで、あまり効率を考えずにJavascriptでコーディングをしたが、10 fpsを出すことができた。効率化を行えば30 fpsはでると思う。
最近ではARなどの画像処理ライブラリも出てきているので、何かを実際に作る場合にはそれらを利用することになると思うが、技術を理解するために一から作ってみるのはいいことだ。
http://blogs.yahoo.co.jp/kai_yamamoto/folder/1508761.html
http://schima.hatenablog.com/entry/2013/10/19/085019
http://web3.yam.info.gifu-u.ac.jp/~pattern/wiki.cgi?page=%C2%E87%B2%F3+%A4%BD%A4%CE1
http://shokai.org/blog/archives/1359
http://www.cuspy.org/diary/2012-06-29