NyARToolkit for Android 4.0.3 released

NyARToolkit for Android 4.0.3のリリースします。

http://sourceforge.jp/projects/nyartoolkit-and/releases/?package_id=12943

更新内容

更新内容は以下の通りです。

  • 基本ライブラリをNyARToolkit4.0.3へ更新
  • 画処理系の更新。YUV、Bitmap形式画像への対応
  • Android固有の高速化
  • ProcessingのスケッチライクなActivityの追加

画処理系の最適化により、以前のものより5-10倍ほど速度が向上しています。また、スケッチシステムの採用により、簡単にアプリケーションを作ることが出来るようになりました。

サンプルコード

立方体を表示するSimpleLiteの、スケッチを使用した実装例です。

package jp.nyatla.nyartoolkit.and;

import javax.microedition.khronos.opengles.GL10;

import jp.androidgroup.nyartoolkit.R;
import jp.androidgroup.nyartoolkit.markersystem.NyARAndMarkerSystem;
import jp.androidgroup.nyartoolkit.markersystem.NyARAndSensor;
import jp.androidgroup.nyartoolkit.sketch.AndSketch;
import jp.androidgroup.nyartoolkit.utils.camera.CameraPreview;
import jp.androidgroup.nyartoolkit.utils.gl.*;
import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;
import android.content.res.AssetManager;
import android.hardware.Camera;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;

/**
 * Hiroマーカの上にカラーキューブを表示します。
 * 定番のサンプルです。
 *
 */
public class SimpleLiteActivity extends AndSketch implements AndGLView.IGLFunctionEvent
{
  CameraPreview _camera_preview;
  AndGLView _glv;
  Camera.Size _cap_size;
  /**
   * onStartでは、Viewのセットアップをしてください。
   */
  @Override
  public void onStart()
  {
    super.onStart();
    FrameLayout fr=((FrameLayout)this.findViewById(R.id.sketchLayout));
    //カメラの取得
    this._camera_preview=new CameraPreview(this);
    this._cap_size=this._camera_preview.getRecommendPreviewSize(320,240);
    //画面サイズの計算
    int h = this.getWindowManager().getDefaultDisplay().getHeight();
    int screen_w,screen_h;
    screen_w=(this._cap_size.width*h/this._cap_size.height);
    screen_h=h;
    //camera
    fr.addView(this._camera_preview, 0, new LayoutParams(screen_w,screen_h));
    //GLview
    this._glv=new AndGLView(this);
    fr.addView(this._glv, 0,new LayoutParams(screen_w,screen_h));
  }

  NyARAndSensor _ss;
  NyARAndMarkerSystem _ms;
  private int _mid;
  AndGLTextLabel text;
  AndGLBox box;
  AndGLFpsLabel fps;

  public void setupGL(GL10 gl)
  {
    try
    {
      AssetManager assetMng = getResources().getAssets();
      //create sensor controller.
      this._ss=new NyARAndSensor(this._camera_preview,this._cap_size.width,this._cap_size.height,30);
      //create marker system
      this._ms=new NyARAndMarkerSystem(new NyARMarkerSystemConfig(this._cap_size.width,this._cap_size.height));
      this._mid=this._ms.addARMarker(assetMng.open("AR/data/hiro.pat"),16,25,80);
      this._ss.start();
      //setup openGL Camera Frustum
      gl.glMatrixMode(GL10.GL_PROJECTION);
      gl.glLoadMatrixf(this._ms.getGlProjectionMatrix(),0);
      this.text=new AndGLTextLabel(this._glv);
      this.box=new AndGLBox(this._glv,40);
      this._debug=new AndGLDebugDump(this._glv);
      this.fps=new AndGLFpsLabel(this._glv,"MarkerPlaneActivity");
      this.fps.prefix=this._cap_size.width+"x"+this._cap_size.height+":";

    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      this.finish();
    }
  }
  AndGLDebugDump _debug=null;

  public void drawGL(GL10 gl)
  {
    try{
      //背景塗り潰し色の指定
      gl.glClearColor(0,0,0,0);
          //背景塗り潰し
          gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
          if(ex!=null){
            _debug.draw(ex);
            return;
          }
          fps.draw(0, 0);
      synchronized(this._ss){
        this._ms.update(this._ss);
        if(this._ms.isExistMarker(this._mid)){
              this.text.draw("found"+this._ms.getConfidence(this._mid),0,16);
          gl.glMatrixMode(GL10.GL_MODELVIEW);
          gl.glLoadMatrixf(this._ms.getGlMarkerMatrix(this._mid),0);
          this.box.draw(0,0,20);
        }
    }
    }catch(Exception e)
    {
      ex=e;
    }
  }
  Exception ex=null;
}

AndSketchは、スケッチシステムのベースクラスです。Activityを継承しています。関数は、OnStart,setupGL,drawGLの3つです。

  1. OnStart – ActivityのOnStartをオーバライドします。ここでは、レイアウトと、ビューを構築しています。
  2. setupGL – OpenGLのセットアップを書きます。text,box,debugはそれぞれ、OpenGL向けの描画クラスです。
  3. drawGL – OpenGLの描画処理を書きます。 synchronizedの場所に注意してください。非同期に更新されるNyARAndSensorと同期を取る為に、オブジェクトにアクセスするときはsynchronizedが必要です。

サンプルの構造は、他のNyARシリーズのスケッチシステムとほぼ同じです。

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).

 

NyARToolkitAS3のAlternativa3D対応

需要があったようなので、作りました。私がAlternativa3Dを良くわかっていないので、少々雑ですが・・・。

イマイチ良くわかって無い部分もありますが、一通りは動くようにしました。サンプルとサポートクラスがあります。リリースまでの間、ソースコードはSubversionからダウンロードしてください。

http://sourceforge.jp/projects/nyartoolkit/scm/svn/tree/head/NyARToolkitAS3/trunk/

なお、幾つか問題があります。

  • stageとviewのサイズをあわせるためのマジックナンバーがあります。
  • controllerクラスとの相性がよくありません。
  • 背景をテクスチャと遠方パネルで描画しているため、cameraの方位を変更できません。

追記:FLARToolKitのPreRelease版にもコミットしました。
http://www.libspark.org/browser/as3/FLARToolKit/branches/nyatla/v4/trunk

 

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度だけ作られます。検出してその値を返す以外に、フレーム間で敷居値の平均を取る処理等を追加することも出来ると思います。