• R/O
  • HTTP
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

NyARToolKit for Android の仮作業所。サンプルなどの作成作業部屋。


Commit MetaInfo

修订版26a547592545874c582c762e92c4f43aaaa33a5f (tree)
时间2012-03-11 19:33:34
作者rokubou <rokubou@user...>
Commiterrokubou

Log Message

Markersystemに関するクラスを追加

更改概述

差异

--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/androidgroup/nyartoolkit/markersystem/AbstractMarkerSystemActivity.java
@@ -0,0 +1,260 @@
1+/**
2+ * NyARToolkit for Android SDK
3+ * Copyright (C)2012 NyARToolkit for Android team
4+ * Copyright (C)2012 R.Iizuka(nyatla)
5+ *
6+ * This program is free software: you can redistribute it and/or modify
7+ * it under the terms of the GNU General Public License as published by
8+ * the Free Software Foundation, either version 3 of the License, or
9+ * (at your option) any later version.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ *
19+ * For further information please contact.
20+ * http://sourceforge.jp/projects/nyartoolkit-and/
21+ *
22+ * This work is based on the original ARToolKit developed by
23+ * Hirokazu Kato
24+ * Mark Billinghurst
25+ * HITLab, University of Washington, Seattle
26+ * http://www.hitl.washington.edu/artoolkit/
27+ * Ryo Iizuka(nyatla)
28+ * http://nyatla.jp/nyatoolkit/
29+ *
30+ * Contributor(s)
31+ * Fuu Rokubou
32+ */
33+package jp.androidgroup.nyartoolkit.markersystem;
34+
35+import jp.androidgroup.nyartoolkit.camera.CameraEventListener;
36+import jp.androidgroup.nyartoolkit.camera.CameraPreview;
37+import jp.androidgroup.nyartoolkit.markersystem.android.NyARAndroidMarkerSystemFactory;
38+import jp.androidgroup.nyartoolkit.markersystem.renderer.MarkerSystemAbstractRenderer;
39+import jp.nyatla.nyartoolkit.markersystem.INyARMarkerSystemConfig;
40+import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;
41+import android.app.Activity;
42+import android.content.pm.ActivityInfo;
43+import android.content.res.AssetManager;
44+import android.graphics.PixelFormat;
45+import android.opengl.GLSurfaceView;
46+import android.os.Bundle;
47+import android.util.Log;
48+import android.view.Window;
49+import android.view.WindowManager;
50+import android.view.ViewGroup.LayoutParams;
51+import android.widget.FrameLayout;
52+
53+/**
54+ * このクラスは、NyARToolKitのMarkerSystemを採用したアプリケーションを作成するための、
55+ * 基盤となるクラスです。
56+ *
57+ *
58+ */
59+public abstract class AbstractMarkerSystemActivity extends Activity
60+ implements CameraEventListener
61+{
62+ /**
63+ * Logging Tag
64+ */
65+ protected final static String TAG = "NyARTK4And.AbstractMarkerSystemActivity";
66+
67+ /**
68+ * Camera preview と GLView を使う場合は FrameLayout を使う
69+ * FrameLayout の内容は、継承したクラスの {@link supplyFrameLayout()} 内で処理してください。
70+ */
71+ protected FrameLayout mainLayout;
72+
73+ /**
74+ * CameraPreview
75+ */
76+ private CameraPreview preview;
77+
78+ /**
79+ * モデルデータを描画する GL SurfaceView
80+ */
81+ private GLSurfaceView glView;
82+
83+ /**
84+ * モデルデータの内容を定義する
85+ */
86+ protected MarkerSystemAbstractRenderer renderer;
87+
88+ @Override
89+ protected void onCreate(Bundle savedInstanceState) {
90+ Log.d(TAG, "onCreate");
91+ super.onCreate(savedInstanceState);
92+ initWindow();
93+ }
94+
95+ /**
96+ * 画面の初期設定
97+ * 継承したクラス内でさらに書き換えるもよし。
98+ */
99+ protected void initWindow()
100+ {
101+ // タイトルは不要
102+ requestWindowFeature(Window.FEATURE_NO_TITLE);
103+ // フルスクリーン表示
104+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
105+
106+ getWindow().setFormat(PixelFormat.TRANSLUCENT);
107+ // 画面がスリープに入らないようにする
108+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
109+ // 横向き固定
110+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
111+ }
112+
113+ /**
114+ * Frame Layout の設定
115+ * @return
116+ */
117+ protected abstract FrameLayout supplyFrameLayout();
118+
119+ /**
120+ * OpenGL Renderer の設定
121+ * @return
122+ */
123+ protected abstract MarkerSystemAbstractRenderer supplyRenderer();
124+
125+ @Override
126+ protected void onStart()
127+ {
128+ Log.d(TAG, "onStart");
129+ super.onStart();
130+
131+ // レイアウト設定
132+ mainLayout = supplyFrameLayout();
133+ if (mainLayout==null) {
134+ Log.d(TAG, "not create frame layout");
135+ finish();
136+ }
137+
138+ // Renderer 設定
139+ renderer = supplyRenderer();
140+ if (renderer == null) {
141+ Log.d(TAG, "not create renderer");
142+ finish();
143+ }
144+
145+ // CameraPreview
146+ preview = new CameraPreview(this, this);
147+
148+ // Create the GL view
149+ glView = new GLSurfaceView(this);
150+ glView.setEGLConfigChooser( 8, 8, 8, 8, 16, 0);
151+ glView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
152+
153+ glView.setRenderer(renderer);
154+ glView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
155+
156+ // Add surface views
157+ mainLayout.addView( glView, 0, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
158+ mainLayout.addView(preview, 1, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
159+
160+ }
161+
162+ @Override
163+ protected void onResume() {
164+ Log.d(TAG, "onResume");
165+ super.onResume();
166+ if (glView != null) {
167+ glView.onResume();
168+ }
169+ }
170+
171+ @Override
172+ protected void onPause() {
173+ Log.d(TAG, "onPause");
174+ super.onPause();
175+ if (glView != null) glView.onPause();
176+ }
177+
178+ @Override
179+ protected void onStop() {
180+ Log.d(TAG, "onStop");
181+ super.onStop();
182+ }
183+
184+ /**
185+ * Marker System の config を作成するメソッド。
186+ * 継承したクラス内で初期化をおこなってください。
187+ *
188+ * @param _caputureWidth
189+ * @param _caputureHeight
190+ * @return
191+ */
192+ protected abstract INyARMarkerSystemConfig supplyMarkerSystemConfig(int _caputureWidth, int _caputureHeight);
193+
194+ @Override
195+ public void cameraPreviewStarted(int width, int height, int rate) {
196+ NyARMarkerSystemConfig config;
197+ // Config設定
198+ config = (NyARMarkerSystemConfig)supplyMarkerSystemConfig(width, height);
199+
200+ if (config==null) {
201+ try {
202+ AssetManager assetMng = getResources().getAssets();
203+ config = new NyARMarkerSystemConfig(assetMng.open("AR/CameraParam/camera_param_640x480.dat"), width, height);
204+ } catch (Exception e) {
205+ finish();
206+ }
207+ }
208+ // Marker system 初期化
209+ if (!NyARAndroidMarkerSystemFactory.getInstance().configureMarkerSystem(config)) {
210+ Log.e(TAG, "fail to marker system initialization.");
211+ finish();
212+ }
213+ captureWidth = width;
214+ captureHeight= height;
215+ }
216+
217+ /**
218+ * キャプチャサイズの幅
219+ * CameraPreviewクラスで指定されるのでここでは値を設定しないでください
220+ */
221+ protected int captureWidth = 0;
222+ protected int captureHeight = 0;
223+
224+ protected boolean isFirstUpdate = true;
225+
226+ // TODO メソッド拡張、NyARSensor を渡すようにしたほうが良いかもしれない。
227+ // その場合、CameraPreview を拡張して、 jmf のコードに類似させたほうが無難か?
228+ @Override
229+ public void cameraPreviewFrame(byte[] frame) {
230+ Log.d(TAG, "cameraPreviewFrame");
231+ // Marker system が初期化されているかを確認
232+ // 初期化前でも実行されてしまう可能性が十分にあるため防護策として入れている
233+ if (!NyARAndroidMarkerSystemFactory.getInstance().isMarkerSystemRunning()) {
234+ return;
235+ // 初期化一回目なら、rendererに書かれている マーカーを登録する処理を実行する
236+ } else if (isFirstUpdate) {
237+ if (!renderer.configureARScene(getResources().getAssets())) {
238+ Log.e(TAG, "failed to marker pattern setup.");
239+ return;
240+ }
241+ isFirstUpdate = false;
242+ }
243+
244+ // Raster に画像データをセットする
245+ Log.d(TAG, "setCapturFrame");
246+
247+ // rasterBuffer を NyARSensor に入れる方法を検討のこと。
248+ NyARAndroidMarkerSystemFactory.getInstance().getMarkerSystem().update(frame);
249+
250+ if (glView != null) glView.requestRender();
251+ }
252+
253+ @Override
254+ public void cameraPreviewStopped() {
255+ Log.d(TAG, "cameraPreviewStoped");
256+ // TODO Auto-generated method stub
257+
258+ }
259+
260+}
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/androidgroup/nyartoolkit/markersystem/android/NyARAndroidMarkerSystem.java
@@ -0,0 +1,312 @@
1+/**
2+ * NyARToolkit for Android SDK
3+ * Copyright (C)2012 NyARToolkit for Android team
4+ * Copyright (C)2012 R.Iizuka(nyatla)
5+ *
6+ * This program is free software: you can redistribute it and/or modify
7+ * it under the terms of the GNU General Public License as published by
8+ * the Free Software Foundation, either version 3 of the License, or
9+ * (at your option) any later version.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ *
19+ * For further information please contact.
20+ * http://sourceforge.jp/projects/nyartoolkit-and/
21+ *
22+ * This work is based on the original ARToolKit developed by
23+ * Hirokazu Kato
24+ * Mark Billinghurst
25+ * HITLab, University of Washington, Seattle
26+ * http://www.hitl.washington.edu/artoolkit/
27+ * Ryo Iizuka(nyatla)
28+ * http://nyatla.jp/nyatoolkit/
29+ *
30+ * Contributor(s)
31+ * Ryo Iizuka(nyatla)
32+ * Fuu Rokubou
33+ */
34+package jp.androidgroup.nyartoolkit.markersystem.android;
35+
36+import android.util.Log;
37+import jp.androidgroup.nyartoolkit.jni.YUV420sp2RGBInterface;
38+import jp.nyatla.nyartoolkit.core.NyARException;
39+import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;
40+import jp.nyatla.nyartoolkit.core.types.NyARBufferType;
41+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;
42+import jp.nyatla.nyartoolkit.jogl.utils.NyARGLUtil;
43+import jp.nyatla.nyartoolkit.markersystem.INyARMarkerSystemConfig;
44+import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystem;
45+import jp.nyatla.nyartoolkit.markersystem.NyARSensor;
46+//import jp.nyatla.nyartoolkit.utils.j2se.NyARBufferedImageRaster;
47+
48+/**
49+ * NyARToolKit Marker system を継承したandroid用のクラスです。
50+ * ARToolKitなどと同じような順で使えるようにするために、singletonパターンを採用しています。
51+ *
52+ * 呼び出す順番を間違えると大惨事になるのでサンプルを参考に使う順序に気をつけて使用してください。
53+ * コメントに出来る限り書きますが、間違えたり省かれたりしているので注意してください。
54+ *
55+ * Javaではカメラ周りが独立していますが、うまく分けられなかったためこの中に含めています。
56+ */
57+public class NyARAndroidMarkerSystem extends NyARMarkerSystem
58+{
59+ /**
60+ * Logging Tag
61+ */
62+ protected final static String TAG = "NyARTK4And.NyARAndroidMarkerSystem";
63+
64+ /**
65+ * Projection Matrix
66+ */
67+ private float[] _projection_mat;
68+
69+ /**
70+ * コンストラクタ
71+ * @param i_config
72+ * @throws NyARException
73+ */
74+ public NyARAndroidMarkerSystem(INyARMarkerSystemConfig i_config) throws NyARException
75+ {
76+ super(i_config);
77+ this.initInstance(i_config);
78+ this.setProjectionMatrixClipping(FRUSTUM_DEFAULT_NEAR_CLIP, FRUSTUM_DEFAULT_FAR_CLIP);
79+ }
80+
81+ protected void initInstance(INyARMarkerSystemConfig i_config) throws NyARException
82+ {
83+ super.initInstance(i_config);
84+ this._projection_mat = new float[16];
85+
86+ rasterWidth = i_config.getScreenSize().w;
87+ rasterHeight= i_config.getScreenSize().h;
88+
89+
90+ initNyARRgbRaster(i_config.getScreenSize());
91+
92+ initARSensor(i_config.getScreenSize());
93+ }
94+
95+ /**
96+ * OpenGLスタイルのProjectionMatrixを返します。
97+ * @param i_gl
98+ * @return
99+ * [readonly]
100+ */
101+ public float[] getGlProjectionMatrixf()
102+ {
103+ return this._projection_mat;
104+ }
105+
106+ public void setProjectionMatrixClipping(double i_near,double i_far)
107+ {
108+ super.setProjectionMatrixClipping(i_near,i_far);
109+ NyARGLUtil.toCameraFrustumRHf(this._ref_param, 1, i_near, i_far, this._projection_mat);
110+ }
111+
112+ /**
113+ * この関数はOpenGL形式の姿勢変換行列を新規に割り当てて返します。
114+ * @param i_buf
115+ * @return
116+ */
117+ public double[] getGlMarkerMatrix(int i_id)
118+ {
119+ return this.getGlMarkerMatrix(i_id,new double[16]);
120+ }
121+ /**
122+ * この関数は、i_bufに指定idのOpenGL形式の姿勢変換行列を設定して返します。
123+ * @param i_id
124+ * @param i_buf
125+ * @return
126+ */
127+ public double[] getGlMarkerMatrix(int i_id,double[] i_buf)
128+ {
129+ NyARGLUtil.toCameraViewRH(this.getMarkerMatrix(i_id),1,i_buf);
130+ return i_buf;
131+ }
132+
133+ /**
134+ * この関数はOpenGL形式の姿勢変換行列を新規に割り当てて返します。
135+ * @param i_buf
136+ * @return
137+ */
138+ public float[] getGlMarkerMatrixf(int i_id)
139+ {
140+ return this.getGlMarkerMatrixf(i_id, new float[16]);
141+ }
142+
143+ /**
144+ * この関数は、i_bufに指定idのOpenGL形式の姿勢変換行列を設定して返します。
145+ * @param i_id
146+ * @param i_buf
147+ * @return
148+ */
149+ public float[] getGlMarkerMatrixf(int i_id, float[] i_buf)
150+ {
151+ NyARGLUtil.toCameraViewRHf(this.getMarkerMatrix(i_id),1,i_buf);
152+ return i_buf;
153+ }
154+
155+// 実装は後回し
156+ /**
157+ * {@link #addARMarker(INyARRgbRaster, int, int, double)}のラッパーです。BufferedImageからマーカパターンを作ります。
158+ * 引数については、{@link #addARMarker(INyARRgbRaster, int, int, double)}を参照してください。
159+ * @param i_img
160+ * @param i_patt_resolution
161+ * @param i_patt_edge_percentage
162+ * @param i_marker_size
163+ * @return
164+ * @throws NyARException
165+ */
166+// public int addARMarker(BufferedImage i_img,int i_patt_resolution,int i_patt_edge_percentage,double i_marker_size) throws NyARException
167+// {
168+// int w=i_img.getWidth();
169+// int h=i_img.getHeight();
170+// NyARBufferedImageRaster bmr=new NyARBufferedImageRaster(i_img);
171+// NyARCode c=new NyARCode(i_patt_resolution,i_patt_resolution);
172+// //ラスタからマーカパターンを切り出す。
173+// INyARPerspectiveCopy pc=(INyARPerspectiveCopy)bmr.createInterface(INyARPerspectiveCopy.class);
174+// NyARRgbRaster tr=new NyARRgbRaster(i_patt_resolution,i_patt_resolution);
175+// pc.copyPatt(0,0,w,0,w,h,0,h,i_patt_edge_percentage, i_patt_edge_percentage,4, tr);
176+// //切り出したパターンをセット
177+// c.setRaster(tr);
178+// return super.addARMarker(c,i_patt_edge_percentage,i_marker_size);
179+// }
180+ /**
181+ * この関数は、{@link #getMarkerPlaneImage(int, NyARSensor, int, int, int, int, int, int, int, int, INyARRgbRaster)}
182+ * のラッパーです。取得画像を{@link #BufferedImage}形式で返します。
183+ * @param i_id
184+ * @param i_sensor
185+ * @param i_x1
186+ * @param i_y1
187+ * @param i_x2
188+ * @param i_y2
189+ * @param i_x3
190+ * @param i_y3
191+ * @param i_x4
192+ * @param i_y4
193+ * @param i_img
194+ * @return
195+ * @throws NyARException
196+ */
197+// public BufferedImage getMarkerPlaneImage(
198+// int i_id,
199+// NyARSensor i_sensor,
200+// int i_x1,int i_y1,
201+// int i_x2,int i_y2,
202+// int i_x3,int i_y3,
203+// int i_x4,int i_y4,
204+// BufferedImage i_img) throws NyARException
205+// {
206+// NyARBufferedImageRaster bmr=new NyARBufferedImageRaster(i_img);
207+// super.getMarkerPlaneImage(i_id, i_sensor, i_x1, i_y1, i_x2, i_y2, i_x3, i_y3, i_x4, i_y4,bmr);
208+// return i_img;
209+// }
210+ /**
211+ * この関数は、{@link #getMarkerPlaneImage(int, NyARSensor, int, int, int, int, INyARRgbRaster)}
212+ * のラッパーです。取得画像を{@link #BufferedImage}形式で返します。
213+ * @param i_id
214+ * マーカid
215+ * @param i_sensor
216+ * 画像を取得するセンサオブジェクト。通常は{@link #update(NyARSensor)}関数に入力したものと同じものを指定します。
217+ * @param i_l
218+ * @param i_t
219+ * @param i_w
220+ * @param i_h
221+ * @param i_raster
222+ * 出力先のオブジェクト
223+ * @return
224+ * 結果を格納したi_rasterオブジェクト
225+ * @throws NyARException
226+ */
227+// public BufferedImage getMarkerPlaneImage(
228+// int i_id,
229+// NyARSensor i_sensor,
230+// int i_l,int i_t,
231+// int i_w,int i_h,
232+// BufferedImage i_img) throws NyARException
233+// {
234+// NyARBufferedImageRaster bmr=new NyARBufferedImageRaster(i_img);
235+// super.getMarkerPlaneImage(i_id, i_sensor, i_l, i_t, i_w, i_h, bmr);
236+// this.getMarkerPlaneImage(i_id,i_sensor,i_l+i_w-1,i_t+i_h-1,i_l,i_t+i_h-1,i_l,i_t,i_l+i_w-1,i_t,bmr);
237+// return i_img;
238+// }
239+
240+ /**
241+ * ラスタ(解析用)サイズの幅
242+ */
243+ protected int rasterWidth = 640;
244+
245+ /**
246+ * ラスタ(解析用)サイズの高さ
247+ */
248+ protected int rasterHeight = 480;
249+
250+ /**
251+ * ARSensor に与える Raster
252+ * Cameraからの映像を保持するクラス
253+ */
254+ protected NyARRgbRaster raster = null;
255+
256+ protected NyARSensor arSensor = null;
257+ /**
258+ * NyARRgbRaster の初期化
259+ *
260+ * @param width Rasterサイズの幅
261+ * @param height Rasterサイズの高さ
262+ */
263+ protected void initNyARRgbRaster(NyARIntSize i_size)
264+ {
265+ Log.d(TAG, "initNyARRgbRaster");
266+ try {
267+ raster = new NyARRgbRaster(i_size.w, i_size.h, NyARBufferType.BYTE1D_R8G8B8_24);
268+ } catch (NyARException e) {
269+ Log.e(TAG, "Not create NyARRgbRaster_RGB.");
270+ }
271+ }
272+
273+ /**
274+ * ARSensor 初期化
275+ * @param i_size raster のサイズ
276+ */
277+ protected void initARSensor(NyARIntSize i_size)
278+ {
279+ try {
280+ arSensor = new NyARSensor(i_size);
281+ } catch (NyARException e) {
282+ Log.e(TAG, "Initialize NyARSensor Error.");
283+ }
284+ }
285+
286+ /**
287+ * 状況を更新する
288+ * @param frame
289+ */
290+ public void update(byte[] frame)
291+ {
292+ Log.d(TAG, "setCapturFrame");
293+ // JNI を使って形式変換
294+ byte[] rasterBuffer = new byte[rasterWidth * rasterHeight * 3];
295+ YUV420sp2RGBInterface.decodeYUV420SP(rasterBuffer, frame, rasterWidth, rasterHeight, 1);
296+
297+ try {
298+ // NyARRaster にセット
299+ raster.wrapBuffer(rasterBuffer);
300+ arSensor.update(raster);
301+ } catch (NyARException e) {
302+ Log.e(TAG, "Raster buffer write error.");
303+ return;
304+ }
305+
306+ try {
307+ update(arSensor);
308+ } catch (NyARException e) {
309+ Log.e(TAG, "Marker system detect update error.");
310+ }
311+ }
312+}
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/androidgroup/nyartoolkit/markersystem/android/NyARAndroidMarkerSystemFactory.java
@@ -0,0 +1,121 @@
1+/**
2+ * NyARToolkit for Android SDK
3+ * Copyright (C)2012 NyARToolkit for Android team
4+ * Copyright (C)2012 R.Iizuka(nyatla)
5+ *
6+ * This program is free software: you can redistribute it and/or modify
7+ * it under the terms of the GNU General Public License as published by
8+ * the Free Software Foundation, either version 3 of the License, or
9+ * (at your option) any later version.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ *
19+ * For further information please contact.
20+ * http://sourceforge.jp/projects/nyartoolkit-and/
21+ *
22+ * This work is based on the original ARToolKit developed by
23+ * Hirokazu Kato
24+ * Mark Billinghurst
25+ * HITLab, University of Washington, Seattle
26+ * http://www.hitl.washington.edu/artoolkit/
27+ * Ryo Iizuka(nyatla)
28+ * http://nyatla.jp/nyatoolkit/
29+ *
30+ * Contributor(s)
31+ * Fuu Rokubou
32+ */
33+package jp.androidgroup.nyartoolkit.markersystem.android;
34+
35+import jp.nyatla.nyartoolkit.core.NyARException;
36+import jp.nyatla.nyartoolkit.markersystem.INyARMarkerSystemConfig;
37+
38+/**
39+ * NyARAndroidMarkerSystem を singleton化するためだけに作成したクラス。
40+ * Flyweightパターンになっている?
41+ */
42+public class NyARAndroidMarkerSystemFactory {
43+
44+ /**
45+ * Singleton Instance
46+ */
47+ private static NyARAndroidMarkerSystemFactory instance = new NyARAndroidMarkerSystemFactory();
48+
49+ /**
50+ * マーカーシステム本体
51+ */
52+ private NyARAndroidMarkerSystem nyartkMarkerSystem = null;
53+
54+ /**
55+ *
56+ */
57+ private boolean isMarkerSystemRunning = false;
58+
59+ /**
60+ * コンストラクタ
61+ */
62+ private NyARAndroidMarkerSystemFactory()
63+ {
64+ // no work
65+ }
66+
67+ /**
68+ * 仲介用のインスタンスを取得
69+ * 基本的に下記のようにして使用することになる。
70+ *
71+ * NyARAndroidMarkerSystemFactory.getInstance().getMarkerSystem().method();
72+ *
73+ * 上記のような使い方を剃る前にかならず、Marker system の初期化をおこなってください。
74+ *
75+ * @return
76+ */
77+ public static NyARAndroidMarkerSystemFactory getInstance() {
78+ return instance;
79+ }
80+
81+ /**
82+ * Marker system 初期化
83+ *
84+ * @param i_config
85+ * @return
86+ */
87+ public boolean configureMarkerSystem(INyARMarkerSystemConfig i_config)
88+ {
89+
90+ try {
91+ nyartkMarkerSystem = new NyARAndroidMarkerSystem(i_config);
92+ } catch (NyARException e) {
93+ return false;
94+ }
95+
96+ isMarkerSystemRunning = true;
97+
98+ return isMarkerSystemRunning;
99+ }
100+
101+ /**
102+ * これを利用する前に、かならずどこかのタイミングで configureMarkerSystem を実行してください。
103+ * 初期化されていない場合、nullが返却されます。
104+ *
105+ * @return
106+ */
107+ public NyARAndroidMarkerSystem getMarkerSystem()
108+ {
109+ return nyartkMarkerSystem;
110+ }
111+
112+ /**
113+ * Marker system が初期化済みかを確認するフラグ
114+ * @return
115+ */
116+ public boolean isMarkerSystemRunning()
117+ {
118+ return isMarkerSystemRunning;
119+ }
120+
121+}
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/androidgroup/nyartoolkit/markersystem/renderer/MarkerSystemAbstractRenderer.java
@@ -0,0 +1,103 @@
1+/**
2+ * NyARToolkit for Android SDK
3+ * Copyright (C)2012 NyARToolkit for Android team
4+ * Copyright (C)2012 R.Iizuka(nyatla)
5+ *
6+ * This program is free software: you can redistribute it and/or modify
7+ * it under the terms of the GNU General Public License as published by
8+ * the Free Software Foundation, either version 3 of the License, or
9+ * (at your option) any later version.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ *
19+ * For further information please contact.
20+ * http://sourceforge.jp/projects/nyartoolkit-and/
21+ *
22+ * This work is based on the original ARToolKit developed by
23+ * Hirokazu Kato
24+ * Mark Billinghurst
25+ * HITLab, University of Washington, Seattle
26+ * http://www.hitl.washington.edu/artoolkit/
27+ * Ryo Iizuka(nyatla)
28+ * http://nyatla.jp/nyatoolkit/
29+ *
30+ * Contributor(s)
31+ * Fuu Rokubou
32+ */
33+package jp.androidgroup.nyartoolkit.markersystem.renderer;
34+
35+import javax.microedition.khronos.egl.EGLConfig;
36+import javax.microedition.khronos.opengles.GL10;
37+
38+import jp.androidgroup.nyartoolkit.markersystem.android.NyARAndroidMarkerSystemFactory;
39+
40+import android.content.res.AssetManager;
41+import android.opengl.GLSurfaceView;
42+import android.util.Log;
43+
44+/**
45+ * Markersystem用のOpenGL ES Renderer
46+ * モデルデータの読み出しなどが含まれない、純粋にOpenGL ESで処理する場合の基本クラス。
47+ * 継承したクラス内で何かしらの描画処理を行わないと何もしないので注意してください。
48+ */
49+public class MarkerSystemAbstractRenderer implements GLSurfaceView.Renderer
50+{
51+ /**
52+ * Logging Tag
53+ */
54+ protected final static String TAG = "NyARTK4And.DefaultRenderer";
55+
56+ /**
57+ * 継承したクラス内でマーカーを追加する処理を記述します。
58+ * MarkerSystemを初期化した後でないと使えないため、配布サンプルでは、start preview 以降、
59+ * onResumeにも書けないので、 Activity.cameraPreviewFrame でフラグ確認を行ってから、
60+ * この処理を行なっています。
61+ *
62+ * マーカー読み込みだけであれば、クラス変数を定義して、コンストラクタに書いても構いません。
63+ * addMarkerは、継承したクラスのこのメソッドに書いてください。
64+ *
65+ * @param assetMng
66+ * @return
67+ */
68+ public boolean configureARScene(AssetManager assetMng)
69+ {
70+ return false;
71+ }
72+
73+ @Override
74+ public void onSurfaceCreated(GL10 gl, EGLConfig config) {
75+ Log.d(TAG, "onSurfaceCreated");
76+ // Transparent background
77+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.f);
78+ gl.glEnable(GL10.GL_DEPTH_TEST);
79+ }
80+
81+ @Override
82+ public void onSurfaceChanged(GL10 gl, int width, int height) {
83+ Log.d(TAG, "onSurfaceChanged");
84+ gl.glViewport(0, 0, width, height);
85+
86+ }
87+
88+ @Override
89+ public void onDrawFrame(GL10 gl) {
90+ if (NyARAndroidMarkerSystemFactory.getInstance().isMarkerSystemRunning()) {
91+ draw(gl);
92+ }
93+ }
94+
95+ /**
96+ * 継承したクラスで表示したいものを実装してください
97+ * @param gl
98+ */
99+ public void draw(GL10 gl) {
100+ gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
101+ }
102+
103+}
\ No newline at end of file
--- a/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/jogl/utils/NyARGLUtil.java
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/jogl/utils/NyARGLUtil.java
@@ -99,6 +99,52 @@ public class NyARGLUtil
9999 }
100100
101101 /**
102+ * この関数は、ARToolKitスタイルのカメラパラメータから、 CameraFrustamを計算します。
103+ * カメラパラメータの要素のうち、ProjectionMatrix成分のみを使います。
104+ * @param i_arparam
105+ * ARToolKitスタイルのカメラパラメータ。
106+ * @param i_scale
107+ * スケール値を指定します。1=1mmです。10ならば1=1cm,1000ならば1=1mです。
108+ * 2.53以前のNyARToolkitと互換性を持たせるときは、{@link #SCALE_FACTOR_toCameraFrustumRH_NYAR2}を指定してください。
109+ * @param i_near
110+ * 視錐体のnearPointを指定します。単位は、i_scaleに設定した値で決まります。
111+ * @param i_far
112+ * 視錐体のfarPointを指定します。単位は、i_scaleに設定した値で決まります。
113+ * @param o_gl_projection
114+ * OpenGLスタイルのProjectionMatrixです。double[16]を指定します。
115+ */
116+ public static void toCameraFrustumRHf(NyARParam i_arparam, double i_scale, double i_near, double i_far, float[] o_gl_projection)
117+ {
118+ toCameraFrustumRHf(i_arparam.getPerspectiveProjectionMatrix(),i_arparam.getScreenSize(),i_scale,i_near,i_far,o_gl_projection);
119+ return;
120+ }
121+ /**
122+ * この関数は、ARToolKitスタイルのProjectionMatrixから、 CameraFrustamを計算します。
123+ * @param i_promat
124+ * @param i_size
125+ * スクリーンサイズを指定します。
126+ * @param i_scale
127+ * {@link #toCameraFrustumRH(NyARParam i_arparam,double i_scale,double i_near,double i_far,double[] o_gl_projection)}を参照。
128+ * @param i_near
129+ * {@link #toCameraFrustumRH(NyARParam i_arparam,double i_scale,double i_near,double i_far,double[] o_gl_projection)}を参照。
130+ * @param i_far
131+ * {@link #toCameraFrustumRH(NyARParam i_arparam,double i_scale,double i_near,double i_far,double[] o_gl_projection)}を参照。
132+ * @param o_gl_projection
133+ * {@link #toCameraFrustumRH(NyARParam i_arparam,double i_scale,double i_near,double i_far,double[] o_gl_projection)}を参照。
134+ */
135+ public static void toCameraFrustumRHf(NyARPerspectiveProjectionMatrix i_promat, NyARIntSize i_size, double i_scale, double i_near, double i_far, float[] o_gl_projection)
136+ {
137+ NyARDoubleMatrix44 m = new NyARDoubleMatrix44();
138+ i_promat.makeCameraFrustumRH(i_size.w, i_size. h, i_near*i_scale, i_far*i_scale, m);
139+ double[] _gl_projection = new double[16];
140+ m.getValueT(_gl_projection);
141+ for (int i=0; i<_gl_projection.length; i++) {
142+ o_gl_projection[i] = (float)_gl_projection[i];
143+ }
144+ return;
145+ }
146+
147+ /**
102148 * この関数は、NyARTransMatResultをOpenGLのModelView行列へ変換します。
103149 * @param mat
104150 * 変換元の行列
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/INyARMarkerSystemConfig.java
@@ -0,0 +1,63 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem;
26+
27+import jp.nyatla.nyartoolkit.core.NyARException;
28+import jp.nyatla.nyartoolkit.core.analyzer.histogram.INyARHistogramAnalyzer_Threshold;
29+import jp.nyatla.nyartoolkit.core.param.NyARParam;
30+import jp.nyatla.nyartoolkit.core.transmat.INyARTransMat;
31+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;
32+
33+/**
34+ * このインタフェイスは、NyARMarkerSystemのコンフィギュレーションインタフェイスを定義します。
35+ *
36+ */
37+public interface INyARMarkerSystemConfig
38+{
39+ /**
40+ * 姿勢変換アルゴリズムクラスのオブジェクトを生成して返します。
41+ * @return
42+ * @throws NyARException
43+ */
44+ public INyARTransMat createTransmatAlgorism() throws NyARException;
45+ /**
46+ * 敷居値決定クラスを生成して返します。
47+ * @return
48+ * @throws NyARException
49+ */
50+ public INyARHistogramAnalyzer_Threshold createAutoThresholdArgorism() throws NyARException;
51+ /**
52+ * ARToolKitパラメータオブジェクトを返します。
53+ * @return
54+ * [readonly]
55+ */
56+ public NyARParam getNyARParam();
57+ /**
58+ * コンフィギュレーションのスクリーンサイズを返します。
59+ * @return
60+ * [readonly]
61+ */
62+ public NyARIntSize getScreenSize();
63+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/NyARMarkerSystem.java
@@ -0,0 +1,678 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem;
26+
27+import java.io.FileInputStream;
28+import java.io.InputStream;
29+
30+import jp.nyatla.nyartoolkit.core.NyARCode;
31+import jp.nyatla.nyartoolkit.core.NyARException;
32+import jp.nyatla.nyartoolkit.core.analyzer.histogram.*;
33+import jp.nyatla.nyartoolkit.core.param.NyARFrustum;
34+import jp.nyatla.nyartoolkit.core.param.NyARParam;
35+import jp.nyatla.nyartoolkit.core.raster.INyARGrayscaleRaster;
36+import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;
37+import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;
38+import jp.nyatla.nyartoolkit.core.rasterdriver.INyARPerspectiveCopy;
39+import jp.nyatla.nyartoolkit.core.rasterdriver.NyARPerspectiveCopyFactory;
40+import jp.nyatla.nyartoolkit.core.squaredetect.NyARCoord2Linear;
41+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector_Rle;
42+import jp.nyatla.nyartoolkit.core.transmat.INyARTransMat;
43+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;
44+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;
45+import jp.nyatla.nyartoolkit.core.types.NyARIntCoordinates;
46+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
47+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;
48+import jp.nyatla.nyartoolkit.core.types.matrix.NyARDoubleMatrix44;
49+import jp.nyatla.nyartoolkit.markersystem.utils.*;
50+
51+
52+
53+
54+
55+public class NyARMarkerSystem
56+{
57+ /**
58+ * 定数値。敷居値を自動決定します。
59+ */
60+ public static int THLESHOLD_AUTO=0xffffffff;
61+ public static double FRUSTUM_DEFAULT_FAR_CLIP=10000;
62+ public static double FRUSTUM_DEFAULT_NEAR_CLIP=10;
63+
64+ private static int MASK_IDTYPE=0xfffff000;
65+ private static int MASK_IDNUM =0x00000fff;
66+ private static int IDTYPE_ARTK=0x00000000;
67+ private static int IDTYPE_NYID=0x00001000;
68+
69+ private RleDetector _rledetect;
70+ protected NyARParam _ref_param;
71+ protected NyARFrustum _frustum;
72+ private int _last_gs_th;
73+ private int _bin_threshold=THLESHOLD_AUTO;
74+
75+ public NyARMarkerSystem(INyARMarkerSystemConfig i_config) throws NyARException
76+ {
77+ this._ref_param=i_config.getNyARParam();
78+ this._frustum=new NyARFrustum();
79+ this.initInstance(i_config);
80+ this.setProjectionMatrixClipping(FRUSTUM_DEFAULT_NEAR_CLIP, FRUSTUM_DEFAULT_FAR_CLIP);
81+ }
82+ protected void initInstance(INyARMarkerSystemConfig i_ref_config) throws NyARException
83+ {
84+ this._rledetect=new RleDetector(i_ref_config);
85+ this._hist_th=i_ref_config.createAutoThresholdArgorism();
86+ }
87+ /**
88+ * 現在のフラスタムを返します。
89+ * @return
90+ * [readonly]
91+ */
92+ public NyARFrustum getFrustum()
93+ {
94+ return this._frustum;
95+ }
96+ /**
97+ * 射影変換行列の視錐台パラメータを設定します。
98+ * @param i_near
99+ * @param i_far
100+ */
101+ public void setProjectionMatrixClipping(double i_near,double i_far)
102+ {
103+ NyARIntSize s=this._ref_param.getScreenSize();
104+ this._frustum.setValue(this._ref_param.getPerspectiveProjectionMatrix(),s.w,s.h,i_near,i_far);
105+ }
106+ /**
107+ * この関数は、1個のIdマーカをシステムに登録します。
108+ * インスタンスは、idに一致するNyIdマーカを検出します。
109+ * @param i_id
110+ * 登録するNyIdマーカのid値
111+ * @param i_marker_size
112+ * マーカの四方サイズ[mm]
113+ * @return
114+ * マーカID
115+ * @throws NyARException
116+ */
117+ public int addNyIdMarker(long i_id,double i_marker_size) throws NyARException
118+ {
119+ MarkerInfoNyId target=new MarkerInfoNyId(i_id,i_id,i_marker_size);
120+ if(!this._rledetect._idmk_list.add(target)){
121+ throw new NyARException();
122+ }
123+ if(!this._rledetect._tracking_list.add(target)){
124+ throw new NyARException();
125+ }
126+ return (this._rledetect._idmk_list.size()-1)|IDTYPE_NYID;
127+ }
128+ /**
129+ * この関数は、1個の範囲を持つidマーカをシステムに登録します。
130+ * インスタンスは、i_id_s<=n<=i_id_eの範囲にあるマーカを検出します。
131+ * 例えば、1番から5番までのマーカを検出する場合に使います。
132+ * @param i_id_s
133+ * Id範囲の開始値
134+ * @param i_id_e
135+ * Id範囲の終了値
136+ * @param i_marker_size
137+ * マーカの四方サイズ[mm]
138+ * @return
139+ * マーカID
140+ * @throws NyARException
141+ */
142+ public int addNyIdMarker(long i_id_s,long i_id_e,double i_marker_size) throws NyARException
143+ {
144+ MarkerInfoNyId target=new MarkerInfoNyId(i_id_s,i_id_e,i_marker_size);
145+ if(!this._rledetect._idmk_list.add(target)){
146+ throw new NyARException();
147+ }
148+ this._rledetect._tracking_list.add(target);
149+ return (this._rledetect._idmk_list.size()-1)|IDTYPE_NYID;
150+ }
151+ /**
152+ * この関数は、ARToolKitスタイルのマーカーを登録します。
153+ * @param i_code
154+ * 登録するマーカオブジェクト
155+ * @param i_patt_edge_percentage
156+ * エッジ割合。ARToolkitと同じ場合は25を指定します。
157+ * @param i_marker_size
158+ * マーカの平方サイズ[mm]
159+ * @return
160+ * マーカID
161+ * @throws NyARException
162+ */
163+ public int addARMarker(NyARCode i_code,int i_patt_edge_percentage,double i_marker_size) throws NyARException
164+ {
165+ MarkerInfoARMarker target=new MarkerInfoARMarker(i_code,i_patt_edge_percentage,i_marker_size);
166+ if(!this._rledetect._armk_list.add(target)){
167+ throw new NyARException();
168+ }
169+ this._rledetect._tracking_list.add(target);
170+ return (this._rledetect._armk_list.size()-1)| IDTYPE_ARTK;
171+ }
172+ /**
173+ * この関数は、ARToolKitスタイルのマーカーをストリームから読みだして、登録します。
174+ * @param i_stream
175+ * マーカデータを読み出すストリーム
176+ * @param i_patt_edge_percentage
177+ * エッジ割合。ARToolkitと同じ場合は25を指定します。
178+ * @param i_marker_size
179+ * マーカの平方サイズ[mm]
180+ * @return
181+ * マーカID
182+ * @throws NyARException
183+ */
184+ public int addARMarker(InputStream i_stream,int i_patt_resolution,int i_patt_edge_percentage,double i_marker_size) throws NyARException
185+ {
186+ NyARCode c=new NyARCode(i_patt_resolution,i_patt_resolution);
187+ c.loadARPatt(i_stream);
188+ return this.addARMarker(c, i_patt_edge_percentage, i_marker_size);
189+ }
190+ /**
191+ * この関数は、ARToolKitスタイルのマーカーをファイルから読みだして、登録します。
192+ * @param i_stream
193+ * マーカデータを読み出すストリーム
194+ * @param i_patt_edge_percentage
195+ * エッジ割合。ARToolkitと同じ場合は25を指定します。
196+ * @param i_marker_size
197+ * マーカの平方サイズ[mm]
198+ * @return
199+ * マーカID
200+ * @throws NyARException
201+ */
202+ public int addARMarker(String i_file_name,int i_patt_resolution,int i_patt_edge_percentage,double i_marker_size) throws NyARException
203+ {
204+ NyARCode c=new NyARCode(i_patt_resolution,i_patt_resolution);
205+ try{
206+ c.loadARPatt(new FileInputStream(i_file_name));
207+ }catch(Exception e){
208+ throw new NyARException(e);
209+ }
210+ return this.addARMarker(c,i_patt_edge_percentage, i_marker_size);
211+ }
212+ /**
213+ * 画像からマーカパターンを生成して登録します。
214+ * ビットマップ等の画像から生成したパターンは、撮影画像から生成したパターンファイルと比較して、撮影画像の色調変化に弱くなるので注意してください。
215+ * @param i_raster
216+ * マーカ画像を格納したラスタオブジェクト
217+ * @param i_patt_resolution
218+ * マーカの解像度
219+ * @param i_patt_edge_percentage
220+ * マーカのエッジ領域のサイズ。マーカパターンは、i_rasterからエッジ領域を除いたパターンから生成します。
221+ * @param i_marker_size
222+ * マーカの平方サイズ[mm]
223+ * @return
224+ * マーカid
225+ * @throws NyARException
226+ */
227+ public int addARMarker(INyARRgbRaster i_raster,int i_patt_resolution,int i_patt_edge_percentage,double i_marker_size) throws NyARException
228+ {
229+ NyARCode c=new NyARCode(i_patt_resolution,i_patt_resolution);
230+ NyARIntSize s=i_raster.getSize();
231+ //ラスタからマーカパターンを切り出す。
232+ INyARPerspectiveCopy pc=(INyARPerspectiveCopy)i_raster.createInterface(INyARPerspectiveCopy.class);
233+ NyARRgbRaster tr=new NyARRgbRaster(i_patt_resolution,i_patt_resolution);
234+ pc.copyPatt(0,0,s.w,0,s.w,s.h,0,s.h,i_patt_edge_percentage, i_patt_edge_percentage,4, tr);
235+ //切り出したパターンをセット
236+ c.setRaster(tr);
237+ this.addARMarker(c,i_patt_edge_percentage,i_marker_size);
238+ return 0;
239+ }
240+
241+
242+ /**
243+ * この関数は、 マーカIDのマーカが検出されているかを返します。
244+ * @param i_id
245+ * マーカID
246+ * @return
247+ * マーカを認識していればtrue
248+ */
249+ public boolean isExistMarker(int i_id)
250+ {
251+ return this.getLife(i_id)>0;
252+ }
253+ /**
254+ * この関数は、ARマーカの最近の一致度を返します。
255+ * {@link #isExistMarker(int)}がtrueの時にだけ使用できます。
256+ * 値は初期一致度であり、トラッキング中は変動しません。
257+ * @param i_id
258+ * マーカID
259+ * @return
260+ * 0&lt;n&lt;1の一致度。
261+ */
262+ public double getConfidence(int i_id) throws NyARException
263+ {
264+ if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
265+ //ARマーカ
266+ return this._rledetect._armk_list.get(i_id &MASK_IDNUM).cf;
267+ }
268+ //Idマーカ?
269+ throw new NyARException();
270+ }
271+ /**
272+ * この関数は、NyIdマーカのID値を返します。
273+ * 範囲指定で検出したマーカの、実際のIDを得る場合などに遣います。
274+ * @param i_id
275+ * マーカID
276+ * @return
277+ * nyIdのID値
278+ * @throws NyARException
279+ */
280+ public long getNyId(int i_id) throws NyARException
281+ {
282+ if((i_id & MASK_IDTYPE)==IDTYPE_NYID){
283+ //Idマーカ
284+ return this._rledetect._idmk_list.get(i_id &MASK_IDNUM).nyid;
285+ }
286+ //ARマーカ?
287+ throw new NyARException();
288+ }
289+ /**
290+ * この関数は、現在の2値化敷居値を返します。
291+ * 自動敷居値を選択している場合は、直近の敷居値を返します。
292+ * @return
293+ * 敷居値(0-255)
294+ */
295+ public int getCurrentThreshold()
296+ {
297+ return this._last_gs_th;
298+ }
299+ /**
300+ * この関数は、マーカIDのライフ値を返します。
301+ * ライフ値については、{@link TMarkerData#life}を参照してください。
302+ * @param i_id
303+ * マーカID
304+ * @return
305+ */
306+ public long getLife(int i_id)
307+ {
308+ if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
309+ //ARマーカ
310+ return this._rledetect._armk_list.get(i_id & MASK_IDNUM).life;
311+ }else{
312+ //Idマーカ
313+ return this._rledetect._idmk_list.get(i_id & MASK_IDNUM).life;
314+ }
315+ }
316+ /**
317+ * この関数は、マーカIDから消失カウンタの値を返します。
318+ * @param i_id
319+ * マーカID
320+ * @return
321+ * 消失カウンタの値
322+ */
323+ public long getLostCount(int i_id)
324+ {
325+ if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
326+ //ARマーカ
327+ return this._rledetect._armk_list.get(i_id & MASK_IDNUM).lost_count;
328+ }else{
329+ //Idマーカ
330+ return this._rledetect._idmk_list.get(i_id & MASK_IDNUM).lost_count;
331+ }
332+ }
333+ /**
334+ * この関数は、スクリーン座標点をマーカ平面の点に変換します。
335+ * @param i_id
336+ * @param i_x
337+ * 変換元のスクリーン座標
338+ * @param i_y
339+ * 変換元のスクリーン座標
340+ * @param i_out
341+ * 結果を格納するオブジェクト
342+ * @return
343+ * 結果を格納したi_outに設定したオブジェクト
344+ */
345+ public NyARDoublePoint3d getMarkerPlanePos(int i_id,int i_x,int i_y,NyARDoublePoint3d i_out)
346+ {
347+ this._frustum.unProjectOnMatrix(i_x, i_y,this.getMarkerMatrix(i_id),i_out);
348+ return i_out;
349+ }
350+ private NyARDoublePoint3d _wk_3dpos=new NyARDoublePoint3d();
351+ /**
352+ * この関数は、idで示されるマーカ座標系の点をスクリーン座標へ変換します。
353+ * @param i_id
354+ * マーカidを指定します。
355+ * @param i_x
356+ * マーカ座標系のX座標
357+ * @param i_y
358+ * マーカ座標系のY座標
359+ * @param i_z
360+ * マーカ座標系のZ座標
361+ * @param i_out
362+ * 結果を格納するオブジェクト
363+ * @return
364+ * 結果を格納したi_outに設定したオブジェクト
365+ */
366+ public NyARDoublePoint2d getScreenPos(int i_id,double i_x,double i_y,double i_z,NyARDoublePoint2d i_out)
367+ {
368+ NyARDoublePoint3d _wk_3dpos=this._wk_3dpos;
369+ this.getMarkerMatrix(i_id).transform3d(i_x, i_y, i_z,_wk_3dpos);
370+ this._frustum.project(_wk_3dpos,i_out);
371+ return i_out;
372+ }
373+ private NyARDoublePoint3d[] __pos3d=NyARDoublePoint3d.createArray(4);
374+ private NyARDoublePoint2d[] __pos2d=NyARDoublePoint2d.createArray(4);
375+
376+
377+ /**
378+ * この関数は、マーカ平面上の任意の4点で囲まれる領域から、画像を射影変換して返します。
379+ * 画像は、最後に入力した入力画像から取得します。
380+ * @param i_id
381+ * @param i_sensor
382+ * 画像を取得するセンサオブジェクト。通常は{@link #update(NyARSensor)}関数に入力したものと同じものを指定します。
383+ * @param i_x1
384+ * 頂点1
385+ * @param i_y1
386+ * 頂点1
387+ * @param i_x2
388+ * 頂点2
389+ * @param i_y2
390+ * 頂点2
391+ * @param i_x3
392+ * 頂点3
393+ * @param i_y3
394+ * 頂点3
395+ * @param i_x4
396+ * 頂点4
397+ * @param i_y4
398+ * 頂点4
399+ * @param i_raster
400+ * 出力先のオブジェクト
401+ * @return
402+ * 結果を格納したi_rasterオブジェクト
403+ * @throws NyARException
404+ */
405+ public INyARRgbRaster getMarkerPlaneImage(
406+ int i_id,
407+ NyARSensor i_sensor,
408+ int i_x1,int i_y1,
409+ int i_x2,int i_y2,
410+ int i_x3,int i_y3,
411+ int i_x4,int i_y4,
412+ INyARRgbRaster i_raster) throws NyARException
413+ {
414+ NyARDoublePoint3d[] pos = this.__pos3d;
415+ NyARDoublePoint2d[] pos2 = this.__pos2d;
416+ NyARDoubleMatrix44 tmat=this.getMarkerMatrix(i_id);
417+ tmat.transform3d(i_x1, i_y1,0, pos[1]);
418+ tmat.transform3d(i_x2, i_y2,0, pos[0]);
419+ tmat.transform3d(i_x3, i_y3,0, pos[3]);
420+ tmat.transform3d(i_x4, i_y4,0, pos[2]);
421+ for(int i=3;i>=0;i--){
422+ this._frustum.project(pos[i],pos2[i]);
423+ }
424+ return i_sensor.getPerspectiveImage(pos2[0].x, pos2[0].y,pos2[1].x, pos2[1].y,pos2[2].x, pos2[2].y,pos2[3].x, pos2[3].y,i_raster);
425+ }
426+ /**
427+ * この関数は、マーカ平面上の任意の4点で囲まれる領域から、画像を射影変換して返します。
428+ * 画像は、最後に入力した入力画像から取得します。
429+ * @param i_id
430+ * マーカid
431+ * @param i_sensor
432+ * 画像を取得するセンサオブジェクト。通常は{@link #update(NyARSensor)}関数に入力したものと同じものを指定します。
433+ * @param i_l
434+ * @param i_t
435+ * @param i_w
436+ * @param i_h
437+ * @param i_raster
438+ * 出力先のオブジェクト
439+ * @return
440+ * 結果を格納したi_rasterオブジェクト
441+ * @throws NyARException
442+ */
443+ public INyARRgbRaster getMarkerPlaneImage(
444+ int i_id,
445+ NyARSensor i_sensor,
446+ int i_l,int i_t,
447+ int i_w,int i_h,
448+ INyARRgbRaster i_raster) throws NyARException
449+ {
450+ return this.getMarkerPlaneImage(i_id,i_sensor,i_l+i_w-1,i_t+i_h-1,i_l,i_t+i_h-1,i_l,i_t,i_l+i_w-1,i_t,i_raster);
451+ }
452+ /**
453+ * この関数は、マーカの姿勢変換行列を返します。
454+ * @param i_id
455+ * マーカid
456+ * @return
457+ * [readonly]
458+ */
459+ public NyARDoubleMatrix44 getMarkerMatrix(int i_id)
460+ {
461+ if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
462+ //ARマーカ
463+ return this._rledetect._armk_list.get(i_id &MASK_IDNUM).tmat;
464+ }else{
465+ //Idマーカ
466+ return this._rledetect._idmk_list.get(i_id &MASK_IDNUM).tmat;
467+ }
468+ }
469+ /**
470+ * この関数は、マーカ頂点の二次元座標を返します。
471+ * @param i_id
472+ * マーカID
473+ * @return
474+ * [readonly]
475+ */
476+ public NyARIntPoint2d[] getMarkerVertex2D(int i_id)
477+ {
478+ if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
479+ //ARマーカ
480+ return this._rledetect._armk_list.get(i_id &MASK_IDNUM).tl_vertex;
481+ }else{
482+ //Idマーカ
483+ return this._rledetect._idmk_list.get(i_id &MASK_IDNUM).tl_vertex;
484+ }
485+ }
486+ /**
487+ * この関数は、2値化敷居値を設定します。
488+ * @param i_th
489+ * 2値化敷居値。{@link NyARMarkerSystem#THLESHOLD_AUTO}を指定すると、自動調整になります。
490+ */
491+ public void setBinThreshold(int i_th)
492+ {
493+ this._bin_threshold=i_th;
494+ }
495+ /**
496+ * ARマーカの一致敷居値を設定します。
497+ * @param i_val
498+ * 敷居値。0.0&lt;n&lt;1.0の値を指定すること。
499+ */
500+ public void setConfidenceThreshold(double i_val)
501+ {
502+ this._rledetect._armk_list.setConficenceTh(i_val);
503+ }
504+
505+ private long _time_stamp=-1;
506+ private INyARHistogramAnalyzer_Threshold _hist_th;
507+ /**
508+ * 状況を更新する。
509+ * @throws NyARException
510+ */
511+ public void update(NyARSensor i_sensor) throws NyARException
512+ {
513+ long time_stamp=i_sensor.getTimeStamp();
514+ //センサのタイムスタンプが変化していなければ何もしない。
515+ if(this._time_stamp==time_stamp){
516+ return;
517+ }
518+ int th=this._bin_threshold==THLESHOLD_AUTO?this._hist_th.getThreshold(i_sensor.getGsHistogram()):this._bin_threshold;
519+
520+ //解析器にかけてマーカを抽出。
521+ this._rledetect.detectMarker(i_sensor, time_stamp, th);
522+ //タイムスタンプを更新
523+ this._time_stamp=time_stamp;
524+ this._last_gs_th=th;
525+ }
526+
527+}
528+
529+
530+
531+
532+
533+
534+
535+
536+
537+/**
538+ * {@link MultiMarker}向けの矩形検出器です。
539+ */
540+class RleDetector extends NyARSquareContourDetector_Rle
541+{
542+ private final static int INITIAL_MARKER_STACK_SIZE=10;
543+ private NyARCoord2Linear _coordline;
544+
545+ private SquareStack _sq_stack;
546+ public int lost_th=5;
547+ public TrackingList _tracking_list;
548+ public ARMarkerList _armk_list;
549+ public NyIdList _idmk_list;
550+ public INyARTransMat _transmat;
551+ private INyARPerspectiveCopy _ref_input_rfb;
552+ private INyARGrayscaleRaster _ref_input_gs;
553+ public RleDetector(INyARMarkerSystemConfig i_config) throws NyARException
554+ {
555+ super( i_config.getNyARParam().getScreenSize());
556+ this._coordline=new NyARCoord2Linear(i_config.getNyARParam().getScreenSize(),i_config.getNyARParam().getDistortionFactor());
557+ this._armk_list=new ARMarkerList();
558+ this._idmk_list=new NyIdList();
559+ this._tracking_list=new TrackingList();
560+ this._transmat=i_config.createTransmatAlgorism();
561+ //同時に判定待ちにできる矩形の数
562+ this._sq_stack=new SquareStack(INITIAL_MARKER_STACK_SIZE);
563+ }
564+
565+ protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
566+ {
567+ //とりあえずSquareスタックを予約
568+ SquareStack.Item sq_tmp=this._sq_stack.prePush();
569+ //観測座標点の記録
570+ for(int i2=0;i2<4;i2++){
571+ sq_tmp.ob_vertex[i2].setValue(i_coord.items[i_vertex_index[i2]]);
572+ }
573+ //頂点分布を計算
574+ sq_tmp.vertex_area.setAreaRect(sq_tmp.ob_vertex,4);
575+ //頂点座標の中心を計算
576+ sq_tmp.center2d.setCenterPos(sq_tmp.ob_vertex,4);
577+ //矩形面積
578+ sq_tmp.rect_area=sq_tmp.vertex_area.w*sq_tmp.vertex_area.h;
579+
580+ boolean is_target_marker=false;
581+ for(;;){
582+ //トラッキング対象か確認する。
583+ if(this._tracking_list.update(sq_tmp)){
584+ //トラッキング対象ならブレーク
585+ is_target_marker=true;
586+ break;
587+ }
588+ //nyIdマーカの特定(IDマーカの特定はここで完結する。)
589+ if(this._idmk_list.size()>0){
590+ if(this._idmk_list.update(this._ref_input_gs,sq_tmp)){
591+ is_target_marker=true;
592+ break;//idマーカを特定
593+ }
594+ }
595+ //ARマーカの特定
596+ if(this._armk_list.size()>0){
597+ if(this._armk_list.update(this._ref_input_rfb,sq_tmp)){
598+ is_target_marker=true;
599+ break;
600+ }
601+ }
602+ break;
603+ }
604+ //この矩形が検出対象なら、矩形情報を精密に再計算
605+ if(is_target_marker){
606+ //矩形は検出対象にマークされている。
607+ for(int i2=0;i2<4;i2++){
608+ this._coordline.coord2Line(i_vertex_index[i2],i_vertex_index[(i2+1)%4],i_coord,sq_tmp.line[i2]);
609+ }
610+ for (int i2 = 0; i2 < 4; i2++) {
611+ //直線同士の交点計算
612+ if(!sq_tmp.line[i2].crossPos(sq_tmp.line[(i2 + 3) % 4],sq_tmp.sqvertex[i2])){
613+ throw new NyARException();//まずない。ありえない。
614+ }
615+ }
616+ }else{
617+ //この矩形は検出対象にマークされなかったので、解除
618+ this._sq_stack.pop();
619+ }
620+ }
621+
622+ public void detectMarker(NyARSensor i_sensor,long i_time_stamp,int i_th) throws NyARException
623+ {
624+ //準備(ミスカウンタを+1する。)
625+ for(int i=this._idmk_list.size()-1;i>=0;i--){
626+ MarkerInfoNyId target=this._idmk_list.get(i);
627+ if(target.lost_count<Integer.MAX_VALUE){
628+ target.lost_count++;
629+ }
630+ }
631+ this._sq_stack.clear();//矩形情報の保持スタック初期化
632+ this._tracking_list.prepare();
633+ this._idmk_list.prepare();
634+ this._armk_list.prepare();
635+ //検出処理
636+ this._ref_input_rfb=i_sensor.getPerspectiveCopy();
637+ this._ref_input_gs=i_sensor.getGsImage();
638+ super.detectMarker(this._ref_input_gs,i_th);
639+
640+ //検出結果の反映処理
641+ this._tracking_list.finish();
642+ this._armk_list.finish();
643+ this._idmk_list.finish();
644+ //期限切れチェック
645+ for(int i=this._tracking_list.size()-1;i>=0;i--){
646+ TMarkerData item=this._tracking_list.get(i);
647+ if(item.lost_count>this.lost_th){
648+ item.life=0;//活性off
649+ }
650+ }
651+ //各ターゲットの更新
652+ for(int i=this._armk_list.size()-1;i>=0;i--){
653+ MarkerInfoARMarker target=this._armk_list.get(i);
654+ if(target.lost_count==0){
655+ target.time_stamp=i_time_stamp;
656+ this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
657+ }
658+ }
659+ for(int i=this._idmk_list.size()-1;i>=0;i--){
660+ MarkerInfoNyId target=this._idmk_list.get(i);
661+ if(target.lost_count==0){
662+ target.time_stamp=i_time_stamp;
663+ this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
664+ }
665+ }
666+ }
667+}
668+
669+
670+
671+
672+
673+
674+
675+
676+
677+
678+
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/NyARMarkerSystemConfig.java
@@ -0,0 +1,81 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem;
26+
27+import java.io.InputStream;
28+
29+import jp.nyatla.nyartoolkit.core.NyARException;
30+import jp.nyatla.nyartoolkit.core.analyzer.histogram.INyARHistogramAnalyzer_Threshold;
31+import jp.nyatla.nyartoolkit.core.analyzer.histogram.NyARHistogramAnalyzer_SlidePTile;
32+import jp.nyatla.nyartoolkit.core.param.NyARParam;
33+import jp.nyatla.nyartoolkit.core.transmat.INyARTransMat;
34+import jp.nyatla.nyartoolkit.core.transmat.NyARTransMat;
35+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;
36+
37+public class NyARMarkerSystemConfig implements INyARMarkerSystemConfig
38+{
39+ protected NyARParam _param;
40+ public NyARMarkerSystemConfig(NyARParam i_param)
41+ {
42+ this._param=i_param;
43+ }
44+ public NyARMarkerSystemConfig(InputStream i_ar_param_stream,int i_width,int i_height) throws NyARException
45+ {
46+ this._param=new NyARParam();
47+ this._param.loadARParam(i_ar_param_stream);
48+ this._param.changeScreenSize(i_width,i_height);
49+ }
50+ /**
51+ * コンストラクタです。カメラパラメータにサンプル値(../Data/camera_para.dat)をロードして、コンフィギュレーションを生成します。
52+ * @param i_width
53+ * @param i_height
54+ * @throws NyARException
55+ */
56+ public NyARMarkerSystemConfig(int i_width,int i_height) throws NyARException
57+ {
58+ this._param=new NyARParam();
59+ this._param.loadDefaultParameter();
60+ this._param.changeScreenSize(i_width,i_height);
61+ }
62+ /**
63+ * スクリーンサイズを返します。
64+ */
65+ public final NyARIntSize getScreenSize()
66+ {
67+ return this._param.getScreenSize();
68+ }
69+ public INyARTransMat createTransmatAlgorism() throws NyARException
70+ {
71+ return new NyARTransMat(this._param);
72+ }
73+ public INyARHistogramAnalyzer_Threshold createAutoThresholdArgorism()
74+ {
75+ return new NyARHistogramAnalyzer_SlidePTile(15);
76+ }
77+ public NyARParam getNyARParam()
78+ {
79+ return this._param;
80+ }
81+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/NyARSensor.java
@@ -0,0 +1,211 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem;
26+
27+
28+
29+import jp.nyatla.nyartoolkit.core.NyARException;
30+import jp.nyatla.nyartoolkit.core.raster.*;
31+import jp.nyatla.nyartoolkit.core.raster.rgb.*;
32+import jp.nyatla.nyartoolkit.core.rasterdriver.INyARHistogramFromRaster;
33+import jp.nyatla.nyartoolkit.core.rasterdriver.INyARPerspectiveCopy;
34+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2gs.*;
35+import jp.nyatla.nyartoolkit.core.types.*;
36+
37+
38+
39+/**
40+ * MarkerSystemの入力データを管理するベースクラスです。生データのスナップショット管理を行います。
41+ */
42+public class NyARSensor
43+{
44+ protected NyARHistogram _gs_hist;
45+ private INyARRgbRaster _ref_raster;
46+ protected INyARGrayscaleRaster _gs_raster;
47+ private long _src_ts;
48+ private long _gs_id_ts;
49+ private long _gs_hist_ts;
50+ public NyARSensor(NyARIntSize i_size) throws NyARException
51+ {
52+ this.initInstance(i_size);
53+ this._hist_drv=(INyARHistogramFromRaster) this._gs_raster.createInterface(INyARHistogramFromRaster.class);
54+ }
55+ /**
56+ * 画像ドライバに依存するインスタンスの生成。
57+ * 継承クラスで上書きする。
58+ * @param s
59+ * @throws NyARException
60+ */
61+ protected void initResource(NyARIntSize s) throws NyARException
62+ {
63+ this._gs_raster=new NyARGrayscaleRaster(s.w,s.h,NyARBufferType.INT1D_GRAY_8,true);
64+ }
65+ /**
66+ *
67+ * @param i_size
68+ * @throws NyARException
69+ */
70+ private void initInstance(NyARIntSize i_size) throws NyARException
71+ {
72+ //リソースの生成
73+ this.initResource(i_size);
74+ this._gs_hist=new NyARHistogram(256);
75+ this._src_ts=0;
76+ this._gs_id_ts=0;
77+ this._gs_hist_ts=0;
78+ }
79+ /**
80+ * キャッシュしている射影変換ドライバを返します。
81+ * この関数は、内部処理向けの関数です。
82+ * @return
83+ * [readonly]
84+ */
85+ public INyARPerspectiveCopy getPerspectiveCopy()
86+ {
87+ return this._pcopy;
88+ }
89+ private INyARHistogramFromRaster _hist_drv=null;
90+ private INyARRaster _last_input_rasster=null;
91+ private INyARPerspectiveCopy _pcopy;
92+ private INyARRgb2GsFilter _rgb2gs=null;
93+ /**
94+ * この関数は、入力画像を元に、インスタンスの状態を更新します。
95+ * この関数は、タイムスタンプをインクリメントします。
96+ * @param i_input
97+ * @throws NyARException
98+ */
99+ public void update(INyARRgbRaster i_input) throws NyARException
100+ {
101+ //ラスタドライバの準備
102+ if(this._last_input_rasster!=i_input){
103+ this._rgb2gs=(INyARRgb2GsFilter) i_input.createInterface(INyARRgb2GsFilter.class);
104+ this._pcopy=(INyARPerspectiveCopy) i_input.createInterface(INyARPerspectiveCopy.class);
105+ this._last_input_rasster=i_input;
106+ }
107+ //RGB画像の差し替え
108+ this._ref_raster=i_input;
109+ //ソースidのインクリメント
110+ this._src_ts++;
111+ }
112+ /**
113+ * この関数は、タイムスタンプを強制的にインクリメントします。
114+ */
115+ public void updateTimeStamp()
116+ {
117+ this._src_ts++;
118+ }
119+ /**
120+ * 現在のタイムスタンプを返します。
121+ * @return
122+ */
123+ public long getTimeStamp()
124+ {
125+ return this._src_ts;
126+ }
127+ /**
128+ * この関数は、グレースケールに変換した現在の画像を返します。
129+ * @return
130+ * @throws NyARException
131+ */
132+ public INyARGrayscaleRaster getGsImage() throws NyARException
133+ {
134+ //必要に応じてグレースケール画像の生成
135+ if(this._src_ts!=this._gs_id_ts){
136+ this._rgb2gs.convert(this._gs_raster);
137+ this._gs_id_ts=this._src_ts;
138+ }
139+ return this._gs_raster;
140+ //
141+ }
142+ /**
143+ * この関数は、現在のGS画像のヒストグラムを返します。
144+ * @throws NyARException
145+ */
146+ public NyARHistogram getGsHistogram() throws NyARException
147+ {
148+ //必要に応じてヒストグラムを生成
149+ if(this._gs_id_ts!=this._gs_hist_ts){
150+ this._hist_drv.createHistogram(4,this._gs_hist);
151+ this._gs_hist_ts=this._gs_id_ts;
152+ }
153+ return this._gs_hist;
154+ }
155+ /**
156+ * 現在の入力画像の参照値を返します。
157+ * @return
158+ */
159+ public INyARRgbRaster getSourceImage()
160+ {
161+ return this._ref_raster;
162+ }
163+
164+ /**
165+ * 任意の4頂点領域を射影変換して取得します。
166+ * @param i_x1
167+ * @param i_y1
168+ * @param i_x2
169+ * @param i_y2
170+ * @param i_x3
171+ * @param i_y3
172+ * @param i_x4
173+ * @param i_y4
174+ * @return
175+ * @throws NyARException
176+ */
177+ public INyARRgbRaster getPerspectiveImage(
178+ int i_x1,int i_y1,
179+ int i_x2,int i_y2,
180+ int i_x3,int i_y3,
181+ int i_x4,int i_y4,
182+ INyARRgbRaster i_raster) throws NyARException
183+ {
184+ this._pcopy.copyPatt(i_x1, i_y1, i_x2, i_y2, i_x3, i_y3, i_x4, i_y4,0,0,1, i_raster);
185+ return i_raster;
186+ }
187+ /**
188+ * 任意の4頂点領域を射影変換して取得します。
189+ * @param i_x1
190+ * @param i_y1
191+ * @param i_x2
192+ * @param i_y2
193+ * @param i_x3
194+ * @param i_y3
195+ * @param i_x4
196+ * @param i_y4
197+ * @param i_raster
198+ * @return
199+ * @throws NyARException
200+ */
201+ public INyARRgbRaster getPerspectiveImage(
202+ double i_x1,double i_y1,
203+ double i_x2,double i_y2,
204+ double i_x3,double i_y3,
205+ double i_x4,double i_y4,
206+ INyARRgbRaster i_raster) throws NyARException
207+ {
208+ this._pcopy.copyPatt(i_x1, i_y1, i_x2, i_y2, i_x3, i_y3, i_x4, i_y4,0,0,1, i_raster);
209+ return i_raster;
210+ }
211+}
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/ARMarkerList.java
@@ -0,0 +1,152 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import java.util.ArrayList;
28+
29+import jp.nyatla.nyartoolkit.core.NyARException;
30+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattDeviationColorData;
31+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattResult;
32+import jp.nyatla.nyartoolkit.core.rasterdriver.INyARPerspectiveCopy;
33+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
34+
35+
36+public class ARMarkerList extends ArrayList<MarkerInfoARMarker>
37+{
38+ /**
39+ *
40+ */
41+ private static final long serialVersionUID = 1L;
42+ private double _configense_th=0.5;//RGB比較をしなければ0.7くらいでいいのだけど。
43+ private final NyARMatchPattResult _patt_result=new NyARMatchPattResult();;
44+ private final MultiResolutionPattProvider _mpickup=new MultiResolutionPattProvider();
45+ private ARMarkerSortList _mkmap;
46+ public ARMarkerList() throws NyARException
47+ {
48+ this._mkmap=new ARMarkerSortList();//初期値1マーカ
49+ return;
50+ }
51+ /**
52+ * このAdd以外使わないでね。
53+ */
54+ public boolean add(MarkerInfoARMarker i_e)
55+ {
56+ //マッチテーブルのサイズを調整
57+ int s=this.size()+1;
58+ while(this._mkmap.getLength()<s*s){
59+ this._mkmap.append();
60+ }
61+ return super.add(i_e);
62+ }
63+ /**
64+ * マーカの一致敷居値を設定する。
65+ */
66+ public void setConficenceTh(double i_th)
67+ {
68+ this._configense_th=i_th;
69+ }
70+ /**
71+ * o_targetsに、敷居値を越えたターゲットリストを返却する。
72+ * @param i_pix_drv
73+ * @param i_vertex
74+ * @param o_targets
75+ * @return
76+ * @throws NyARException
77+ */
78+ public boolean update(INyARPerspectiveCopy i_pix_drv,SquareStack.Item i_sq) throws NyARException
79+ {
80+ //sq_tmpに値を生成したかのフラグ
81+ boolean is_ganalated_sq=false;
82+ for(int i=this.size()-1;i>=0;i--){
83+ MarkerInfoARMarker target=this.get(i);
84+ //解像度に一致する画像を取得
85+ NyARMatchPattDeviationColorData diff=this._mpickup.getDeviationColorData(target, i_pix_drv,i_sq.ob_vertex);
86+ //マーカのパターン解像度に一致したサンプリング画像と比較する。
87+ if(!target.matchpatt.evaluate(diff,this._patt_result)){
88+ continue;
89+ }
90+ //敷居値をチェック
91+ if(this._patt_result.confidence<this._configense_th)
92+ {
93+ continue;
94+ }
95+ //マーカマップへの追加対象か調べる。
96+ ARMarkerSortList.Item ip=this._mkmap.getInsertPoint(this._patt_result.confidence);
97+ if(ip==null){
98+ continue;
99+ }
100+ //マーカマップアイテムの矩形に参照値を設定する。
101+ ip=this._mkmap.insertFromTailBefore(ip);
102+ ip.cf=this._patt_result.confidence;
103+ ip.dir=this._patt_result.direction;
104+ ip.marker=target;
105+ ip.ref_sq=i_sq;
106+ is_ganalated_sq=true;
107+ }
108+ return is_ganalated_sq;
109+ }
110+ /**
111+ * @param i_num_of_markers
112+ * マーカの個数
113+ */
114+ public void prepare()
115+ {
116+ //マッチングテーブルをリセット
117+ this._mkmap.reset();
118+
119+ //検出のために初期値設定
120+ for(int i=this.size()-1;i>=0;i--){
121+ MarkerInfoARMarker target=this.get(i);
122+ if(target.life>0){
123+ target.lost_count++;
124+ }
125+ }
126+ }
127+ public void finish()
128+ {
129+ //一致率の最も高いアイテムを得る。
130+ ARMarkerSortList.Item top_item=this._mkmap.getTopItem();
131+ //アイテムを検出できなくなるまで、一致率が高い順にアイテムを得る。
132+ while(top_item!=null){
133+ //検出したアイテムのARmarkerIndexのデータをセット
134+ MarkerInfoARMarker target=top_item.marker;
135+ if(target.lost_count>0){
136+ //未割当のマーカのみ検出操作を実行。
137+ target.cf=top_item.cf;
138+ target.lost_count=0;//消失カウンタをリセット
139+ target.life++; //ライフ値を加算
140+ target.sq=top_item.ref_sq;
141+ target.sq.rotateVertexL(4-top_item.dir);
142+ NyARIntPoint2d.shiftCopy(top_item.ref_sq.ob_vertex,target.tl_vertex,4-top_item.dir);
143+ target.tl_center.setValue(top_item.ref_sq.center2d);
144+ target.tl_rect_area=top_item.ref_sq.rect_area;
145+ }
146+ //基準アイテムと重複するアイテムを削除する。
147+ this._mkmap.disableMatchItem(top_item);
148+ top_item=this._mkmap.getTopItem();
149+ }
150+ //消失カウンタが敷居値を越えたら、lifeを0にする。
151+ }
152+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/ARMarkerSortList.java
@@ -0,0 +1,121 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import jp.nyatla.nyartoolkit.core.utils.NyARLinkList;
28+
29+
30+
31+public class ARMarkerSortList extends NyARLinkList<ARMarkerSortList.Item>
32+{
33+ public class Item extends NyARLinkList.Item
34+ {
35+ public MarkerInfoARMarker marker;
36+ public double cf;
37+ public int dir;
38+ public SquareStack.Item ref_sq;
39+ };
40+ /**
41+ * 指定個数のリンクリストを生成。
42+ * @param i_num_of_item
43+ */
44+ public ARMarkerSortList()
45+ {
46+ super(1);
47+ }
48+ protected Item createElement()
49+ {
50+ return new Item();
51+ }
52+ /**
53+ * 挿入ポイントを返す。挿入ポイントは、i_sd_point(距離点数)が
54+ * 登録済のポイントより小さい場合のみ返却する。
55+ * @return
56+ */
57+ public Item getInsertPoint(double i_cf)
58+ {
59+ Item ptr=_head_item;
60+ //先頭の場合
61+ if(ptr.cf<i_cf){
62+ return ptr;
63+ }
64+ //それ以降
65+ ptr=(Item) ptr.next;
66+ for(int i=this._num_of_item-2;i>=0;i--)
67+ {
68+ if(ptr.cf<i_cf){
69+ return ptr;
70+ }
71+ ptr=(Item) ptr.next;
72+ }
73+ //対象外。
74+ return null;
75+ }
76+ public void reset()
77+ {
78+ Item ptr=this._head_item;
79+ for(int i=this._num_of_item-1;i>=0;i--)
80+ {
81+ ptr.cf=0;
82+ ptr.marker=null;
83+ ptr.ref_sq=null;
84+ ptr=(Item) ptr.next;
85+ }
86+
87+ }
88+ /**
89+ * リストから最も高い一致率のアイテムを取得する。
90+ */
91+ public Item getTopItem()
92+ {
93+ Item ptr=this._head_item;
94+ for(int i=this._num_of_item-1;i>=0;i--)
95+ {
96+ if(ptr.marker==null){
97+ ptr=(Item) ptr.next;
98+ continue;
99+ }
100+ return ptr;
101+ }
102+ return null;
103+ }
104+ /**
105+ * リスト中の、i_itemと同じマーカIDか、同じ矩形情報を参照しているものを無効に(ptr.idを-1)する。
106+ */
107+ public void disableMatchItem(Item i_item)
108+ {
109+ Item ptr=this._head_item;
110+ for(int i=this._num_of_item-1;i>=0;i--)
111+ {
112+ if((ptr.marker==i_item.marker) || (ptr.ref_sq==i_item.ref_sq)){
113+ ptr.marker=null;
114+ }
115+ ptr=(Item) ptr.next;
116+ }
117+ }
118+ public int getLength(){
119+ return this._num_of_item;
120+ }
121+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/MarkerInfoARMarker.java
@@ -0,0 +1,57 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import jp.nyatla.nyartoolkit.core.NyARCode;
28+import jp.nyatla.nyartoolkit.core.NyARException;
29+import jp.nyatla.nyartoolkit.core.match.NyARMatchPatt_Color_WITHOUT_PCA;
30+
31+
32+/**
33+ * sqメンバは、参照です。
34+ *
35+ */
36+public class MarkerInfoARMarker extends TMarkerData
37+{
38+ /** MK_ARの情報。比較のための、ARToolKitマーカを格納します。*/
39+ public final NyARMatchPatt_Color_WITHOUT_PCA matchpatt;
40+ /** MK_ARの情報。検出した矩形の格納変数。マーカの一致度を格納します。*/
41+ public double cf;
42+ public int patt_w;
43+ public int patt_h;
44+ /** MK_ARの情報。パターンのエッジ割合。*/
45+ public final int patt_edge_percentage;
46+ /** */
47+ public MarkerInfoARMarker(NyARCode i_patt,int i_patt_edge_percentage,double i_patt_size) throws NyARException
48+ {
49+ super();
50+ this.matchpatt=new NyARMatchPatt_Color_WITHOUT_PCA(i_patt);
51+ this.patt_edge_percentage=i_patt_edge_percentage;
52+ this.marker_offset.setSquare(i_patt_size);
53+ this.patt_w=i_patt.getWidth();
54+ this.patt_h=i_patt.getHeight();
55+ return;
56+ }
57+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/MarkerInfoNyId.java
@@ -0,0 +1,56 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import jp.nyatla.nyartoolkit.core.NyARException;
28+
29+
30+
31+
32+public class MarkerInfoNyId extends TMarkerData
33+{
34+ /** MK_NyIdの情報。 反応するidの開始レンジ*/
35+ public final long nyid_range_s;
36+ /** MK_NyIdの情報。 反応するidの終了レンジ*/
37+ public final long nyid_range_e;
38+ /** MK_NyIdの情報。 実際のid値*/
39+ public long nyid;
40+ public int dir;
41+ /**
42+ * コンストラクタです。初期値から、Idマーカのインスタンスを生成します。
43+ * @param i_range_s
44+ * @param i_range_e
45+ * @param i_patt_size
46+ * @throws NyARException
47+ */
48+ public MarkerInfoNyId(long i_nyid_range_s,long i_nyid_range_e,double i_patt_size)
49+ {
50+ super();
51+ this.marker_offset.setSquare(i_patt_size);
52+ this.nyid_range_s=i_nyid_range_s;
53+ this.nyid_range_e=i_nyid_range_e;
54+ return;
55+ }
56+}
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/MultiResolutionPattProvider.java
@@ -0,0 +1,95 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import java.util.ArrayList;
28+
29+import jp.nyatla.nyartoolkit.core.NyARException;
30+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattDeviationColorData;
31+import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;
32+import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;
33+import jp.nyatla.nyartoolkit.core.rasterdriver.INyARPerspectiveCopy;
34+import jp.nyatla.nyartoolkit.core.types.NyARBufferType;
35+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
36+
37+
38+/**
39+ * このクラスは、複数の異なる解像度の比較画像を保持します。
40+ */
41+public class MultiResolutionPattProvider
42+{
43+ private class Item
44+ {
45+ public INyARRgbRaster _patt;
46+ public NyARMatchPattDeviationColorData _patt_d;
47+ public int _patt_edge;
48+ public int _patt_resolution;
49+ public Item(int i_patt_w,int i_patt_h,int i_edge_percentage) throws NyARException
50+ {
51+ int r=1;
52+ //解像度は幅を基準にする。
53+ while(i_patt_w*r<64){
54+ r*=2;
55+ }
56+ this._patt=new NyARRgbRaster(i_patt_w,i_patt_h,NyARBufferType.INT1D_X8R8G8B8_32,true);
57+ this._patt_d=new NyARMatchPattDeviationColorData(i_patt_w,i_patt_h);
58+ this._patt_edge=i_edge_percentage;
59+ this._patt_resolution=r;
60+ }
61+ }
62+ /**
63+ * インスタンスのキャッシュ
64+ */
65+ private ArrayList<Item> items=new ArrayList<Item>();
66+ /**
67+ * [readonly]マーカにマッチした{@link NyARMatchPattDeviationColorData}インスタンスを得る。
68+ * @throws NyARException
69+ */
70+ public NyARMatchPattDeviationColorData getDeviationColorData(MarkerInfoARMarker i_marker,INyARPerspectiveCopy i_pix_drv, NyARIntPoint2d[] i_vertex) throws NyARException
71+ {
72+ int mk_edge=i_marker.patt_edge_percentage;
73+ for(int i=this.items.size()-1;i>=0;i--)
74+ {
75+ Item ptr=this.items.get(i);
76+ if(!ptr._patt.getSize().isEqualSize(i_marker.patt_w,i_marker.patt_h) || ptr._patt_edge!=mk_edge)
77+ {
78+ //サイズとエッジサイズが合致しない物はスルー
79+ continue;
80+ }
81+ //古かったら更新
82+ i_pix_drv.copyPatt(i_vertex,ptr._patt_edge,ptr._patt_edge,ptr._patt_resolution,ptr._patt);
83+ ptr._patt_d.setRaster(ptr._patt);
84+ return ptr._patt_d;
85+ }
86+ //無い。新しく生成
87+ Item item=new Item(i_marker.patt_w,i_marker.patt_h,mk_edge);
88+ //タイムスタンプの更新とデータの生成
89+ i_pix_drv.copyPatt(i_vertex,item._patt_edge,item._patt_edge,item._patt_resolution,item._patt);
90+ item._patt_d.setRaster(item._patt);
91+ this.items.add(item);
92+ return item._patt_d;
93+ }
94+
95+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/NyIdList.java
@@ -0,0 +1,106 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import java.util.ArrayList;
28+
29+import jp.nyatla.nyartoolkit.core.NyARException;
30+import jp.nyatla.nyartoolkit.core.raster.INyARGrayscaleRaster;
31+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
32+import jp.nyatla.nyartoolkit.nyidmarker.*;
33+import jp.nyatla.nyartoolkit.nyidmarker.data.*;
34+
35+public class NyIdList extends ArrayList<MarkerInfoNyId>
36+{
37+ private static final long serialVersionUID = -6446466460932931830L;
38+ /**輪郭推定器*/
39+ private NyIdMarkerPickup _id_pickup;
40+ private final NyIdMarkerPattern _id_patt=new NyIdMarkerPattern();
41+ private final NyIdMarkerParam _id_param=new NyIdMarkerParam();
42+ private final NyIdMarkerDataEncoder_RawBitId _id_encoder=new NyIdMarkerDataEncoder_RawBitId();
43+ private final NyIdMarkerData_RawBitId _id_data=new NyIdMarkerData_RawBitId();
44+ public NyIdList() throws NyARException
45+ {
46+ this._id_pickup = new NyIdMarkerPickup();
47+ }
48+ public void prepare()
49+ {
50+ for(int i=this.size()-1;i>=0;i--){
51+ MarkerInfoNyId target=this.get(i);
52+ if(target.life>0){
53+ target.lost_count++;
54+ }
55+ target.sq=null;
56+ }
57+ }
58+ public boolean update(INyARGrayscaleRaster i_raster,SquareStack.Item i_sq) throws NyARException
59+ {
60+ if(!this._id_pickup.pickFromRaster(i_raster.getGsPixelDriver(),i_sq.ob_vertex, this._id_patt, this._id_param))
61+ {
62+ return false;
63+ }
64+ if(!this._id_encoder.encode(this._id_patt,this._id_data)){
65+ return false;
66+ }
67+ //IDを検出
68+ long s=this._id_data.marker_id;
69+ for(int i=this.size()-1;i>=0;i--){
70+ MarkerInfoNyId target=this.get(i);
71+ if(target.nyid_range_s>s || s>target.nyid_range_e)
72+ {
73+ continue;
74+ }
75+ //既に認識済なら無視
76+ if(target.lost_count==0){
77+ continue;
78+ }
79+ //一致したよー。
80+ target.nyid=s;
81+ target.dir=this._id_param.direction;
82+ target.sq=i_sq;
83+ return true;
84+ }
85+ return false;
86+ }
87+ public void finish()
88+ {
89+ for(int i=this.size()-1;i>=0;i--)
90+ {
91+ MarkerInfoNyId target=this.get(i);
92+ if(target.sq==null){
93+ continue;
94+ }
95+ if(target.lost_count>0){
96+ //参照はそのままで、dirだけ調整する。
97+ target.lost_count=0;
98+ target.life++;
99+ target.sq.rotateVertexL(4-target.dir);
100+ NyARIntPoint2d.shiftCopy(target.sq.ob_vertex,target.tl_vertex,4-target.dir);
101+ target.tl_center.setValue(target.sq.center2d);
102+ target.tl_rect_area=target.sq.rect_area;
103+ }
104+ }
105+ }
106+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/SquareStack.java
@@ -0,0 +1,54 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import jp.nyatla.nyartoolkit.core.NyARException;
28+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;
29+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
30+import jp.nyatla.nyartoolkit.core.types.NyARIntRect;
31+import jp.nyatla.nyartoolkit.core.types.stack.NyARObjectStack;
32+
33+
34+public class SquareStack extends NyARObjectStack<SquareStack.Item>
35+{
36+ public class Item extends NyARSquare
37+ {
38+ public NyARIntPoint2d center2d=new NyARIntPoint2d();
39+ /** 検出座標系の値*/
40+ public NyARIntPoint2d[] ob_vertex=NyARIntPoint2d.createArray(4);
41+ /** 頂点の分布範囲*/
42+ public NyARIntRect vertex_area=new NyARIntRect();
43+ /** rectの面積*/
44+ public int rect_area;
45+ }
46+ public SquareStack(int i_length) throws NyARException
47+ {
48+ super.initInstance(i_length,SquareStack.Item.class);
49+ }
50+ protected SquareStack.Item createElement() throws NyARException
51+ {
52+ return new SquareStack.Item();
53+ }
54+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/TMarkerData.java
@@ -0,0 +1,58 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import jp.nyatla.nyartoolkit.core.transmat.NyARRectOffset;
28+import jp.nyatla.nyartoolkit.core.transmat.NyARTransMatResult;
29+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
30+
31+/**
32+ * マーカ情報を格納するためのクラスです。
33+ */
34+public class TMarkerData
35+{
36+ /** 最後に認識したタイムスタンプ。*/
37+ public long time_stamp;
38+ /** ライフ値
39+ * マーカ検出時にリセットされ、1フレームごとに1づつインクリメントされる値です。
40+ */
41+ public long life;
42+ /** MK情報。マーカのオフセット位置。*/
43+ public final NyARRectOffset marker_offset=new NyARRectOffset();
44+ /** 検出した矩形の格納変数。理想形二次元座標を格納します。*/
45+ public SquareStack.Item sq;
46+ /** 検出した矩形の格納変数。マーカの姿勢行列を格納します。*/
47+ public final NyARTransMatResult tmat=new NyARTransMatResult();
48+ /** 矩形の検出状態の格納変数。 連続して見失った回数を格納します。*/
49+ public int lost_count=Integer.MAX_VALUE;
50+ /** トラッキングログ用の領域*/
51+ public NyARIntPoint2d[] tl_vertex=NyARIntPoint2d.createArray(4);
52+ public NyARIntPoint2d tl_center=new NyARIntPoint2d();
53+ public int tl_rect_area;
54+ protected TMarkerData()
55+ {
56+ this.life=0;
57+ }
58+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/TrackingList.java
@@ -0,0 +1,158 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import java.util.ArrayList;
28+
29+import jp.nyatla.nyartoolkit.core.NyARException;
30+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
31+
32+
33+public class TrackingList extends ArrayList<TMarkerData>
34+{
35+ private static final long serialVersionUID = -6446466460932931830L;
36+ private VertexSortTable _tracking_list;
37+ public TrackingList() throws NyARException
38+ {
39+ this._tracking_list=new VertexSortTable(1);
40+ }
41+ public void prepare()
42+ {
43+ //トラッキングリストをリセット
44+ this._tracking_list.reset();
45+ }
46+ private int[] __ret=new int[2];
47+ public boolean update(SquareStack.Item i_new_sq) throws NyARException
48+ {
49+ int[] ret=this.__ret;
50+ int new_area=i_new_sq.rect_area;
51+ //頂点の対角距離
52+ int new_sq_dist=i_new_sq.vertex_area.getDiagonalSqDist();
53+ boolean is_dispatched=false;
54+ for(int i=this.size()-1;i>=0;i--)
55+ {
56+ TMarkerData target=this.get(i);
57+ if(target.lost_count>1){
58+ continue;
59+ }
60+ //面積比が急激0.8-1.2倍以外の変動なら無視
61+ int a_rate=new_area*100/target.tl_rect_area;
62+ if(a_rate<50 || 150<a_rate){
63+ continue;
64+ }
65+ //移動距離^2の二乗が対角線距離^2の4倍以上なら無視
66+ long sq_move=target.tl_center.sqDist(i_new_sq.center2d);
67+ if(sq_move*4/new_sq_dist>0){
68+ continue;
69+ }
70+ compareVertexSet(i_new_sq.ob_vertex,target.tl_vertex,ret);
71+ int sqdist=ret[1];
72+ int shift=ret[0];
73+ //頂点移動距離の合計が、(中心点移動距離+4)の10倍を超えてたらNG <-
74+ if(sqdist>(sq_move+4)*10){
75+ continue;
76+ }
77+ //登録可能か確認
78+ VertexSortTable.Item item=this._tracking_list.getInsertPoint(sqdist);
79+ if(item==null){
80+ continue;
81+ }
82+ //登録
83+ item=this._tracking_list.insertFromTailBefore(item);
84+ item.marker=target;
85+ item.shift=shift;
86+ item.sq_dist=sqdist;
87+ item.ref_sq=i_new_sq;
88+ is_dispatched=true;
89+ }
90+ return is_dispatched;
91+ }
92+
93+ /**
94+ * この関数は、頂点セット同士のシフト量を計算して、配列に値を返します。
95+ * 並びが同じである頂点セット同士の最低の移動量を計算して、その時のシフト量と二乗移動量の合計を返します。
96+ * @param i_square
97+ * 比較対象の矩形
98+ * @return
99+ * [0]にシフト量を返します。
100+ * [1]に頂点移動距離の合計の二乗値を返します。
101+ * シフト量はthis-i_squareです。1の場合、i_v1[0]とi_v2[1]が対応点になる(shift量1)であることを示します。
102+ */
103+ public static void compareVertexSet(NyARIntPoint2d[] i_v1,NyARIntPoint2d[] i_v2,int[] ret)
104+ {
105+ //3-0番目
106+ int min_dist=Integer.MAX_VALUE;
107+ int min_index=0;
108+ int xd,yd;
109+ for(int i=3;i>=0;i--){
110+ int d=0;
111+ for(int i2=3;i2>=0;i2--){
112+ xd= (int)(i_v1[i2].x-i_v2[(i2+i)%4].x);
113+ yd= (int)(i_v1[i2].y-i_v2[(i2+i)%4].y);
114+ d+=xd*xd+yd*yd;
115+ }
116+ if(min_dist>d){
117+ min_dist=d;
118+ min_index=i;
119+ }
120+ }
121+ ret[0]=min_index;
122+ ret[1]=min_dist;
123+ }
124+ /**
125+ * トラッキングリストへ追加。このadd以外使わないでね。
126+ */
127+ public boolean add(TMarkerData e)
128+ {
129+ //1マーカ辺りの最大候補数
130+ for(int i=0;i<2;i++){
131+ this._tracking_list.append();
132+ }
133+ return super.add(e);
134+ }
135+ public void finish()
136+ {
137+ //一致率の最も高いアイテムを得る。
138+ VertexSortTable.Item top_item=this._tracking_list.getTopItem();
139+ //アイテムを検出できなくなるまで、一致率が高い順にアイテムを得る。
140+ while(top_item!=null){
141+ //検出したアイテムのARmarkerIndexのデータをセット
142+ TMarkerData target=top_item.marker;
143+ //検出カウンタが1以上(未検出の場合のみ検出)
144+ if(target.lost_count>0){
145+ target.lost_count=0;
146+ target.life++;
147+ target.sq=top_item.ref_sq;
148+ target.sq.rotateVertexL(4-top_item.shift);
149+ NyARIntPoint2d.shiftCopy(top_item.ref_sq.ob_vertex,target.tl_vertex,4-top_item.shift);
150+ target.tl_center.setValue(top_item.ref_sq.center2d);
151+ target.tl_rect_area=top_item.ref_sq.rect_area;
152+ }
153+ //基準アイテムと重複するアイテムを削除する。
154+ this._tracking_list.disableMatchItem(top_item);
155+ top_item=this._tracking_list.getTopItem();
156+ }
157+ }
158+}
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/VertexSortTable.java
@@ -0,0 +1,111 @@
1+/*
2+ * PROJECT: NyARToolkit(Extension)
3+ * --------------------------------------------------------------------------------
4+ * The NyARToolkit is Java edition ARToolKit class library.
5+ * Copyright (C)2008-2009 Ryo Iizuka
6+ *
7+ * This program is free software: you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation, either version 3 of the License, or
10+ * (at your option) any later version.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ * For further information please contact.
21+ * http://nyatla.jp/nyatoolkit/
22+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
23+ *
24+ */
25+package jp.nyatla.nyartoolkit.markersystem.utils;
26+
27+import jp.nyatla.nyartoolkit.core.utils.NyARLinkList;
28+
29+
30+
31+public class VertexSortTable extends NyARLinkList<VertexSortTable.Item>
32+{
33+ public class Item extends NyARLinkList.Item
34+ {
35+ public int sq_dist;
36+ public TMarkerData marker;
37+ public int shift;
38+ public SquareStack.Item ref_sq;
39+ };
40+ public VertexSortTable(int iNumOfItem)
41+ {
42+ super(iNumOfItem);
43+ }
44+ final protected Item createElement()
45+ {
46+ return new Item();
47+ }
48+ public void reset()
49+ {
50+ Item ptr=this._head_item;
51+ for(int i=this._num_of_item-1;i>=0;i--)
52+ {
53+ ptr.sq_dist=Integer.MAX_VALUE;
54+ ptr=(Item) ptr.next;
55+ }
56+ }
57+ /**
58+ * 挿入ポイントを返す。挿入ポイントは、i_sd_point(距離点数)が
59+ * 登録済のポイントより小さい場合のみ返却する。
60+ * @return
61+ */
62+ public Item getInsertPoint(int i_sd_point)
63+ {
64+ Item ptr=_head_item;
65+ //先頭の場合
66+ if(ptr.sq_dist>i_sd_point){
67+ return ptr;
68+ }
69+ //それ以降
70+ ptr=(Item) ptr.next;
71+ for(int i=this._num_of_item-2;i>=0;i--)
72+ {
73+ if(ptr.sq_dist>i_sd_point){
74+ return ptr;
75+ }
76+ ptr=(Item) ptr.next;
77+ }
78+ //対象外。
79+ return null;
80+ }
81+ /**
82+ * 指定したターゲットと同じマーカと同じ矩形候補を参照している
83+ * @param i_topitem
84+ */
85+ public void disableMatchItem(Item i_topitem)
86+ {
87+ Item ptr=this._head_item;
88+ for(int i=this._num_of_item-1;i>=0;i--)
89+ {
90+ if(ptr.marker!=null){
91+ if(ptr.marker==i_topitem.marker || ptr.marker.sq==i_topitem.ref_sq){
92+ ptr.marker=null;
93+ }
94+ }
95+ ptr=(Item) ptr.next;
96+ }
97+ }
98+ public Item getTopItem()
99+ {
100+ Item ptr=this._head_item;
101+ for(int i=this._num_of_item-1;i>=0;i--)
102+ {
103+ if(ptr.marker==null){
104+ ptr=(Item) ptr.next;
105+ continue;
106+ }
107+ return ptr;
108+ }
109+ return null;
110+ }
111+}
\ No newline at end of file
--- /dev/null
+++ b/NyARToolKit for Android - Base/src/jp/nyatla/nyartoolkit/markersystem/utils/package-inf.java
@@ -0,0 +1,5 @@
1+/**
2+ * このパッケージは、jp.nyatla.nyartoolkit.nyarパッケージからのみ使用するユーティリティクラスを宣言する。
3+ * ユーザが使用することは想定していない。
4+ */
5+package jp.nyatla.nyartoolkit.markersystem.utils;