FLARToolKitで、枠線の無いマーカを利用可能にしてみた。
以前のエントリで、マーカの誤認識について書いたところ、
問題なのは、ARToolkitの場合、評価対象になるマーカーの正規化部分が、1:2:1比率の内側になってるので、ARisさんのマーカーを使うと、真ん中部分しか判定の対象にならないこと。
(白部分をサンプリングして評価パターンを作ってる。)
この比率は、NyARColorPatt_O3クラスの(FLARToolkitだとFLARColorPatt_O3かな?)のupdateExtpat関数の、xwとywの辺りを変えればいじれる。(計算式はちゃんと解析して無いから、具体的な数値はわかりません。ごめんなさい)
ARisさんのマーカー認識 - A虎@Hatena::Diary
このように詳細な情報を教えていただいた。
で、その後ARisのマーカ認識をやっていく上で、
側面4面を1つのマーカで1回認識した後、右上の差分の所をもう一回調べて
前後左右を検知すると言うアイデアを思いつき、実装してみたんだが、
やはり誤認識が多い。
ただし、側面と他の面を誤認識するのではなく、面の向きを間違える。
前後左右の向きではなく、何と言うのか・・・傾きって言えばいいのかな?
画面上のマーカが、寝転がってるとか、逆立ちしてるとか、そういう向き。
側面マーカの右上部分を再調査すると言う現状のアルゴリズムだと、
この傾きの間違いが致命的になる。
と言う事で、A虎@さんの情報を元に、枠の無いマーカを作る方法を発見した。
ただし、Twitterでは大口叩いたが、
完全に分かったわけではなく、数値をどのように弄れば枠と中の比率を変えれるかだけ分かった。
枠とマーカの比率調整
基本的に、ARToolKit用のマーカは枠線1に対して中身2の比率となっている。
FLARToolKitも勿論同様。
基本的には、枠を含んだマーカ全体が80mm、枠の太さが20mmで、中の正方形が一辺40mmとなっている。
詳しくは以下を参考にして欲しい。
工学ナビの中の人の研究と周辺 ARToolKitのマーカについて
Saqoosha.net :: ARToosKit Marker Generator for Adobe AIR
では、何処を変更すればこの比率が変わるか。
それはズバリここ。
FLARColorPatt_O3.as#updateExtpatの328行目、以下の部分でX方向の枠と中身の比率が、
同じく339行目の、以下の部分でY方向の枠と中身の比率が変わる。
ここにある、102.5と5.0が実は重要で、この2つの数値が、
100 + マーカ全体を10とした場合の枠の太さ
と、
マーカ全体を10とした場合の中身の大きさ
を表している。
基本的なマーカの場合、枠が20mmで中身が40mm、丁度2.5と5.0の比率と合っている。
このiやjがfor文のループ変数なのだが、ywの最小値は102.5ちょいで、最大値が107.5ちょい。
100-102.5-107.5-110の流れが、マーカの枠と中身と丁度同じ流れになってる。
で、実際に変更する場合、枠無しだったらこうする。
yw = 100 + 10.0 * ((double) j + 0.5) / i_ydiv2;
ちなみに、
xwとywで値を変えれば、中身部分が長方形のマーカも作れるはずだ。
理屈的な話
何故こうなっているかがよくわからないのだが、
FLARColorPatt_O3.asの143行目にある以下のメンバwk_pickFromRaster_worldが関係しているようだ。
このメンバは、「cpara」なる物を作るのに使っている。
この辺りの詳細が全く分からない。何故100なのか?何故10なのか?
cparaって何なのか?
枠の太さを指定できるようにしてみた
その辺りは要調査だが、とにかくこれで枠の無いマーカが作れる。
と言うか、枠と中身の比率をコンストラクタで調節可能なクラス
「FLARDynamicRatioColorPatt_O3.as」を作成し、Spark Projectにコミットしてみた。
枠線の無いマーカを利用したい時の使い方は、
Detectorクラス内でこんな風に作って使う。
あと、このクラスでは、updateExcpatの上述の部分だけでなく、
pickFromRasterにも以下のような変更を加えてある。
・・・
l1 = l1 / 4;
・・・
l1 = l1 / this._pickFromRasterDivideY;
元々は最大64の所、マーカの分割数が16と言う前提で64/16で4だったのだろう。
が、今回は精度向上のために32×32のマーカを使いたかったので、
分割数にあわせて割る数を変更するようにしてみた。




