読者です 読者をやめる 読者になる 読者になる

元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。
Javaとか組込とかできます。お仕事ください。

NyARToolkitでのキューブ型マーカーの認識方法を考えてみた

ARToolkitだとちょっとバラすのが面倒なので、NyARToolkitでやるときの方法と言うかメモ。他にも方法有ると思いますが、計算量と精度がそこそこ期待できるのを考えてみます。

まず前提条件

  1. マーカー面は6面、全部異なる図柄を使う
  2. マーカーの大きさは4cm以上。キューブの一辺は5cm以上
  3. キューブの縁とマーカーの辺の間には、空白があること
  4. マーカーは1面のみ利用。つまり、複数のマーカーを認識して精度を高めるような事はしない。

そんなもんだろうか。

マーカーの検出

次にマーカーの検出部分を考える。
画像を2値かして、ラベリングして、矩形候補を検出。ここまでは今までと同じでOK。

検出したマーカーのうち、一番面積のデカいものを捜す。これには訳があって、画像からマーカーの2次元座標と辺を計算する時は、そのマーカーが大きいほど、主成分分析の精度が良くなるから。

最後に、そのマーカーが6面のどれに当たるのかを、パターンマッチで調べる。これでマーカーの検出はおしまい。

座標計算

計算対象のマーカーは1個だけなので、今までどおり座標変換すればOK。そのあとに、6面の位置関係を考慮した行列を掛ければ、めでたく基準位置が求まると思われる。

補足

座標変換処理による負荷は、1マーカーのみの誤差修正無しならば、1マーカーと変わらないはず。問題は、マーカーの検出で発生するマーカー位置の計算。最大3マーカーを同時に認識する事になるので、主成分分析と歪み補正から結構な負荷を出すはず。これを解消するには、歪み補正マップ対応のNyARToolkit2.1を使えばOK。主成分分析は、固定少数版NyARToolkitに実装してある、輪郭座標群から固定数の輪郭点を抽出してPCAを掛ける仕組み(サンプリングPCA)を持ってくれば大丈夫。片方で1/2、両方で1/10くらいの負荷になるはず。サンプリング数は、1辺あたり30点も取れば、結構安定します。

マーカー検出段階でマーカー同士の位置関係からグループ化して誤検出を減らすとか、複数のマーカーを使って精度を高くしたりもできるんだけど、大変そうなのでまたこんど考えよう。

具体的にはどーするのか

NyARToolkitなら、NyARSingleDetectMarkerをばらして組み立てる事になるのかな?時間が出来たらやってみよう。あー・・でも、サイコロ買ってこないと。

ARToolKitだと・・・マーカーのパターンマッチと検出が、結構べったりなつくりになってたと思うから、パターンマッチ処理をすっ飛ばすとなると、その辺をバラすのが面倒かもしれない。うろ覚えだけど。