最近、ARToolKit Marker Generator Onlineと言うコンテンツが
結構世界中で愛用されているようないないような、かすかな手応えを得ている訳だが、
俺がつけた新機能である、
- マーカ枠サイズ変更機能
- 分割数変更機能
について、原理を含めて細かく解説していきたいと思う。
つまり、
- ARToolKit用のマーカの枠の役割は?
- 分割数って何?
について解説する。
枠の部分に関してはFLARToolKit依存の部分もあるが、
基本的には全てのARToolKit派生ライブラリに適用できる話なので、
参考になればうれしい。
そして、間違っている部分に関しては指摘をいただきたい。
が、その前にまず用語の整理を行おう。
マーカは、枠と中の絵で出来ている。
この解説では、中の絵の事を「マーカ本体」、
枠とマーカ本体を合わせて「マーカ全体」と呼ぶ。
あと、英語ブログで売れていた、AR関連と思われる本とか3冊。
マーカ検索の流れ
まず、基本的にARToolKit(及び派生ライブラリ)では、
マーカを検索するために2つのステップを踏んでいる。
- 画像内から、「これはマーカかも知れない」と判断できるような四角形(マーカ候補)をたくさん見つける
- マーカ候補内部のマーカ本体の位置をスキャンし、マーカかどうかを判断する
この2ステップによって、一番マーカっぽい四角形が見つけられ、
それをマーカとして扱っているのだ。
基本的にはこの2ステップを、入力画像に対して行う。
つまり、動画であれば全フレーム行うわけだ。
枠の役割
まず、マーカの枠の役割について説明する。
実は、この枠の役割は
「マーカ候補の四角形を、入力画像内から探す」
事である。
え?そんなこと?と思われるかもしれないが、
実際、マーカ候補の四角形がマーカかどうか調べる際には、
マーカ部分は除外されているので、他に役割は無いと言える。
逆に言うと、他の手段で四角形を探索できれば、
こんな阿呆みたいに太い枠は要らないということだ。
特にFLARToolKitでは、この部分で、
結構特殊な、かつActionScriptならではの方法を採用している。
まず、FLARRasterFilter_BitmapDataThreshold#doFilter
内で、
BitmapData#applyFilter
やらBitmapData#threshold
で画像を加工し、
その後FLARLabeling_BitmapData#labeling
内で、
BitmapData#getColorBoundsRect
で四角形を探している。
(細かい抜けがあるかもしれないので、実際にソースを見て確認してほしいが)
と言うことで、この「四角形を探す処理」の部分について
調査すれば、どんなマーカであれば認識できるのかがわかり、
結果的に枠の制限から飛び出すことが出来るかもしれない。
たとえばFLARToolKitでは、電脳フィギュアARisの
特殊なマーカを普通に認識することが出来る。
コラム
「枠の幅」は、ARToolKit Marker Generator Onlineで変更可能な値で、
一番細くて0にまで出来る。
0の場合、マーカ候補の四角形全体を、マーカとして扱うことが出来る。
枠が一切なくなるため、かなり表現に幅が出ると思われるが、
一応、四角形として認識可能にしておく必要がある。なので、デザインを上手く使って、それなりの外枠を残す必要があると言える。
例えば、電脳フィギュアARisのマーカは、黒ベースになっているため
枠っぽいものが無くてもちゃんと認識できる。
このように、マーカの背景を黒にしておくと言うのは有効だ。
枠の幅
次に、枠の幅について解説。
さて、この枠は見てわかるとおり、凄く太い。
正確には、幅がマーカ本体の幅の半分になっている。
これは「暗黙の了解」らしい。
確かに、FLARToolKitですらソースを見るとそのようになっているのだが、
「特に仕様として明文化はされていない」
と言う意味なのだろうか?
(参考サイト)
前述の通り画像内からマーカを見つけ出すためだけに存在している枠は、
マーカ候補の四角形が見つかった時点で用無しになる。
コード上でも、マーカ候補がマーカかどうかを検査する際に、
枠部分はバッサリ切り取られている。
そして、この「枠をバッサリ切り取る」という処理が、
「枠と本体の比率が1:2:1である必要がある」
理由になっている。
と言うのも、実際には「枠を切り取る」のではなく、
上下左右25%ずつを、枠と決め付けて切り取っているからだ。
つまり、細い枠線を使ったとしても、ARToolKitは全く関係なく切り取ってしまう。
例えば、このサイトウサンマーカ、ちょっと枠が細いが、
ARToolKit的には枠の太さはやっぱり1:2:1で変わらない。
- 枠線が細いサイトウサンマーカ
- 実はこれと同じ。
時々、ARToolKitについて「マーカの枠は細くても大丈夫」
と言う解説があるが、実際のところは枠を細くしたとしても
プログラム上では太いままの扱いなので、本体中心部分でちゃんと差を出さないと
上手く認識してくれなくなるので注意が必要だ。
コラム
ちなみに、ソース上では
FLARColorPatt_O3#updateExtpat
にて、以下のように表現されている。
xw = 102.5 + 5.0 * (i + 0.5) / i_xdiv2; yw = 102.5 + 5.0 * (j + 0.5) / i_ydiv2;この、「2.5」が、25%を意味している。
枠の幅(片方)がマーカ全体の幅の25%を占めていると言う意味だ。
次の「5.0」が50%を意味している。
マーカ本体の幅がマーカ全体の50%を占めている。
で、合計すると107.5になるので、残り2.5(25%)。
この最後の25%が、枠の幅(もう片方)だ。俺が作った
FLARDynamicRatioColorPatt_O3
では、
この2.5や5.0の値を可変にすることで、枠幅を変更することが出来ている。
マーカの分割数
ARToolKitの標準では、マーカは16分割されている。
パターンファイルを見ても、スペース区切りで1行に16個の数字が
並んでいるのがわかるが、アレが16分割の印だ。
なお、縦は食う業が出てくるまでに48行あるが、
アレは色成分が赤、青、緑の3色あるので、16×3で48になっている。
さて、ARToolKitにおける、マーカの分割数とは何か?
それは、マーカ本体の絵を見る際の粒度だ。
ARToolKitでは、マーカ本体の絵を縦16、横16に分割し、
そのエリア内の色の平均値を算出している。
- こんな感じだ。
そして、その平均値の集合をパターンとして持っているのだ。
パターンファイルも、勿論その数値になっている。
(正確には少し加工してあるが)
当然、マーカ候補の四角形を見つけた時も、同じ事をしている。
この、マーカ本体を分割すると言う作業があることで、
どんな大きさのマーカ候補にも対応することが出来るのだ。
例えば、ARToolKitの標準マーカ、Hiroの場合、
この記事のデモ(ウチの英語ブログの記事。画像クリックすると開始)
FLARCodeImage:Utility for FLARToolKit << flash.tarotaro.org.blog
にあるような感じで認識されている。
このデモでは、パターンファイルを画像化して、ちゃんとマーカ認識を行わせている。
つまり、このモザイクのような画像でも、あの「Hiroマーカ」と同じ役割をするのだ。
このことから分かる様に、細い線のみで描かれた絵をマーカにしようとすると、
殆ど認識されない。
16×16の分割が上手く機能するように、考えてマーカをデザインする必要があると言うことだ。
コラム
さて、ARToolKit Marker Generator Onlineを使えば、
枠の幅を一番細くて0にまで変更することが出来る。
枠の幅が0の場合、マーカ候補の四角形全体を、16×16に分割することになるのだが、
1つのマスが面積的に言うと標準マーカの倍になる。
つまり、かなり大味な認識をすることになるのだ。そこで、分割数を増やす必要がある。
そのために、ARToolKit Marker Generator Onlineでは
Segmentsの値を変更することでマーカの分割数を
最大64×64に変更することが出来るのだ。