FLARToolKitで、枠線の無いマーカを利用可能にしてみた。

  • このエントリーをはてなブックマークに追加
  • 0

以前のエントリで、マーカの誤認識について書いたところ、

問題なのは、ARToolkitの場合、評価対象になるマーカーの正規化部分が、1:2:1比率の内側になってるので、ARisさんのマーカーを使うと、真ん中部分しか判定の対象にならないこと。

(白部分をサンプリングして評価パターンを作ってる。)

参考:工学ナビの中の人の研究と周辺 20080917

この比率は、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方向の枠と中身の比率が、

ActionScript

  1. xw = 102.5 + 5.0 * ((double) i + 0.5) / i_xdiv2;

同じく339行目の、以下の部分でY方向の枠と中身の比率が変わる。

ActionScript

  1. yw = 102.5 + 5.0 * (j + 0.5) / i_ydiv2;

ここにある、102.55.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の流れが、マーカの枠と中身と丁度同じ流れになってる。

で、実際に変更する場合、枠無しだったらこうする。

ActionScript

  1. xw = 100 + 10.0 * ((double) i + 0.5) / i_xdiv2;
  2. yw = 100 + 10.0 * ((double) j + 0.5) / i_ydiv2;

ちなみに、
xwとywで値を変えれば、中身部分が長方形のマーカも作れるはずだ。

理屈的な話

何故こうなっているかがよくわからないのだが、
FLARColorPatt_O3.asの143行目にある以下のメンバwk_pickFromRaster_worldが関係しているようだ。

ActionScript

  1. private const wk_pickFromRaster_world:Array = [[100, 100], [100 + 10, 100], [100 + 10, 100 + 10], [100, 100 + 10]]; // double world[4][2];

このメンバは、「cpara」なる物を作るのに使っている。
この辺りの詳細が全く分からない。何故100なのか?何故10なのか?
cparaって何なのか?

枠の太さを指定できるようにしてみた

その辺りは要調査だが、とにかくこれで枠の無いマーカが作れる。
と言うか、枠と中身の比率をコンストラクタで調節可能なクラス
FLARDynamicRatioColorPatt_O3.as」を作成し、Spark Projectにコミットしてみた。
枠線の無いマーカを利用したい時の使い方は、
Detectorクラス内でこんな風に作って使う。

ActionScript

  1. new FLARDynamicRatioColorPatt_O3(code.getWidth(), code.getHeight(),0,0);

あと、このクラスでは、updateExcpatの上述の部分だけでなく、
pickFromRasterにも以下のような変更を加えてある。

ActionScript

  1. l1 = l1 / 4;
  2. ・・・
  3. l1 = l1 / 4;
ActionScript

  1. l1 = l1 / this._pickFromRasterDivideX;
  2. ・・・
  3. l1 = l1 / this._pickFromRasterDivideY;

元々は最大64の所、マーカの分割数が16と言う前提で64/16で4だったのだろう。
が、今回は精度向上のために32×32のマーカを使いたかったので、
分割数にあわせて割る数を変更するようにしてみた。

スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク