2 * PROJECT: NyARToolkit
\r
3 * --------------------------------------------------------------------------------
\r
4 * This work is based on the original ARToolKit developed by
\r
7 * HITLab, University of Washington, Seattle
\r
8 * http://www.hitl.washington.edu/artoolkit/
\r
10 * The NyARToolkit is Java edition ARToolKit class library.
\r
11 * Copyright (C)2008-2009 Ryo Iizuka
\r
13 * This program is free software: you can redistribute it and/or modify
\r
14 * it under the terms of the GNU General Public License as published by
\r
15 * the Free Software Foundation, either version 3 of the License, or
\r
16 * (at your option) any later version.
\r
18 * This program is distributed in the hope that it will be useful,
\r
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
21 * GNU General Public License for more details.
\r
23 * You should have received a copy of the GNU General Public License
\r
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
26 * For further information please contact.
\r
27 * http://nyatla.jp/nyatoolkit/
\r
28 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
\r
31 package jp.nyatla.nyartoolkit.test;
\r
36 import jp.nyatla.nyartoolkit.core.param.NyARParam;
\r
37 import jp.nyatla.nyartoolkit.core.raster.rgb.*;
\r
38 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;
\r
39 import jp.nyatla.nyartoolkit.core.transmat.*;
\r
40 import jp.nyatla.nyartoolkit.nyidmarker.data.*;
\r
41 import jp.nyatla.nyartoolkit.processor.*;
\r
44 * このプログラムは、NyIdマーカ検出クラス{@link SingleNyIdMarkerProcesser}の動作チェックプログラムです。
\r
45 * 静止画から1個のIDマーカを読み取り、その数値を得る動作を確認できます。
\r
47 * このプログラムには結果を表示する機能がありません。
\r
48 * 数値の確認は、ブレークポイントを仕掛けるなどしてください。
\r
50 * このプログラムの実行には、以下の外部ファイルが必要です。
\r
52 * <li>camera_para.dat - ARToolKit付属のカメラパラメータファイル
\r
53 * <li>320x240NyId.raw - Idマーカを撮影した、QVGAサイズのR8G8B8形式のサンプル画像
\r
57 public class NyIdTest
\r
60 * このクラスは、{@link SingleNyIdMarkerProcesser}の自己コールバック関数を実装したクラスです。
\r
61 * 自己コールバック関数は、{@link #detectMarker}の内部から呼び出さます。
\r
62 * これにより、アプリケーションにマーカ状態の変化を通知します。
\r
63 * 通知される条件については、それぞれの関数の説明を見てください。
\r
65 public class MarkerProcessor extends SingleNyIdMarkerProcesser
\r
67 private Object _sync_object = new Object();
\r
68 /** {@link #onUpdateHandler}関数で得た姿勢行列のポインタ*/
\r
69 public NyARTransMatResult transmat = null;
\r
70 /** {@link #onEnterHandler}関数で得た姿勢行列のポインタ*/
\r
71 public int current_id = -1;
\r
74 * パラメータを{@link #initInstance}へセットして初期化します。
\r
75 * ここでは、{@link #initInstance}へ値を引き渡すだけです。
\r
78 * @param i_raster_format
\r
82 public MarkerProcessor(NyARParam i_cparam, int i_raster_format) throws Exception
\r
85 initInstance(i_cparam, new NyIdMarkerDataEncoder_RawBit(),100, i_raster_format);
\r
86 //アプリケーションフレームワークの初期化
\r
90 * この関数は、{@link #detectMarker}から呼び出される自己コールバック関数です。
\r
91 * 画像にマーカが現われたときに呼び出されます。
\r
92 * ここでは、例として、マーカの情報を読み取り、それを{@link NyIdMarkerData_RawBit}を使って
\r
93 * int値にエンコードする処理を実装しています。
\r
95 protected void onEnterHandler(INyIdMarkerData i_code)
\r
97 synchronized (this._sync_object)
\r
99 NyIdMarkerData_RawBit code = (NyIdMarkerData_RawBit)i_code;
\r
100 if (code.length > 4)
\r
102 //4バイト以上の時はint変換しない。
\r
103 this.current_id = -1;//undefined_id
\r
107 this.current_id = 0;
\r
108 //最大4バイト繋げて1個のint値に変換
\r
109 for (int i = 0; i < code.length; i++)
\r
111 this.current_id = (this.current_id << 8) | code.packet[i];
\r
113 System.out.println("NyARId:"+this.current_id);
\r
115 this.transmat = null;
\r
119 * この関数は、{@link #detectMarker}から呼び出される自己コールバック関数です。
\r
120 * 画像からマーカが消え去った時に呼び出されます。
\r
121 * ここでは、マーカが消えた場合の後始末処理をします。
\r
122 * このサンプルでは、メンバ変数をリセットしています。
\r
124 protected void onLeaveHandler()
\r
126 synchronized (this._sync_object)
\r
128 this.current_id = -1;
\r
129 this.transmat = null;
\r
134 * この関数は、{@link #detectMarker}から呼び出される自己コールバック関数です。
\r
135 * 画像中のマーカの位置が変化したときに呼び出されます。
\r
136 * この関数は、{@link #onEnterHandler}直後に呼び出されることもあります。
\r
138 * このサンプルでは、引数で通知されたマーカの姿勢を、メンバ変数に保存しています。
\r
140 protected void onUpdateHandler(NyARSquare i_square, NyARTransMatResult result)
\r
142 synchronized (this._sync_object)
\r
144 this.transmat = result;
\r
148 private final String data_file = "../Data/320x240NyId.raw";
\r
149 private final String camera_file = "../Data/camera_para.dat";
\r
159 * 設定ファイル、サンプル画像の読み込んだのちに{@link MarkerProcessor}を生成し、
\r
160 * 1回だけ画像を入力して、マーカ検出を試行します。
\r
161 * @throws Exception
\r
163 public void Test() throws Exception
\r
165 //AR用カメラパラメタファイルをロード
\r
166 NyARParam ap = new NyARParam();
\r
167 ap.loadARParamFromFile(camera_file);
\r
168 ap.changeScreenSize(320, 240);
\r
170 // 試験イメージの読み出し(320x240 BGRAのRAWデータ)
\r
171 File f = new File(data_file);
\r
172 FileInputStream fs = new FileInputStream(data_file);
\r
173 byte[] buf = new byte[(int) f.length()];
\r
176 NyARRgbRaster_RGB ra = new NyARRgbRaster_RGB(320, 240,false);
\r
177 ra.wrapBuffer(buf);
\r
179 MarkerProcessor pr = new MarkerProcessor(ap, ra.getBufferType());
\r
180 pr.detectMarker(ra);
\r
184 * プログラムのエントリーポイントです。
\r
185 * サンプルプログラム{@link NyIdTest}を実行します。
\r
189 public static void main(String[] args)
\r
193 NyIdTest t = new NyIdTest();
\r
194 // t.Test_arGetVersion();
\r
196 } catch (Exception e) {
\r
197 e.printStackTrace();
\r