ARプレイカードをNy/FLARToolkitで使う

SCEさんがARマーカを大量印刷してくれるそうなので、NyARToolkitのMarkerSystemからARプレイカードを使えるようにしました。

 

紹介記事→SCEJ、PS Vita「ARプレイ」を6月28日より開始

パッケージ化はしていないので、リポジトリから直接チェックアウトしてください。

使い方

SimpleLiteをARプレイカードで動かすには、次のコードを書きます。
個のサンプルはJavaですが、ActionScriptでも同じAPIが用意されています。


package jp.nyatla.nyartoolkit.jogl.sample.sketch;

import javax.media.opengl.*;
import jp.nyatla.nyartoolkit.core.NyARException;
import jp.nyatla.nyartoolkit.jmf.utils.*;
import jp.nyatla.nyartoolkit.jogl.sketch.GlSketch;
import jp.nyatla.nyartoolkit.jogl.utils.*;
import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;

public class SimpleLite extends GlSketch
{
  private NyARJmfCamera camera;
  private NyARGlMarkerSystem nyar;
  private NyARGlRender render;
  public void setup(GL gl)throws NyARException
  {
    this.size(640,480);
    NyARMarkerSystemConfig config = new NyARMarkerSystemConfig(640,480);
    JmfCaptureDeviceList devlist = new JmfCaptureDeviceList();
    JmfCaptureDevice d = devlist.getDevice(0);
    d.setCaptureFormat(config.getScreenSize(),30.0f);
    this.camera=new NyARJmfCamera(d);//create sensor system
    this.nyar=new NyARGlMarkerSystem(config);   //create MarkerSystem
    this.render=new NyARGlRender(this.nyar);
    this.id=this.nyar.addPsARPlayCard(5,80);
    gl.glEnable(GL.GL_DEPTH_TEST);
    this.camera.start();
  }
  private final static String ARCODE_FILE = "../../Data/patt.hiro";
  private int id;

  public void draw(GL gl)
  {
    synchronized(this.camera){
      try {
        this.render.drawBackground(gl, this.camera.getSourceImage());
        this.render.loadARProjectionMatrix(gl);
        this.nyar.update(this.camera);
        if(this.nyar.isExistMarker(this.id)){
          this.render.loadMarkerMatrix(gl,this.id);
          this.render.colorCube(gl,40,0,0,20);
        }
        Thread.sleep(1);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args)
  {
    try {
      new SimpleLite();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return;
  }
}

重要なのは次の行で、ARプレイカードの5番を、マーカサイズ8cmで登録しています。(ARプレイカードの標準的な大きさがわからなかったので・・・)
this.id=this.nyar.addPsARPlayCard(5,80);

使えるカードは1番から6番までです。もちろん、従来のARマーカやNyIdマーカと混在して使うことも出来ます。

FLARTK、NyARToolKitCSには順次移植していきます。

MQO file viewer

ForumにMQOの表示方法の質問があったので、スケッチ書きました。MQOファイルをHiroマーカの上に表示します。

Source code

MqoView.java


import javax.media.opengl.*;

import jp.nyatla.kGLModel.KGLException;
import jp.nyatla.kGLModel.KGLExtensionCheck;
import jp.nyatla.kGLModel.KGLModelData;
import jp.nyatla.kGLModel.contentprovider.LocalContentProvider;
import jp.nyatla.nyartoolkit.core.NyARException;
import jp.nyatla.nyartoolkit.jmf.utils.*;
import jp.nyatla.nyartoolkit.jogl.sketch.GlSketch;
import jp.nyatla.nyartoolkit.jogl.utils.*;
import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;
/**
 * This program shows a Mqo model.
 */
public class MqoView extends GlSketch
{
  private NyARJmfCamera camera;
  private NyARGlMarkerSystem nyar;
  private NyARGlRender render;
  private KGLModelData model_data; // kei add
  public void setup(GL gl)throws NyARException
  {
    this.size(640,480);
    NyARMarkerSystemConfig config = new NyARMarkerSystemConfig(640,480);
    JmfCaptureDeviceList devlist = new JmfCaptureDeviceList();
    JmfCaptureDevice d = devlist.getDevice(0);
    d.setCaptureFormat(config.getScreenSize(),30.0f);
    this.camera=new NyARJmfCamera(d);//create sensor system
    this.nyar=new NyARGlMarkerSystem(config);   //create MarkerSystem
    this.render=new NyARGlRender(this.nyar);

    this.id=this.nyar.addARMarker("data/patt.hiro",16,25,80);
    try {
      LocalContentProvider content_provider=new LocalContentProvider("data/miku_xx08/miku.mqo");
      model_data = KGLModelData.createGLModel(gl,null,content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"));
    } catch (KGLException e) {
      e.printStackTrace();
      throw new NyARException(e);
    }
    gl.glEnable(GL.GL_DEPTH_TEST);
    this.camera.start();
  }
  private int id;

  public void draw(GL gl)
  {
    synchronized(this.camera){
      try {
        this.render.drawBackground(gl, this.camera.getSourceImage());
        this.render.loadARProjectionMatrix(gl);
        this.nyar.update(this.camera);
        if(this.nyar.isExistMarker(this.id)){
          // Viewing transformation.
          gl.glLoadIdentity();
          this.render.loadMarkerMatrix(gl,this.id);
          gl.glTranslatef(0.0f,0.0f,0.0f) ;//position
          gl.glRotatef(90.0f,1.0f, 0.0f, 0.0f); //OpenGL座標系→ARToolkit座標系
          gl.glEnable(GL.GL_CULL_FACE);
          gl.glCullFace(GL.GL_FRONT);
          model_data.enables(10.0f);
          model_data.draw() ;
          model_data.disables() ;
        }
        Thread.sleep(1);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args)
  {
    try {
      new MqoView();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return;
  }
}

解説

MQOの表示には、keiさん作のKGLを若干改変したものを使用しています。
スケッチの重要な部分は2箇所です。

setupでは、MQOファイルを読み込みます。

  LocalContentProvider content_provider=new LocalContentProvider("data/miku_xx08/miku.mqo");
  model_data = KGLModelData.createGLModel(gl,null,content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"));

drawでは、読み込んだモデルを表示しています。

        if(this.nyar.isExistMarker(this.id)){
          // Viewing transformation.
          gl.glLoadIdentity();
          this.render.loadMarkerMatrix(gl,this.id);
          gl.glTranslatef(0.0f,0.0f,0.0f) ;//position
          gl.glRotatef(90.0f,1.0f, 0.0f, 0.0f); //OpenGL座標系→ARToolkit座標系
          gl.glEnable(GL.GL_CULL_FACE);
          gl.glCullFace(GL.GL_FRONT);
          model_data.enables(10.0f);
          model_data.draw() ;
          model_data.disables() ;
        }

Setup

projectファイルは MqoModel-20120326.zip からダウンロードできます。実効には、JMF、JOGL、NyARToolkit version 4.xが必要です。あらかじめセットアップして置いてください。

Hiroマーカを撮影すると、プリセットされているミクさんのモデルが表示されます。

3D modelについて

プリセットされている3Dmodelは、三次元CG@七葉 nh0072.zipを編集して使用しています。

English

This sketch shows MQO-model above  “Hiro” marker.

Source code

Main program is MqoView.java

Description of source code

MQO library is KGL by kei-san.
The changed parts are below.

  • setup –  MQO loader codes.
  • draw – MQO drawing codes.

Setup

The eclipse project is MqoModel-20120326.zip . The project requires external libraries, JMF ,JOGL, NyARToolkit version 4.x.  Please set up these libraries.

NyARToolkit4.0.3 released

NyARToolkit4.0.3をリリースします。変更内容は、バグフィクスです。RLEラベリングに存在していた致命的な不具合が解消しています。APIについては、基本的に4.0.0と互換性があります。

修正した不具合

修正した不具合は以下の通りです。

#28546,#28540,#28478,#28477,
#28476,#28475,#28323,#28225,
#28067,#28066,#28014,#24229,
#24228,#24215,#27902

ダウンロード

Java/C#/AS3についてはこちらからダウンロードできます。
http://sourceforge.jp/projects/nyartoolkit/releases/

FLARToolKitのPreReleaseはリポジトリからチェックアウトしてください。
http://www.libspark.org/browser/as3/FLARToolKit/branches/nyatla/v4/tags/pre3

NyARToolkit for AndroidのPreRelease版は、リポジトリからチェックアウトしてください。
http://sourceforge.jp/projects/nyartoolkit-and/scm/git/NyARTK4.nyatla/commits/a4949937cb5a3eb2d1b7d6f6b5cd1be02510fbd6

Android版の4.0.1パッケージは、最適化が不十分で低速です。リポジトリからチェックアウトしたコードを使用してください。4.0.3は、Android2.2の端末で、30-60fps(QVGA)で動作します。

English

NyARToolkit4.0.3 was released. Main changes are bugfix. Critical bug in RLE Labeling is fixed. APIs are compatible with 4.0.0.

Bugfix details

#28546,#28540,#28478,#28477,
#28476,#28475,#28323,#28225,
#28067,#28066,#28014,#24229,
#24228,#24215,#27902

Download

NyARToolkit Java/C#/AS3 packages.
http://sourceforge.jp/projects/nyartoolkit/releases/

FLARToolKit Pre-Release repository
http://www.libspark.org/browser/as3/FLARToolKit/branches/nyatla/v4/tags/pre3

NyARToolkit for Android PreRelease repository
http://sourceforge.jp/projects/nyartoolkit-and/scm/git/NyARTK4.nyatla/commits/a4949937cb5a3eb2d1b7d6f6b5cd1be02510fbd6

Android version 4.0.1 package has not optimization, and are very low speeds.
Please use the code 4.0.3 on repository.
4.0.3 is running on Android2.2 and operates by 30-60fps (QVGA).

Spanish

NyARToolkit4.0.3 fue soltado. Los cambios principales son los bugfix. El bicho crítico en Etiquetado de RLE es fijo. API son compatibles con 4.0.0.

Bugfix detalla

#28546,#28540,#28478,#28477,
#28476,#28475,#28323,#28225,
#28067,#28066,#28014,#24229,
#24228,#24215,#27902

Transmita

NyARToolkit Java/C#/AS3 paquetes.
http://sourceforge.jp/projects/nyartoolkit/releases/

FLARToolKit Pre-Release almacén
http://www.libspark.org/browser/as3/FLARToolKit/branches/nyatla/v4/tags/pre3

NyARToolkit for Android PreRelease almacén
http://sourceforge.jp/projects/nyartoolkit-and/scm/git/NyARTK4.nyatla/commits/a4949937cb5a3eb2d1b7d6f6b5cd1be02510fbd6

Versión del androide 4.0.1 paquete no tiene la optimización y es las velocidades muy bajas.
Use el código 4.0.3 en almacén. 4.0.3 están ejecutando en Android2.2 y operan por 30-60fps (QVGA).

 

MarkerSystemで敷居値探索アルゴリズムを変える方法

映像にマーカは映っているのに、何故か認識しないことがありますね。
そんなときに、敷居値探索アルゴリズムを変えると、うまく認識する場合があります。

MarkerSystemを使う場合には、敷居値探索アルゴリズムを簡単に切り替えることができます。

変更方法

アルゴリズムの変更には2つの実装が必要です。

  1. 敷居値決定アルゴリズムを導入したMarkerSystemConfigを定義する。
  2. 新しく定義したMarkerSystemConfigをMarkerSystemへセットする。

次の例では、敷居値探索アルゴリズムを判別法に切り替えています。

MyMarkerSystemConfigの定義

  class MyNyARMarkerSystemConfig extends NyARMarkerSystemConfig
  {
    public MyNyARMarkerSystemConfig(InputStream i_ar_param_stream,int i_width,int i_height) throws NyARException
    {
      super(i_ar_param_stream,i_width,i_height);
    }
    public MyNyARMarkerSystemConfig(int i_width,int i_height) throws NyARException
    {
      super(i_width,i_height);
    }
    public INyARHistogramAnalyzer_Threshold createAutoThresholdArgorism()
    {
      return new NyARHistogramAnalyzer_DiscriminantThreshold();
    }

  }

MarkerSystemへセット

  NyARMarkerSystemConfig config = new MyNyARMarkerSystemConfig(320,240);
  NyARMarkerSystem s=new NyARMarkerSystem(config);

実装済のアルゴリズム

NyARToolKitには3種類の敷居値探索アルゴリズムが実装済みです。これらは、ヒストグラムから敷居値を探索します。

  1. 判別法 NyARHistogramAnalyzer_DiscriminantThreshold
  2. Kittler法 NyARHistogramAnalyzer_KittlerThreshold
  3. Spタイル法 NyARHistogramAnalyzer_SlidePTile

判別法、Kitter法は、良く知られたものです。Spタイル法は、NyARToolKit固有のものです。
NyARToolkitは、標準ではSpタイル法を使っています。

Spタイル法

Spタイル法は、白黒マーカの検出の為に考案した敷居値検出方式です。明点、暗点の両側から、一定割合の画素を除外して、その中心点を敷居値とします。


この方式は、入力画像の暗/明点付近にマーカの構成要素(白/黒)が集中している場合に、良好な結果が得られます。そうでない場合、あまり良い結果が得られません。
例えば、自然画の中にある浅い色のマーカが認識できないようなことが起こります。

独自の敷居値探索アルゴリズムの実装方法

INyARHistogramAnalyzer_Thresholdインタフェイスを実装したクラスを定義し、MarkerSystemConfigにセットすることで、ヒストグラムベースの敷居値探索アルゴリズムを使うことが出来ます。
例えば、次のコードは固定敷居値を返します。

public class MyHistogramAnalyzer implements INyARHistogramAnalyzer_Threshold
{
  public int getThreshold(NyARHistogram i_histogram)
  {
     return 128;
  }
}

敷居値探索オブジェクトは、MarkerSystem起動時に1度だけ作られます。検出してその値を返す以外に、フレーム間で敷居値の平均を取る処理等を追加することも出来ると思います。