• R/O
  • SSH
  • HTTPS

nyartoolkit: Commit


Commit MetaInfo

Revision994 (tree)
Time2012-05-01 11:23:01
Authornyatla

Log Message

(empty log message)

Change Summary

Incremental Difference

--- NyARToolkit/trunk/utils/j2se/test/jp/nyatla/nyartoolkit/j2se/test/MarkerSystemTest.java (nonexistent)
+++ NyARToolkit/trunk/utils/j2se/test/jp/nyatla/nyartoolkit/j2se/test/MarkerSystemTest.java (revision 994)
@@ -0,0 +1,89 @@
1+/*
2+ * PROJECT: NyARToolkit JOGL sample program.
3+ * --------------------------------------------------------------------------------
4+ * The MIT License
5+ * Copyright (c) 2008 nyatla
6+ * airmail(at)ebony.plala.or.jp
7+ * http://nyatla.jp/nyartoolkit/
8+ *
9+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10+ * of this software and associated documentation files (the "Software"), to deal
11+ * in the Software without restriction, including without limitation the rights
12+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+ * copies of the Software, and to permit persons to whom the Software is
14+ * furnished to do so, subject to the following conditions:
15+ * The above copyright notice and this permission notice shall be included in
16+ * all copies or substantial portions of the Software.
17+ *
18+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+ * THE SOFTWARE.
25+ *
26+ */
27+package jp.nyatla.nyartoolkit.j2se.test;
28+
29+
30+import java.io.File;
31+import java.io.FileInputStream;
32+import java.util.Date;
33+
34+import javax.imageio.ImageIO;
35+
36+import jp.nyatla.nyartoolkit.core.NyARException;
37+import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;
38+import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;
39+import jp.nyatla.nyartoolkit.core.types.NyARBufferType;
40+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;
41+import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystem;
42+import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;
43+import jp.nyatla.nyartoolkit.markersystem.NyARSensor;
44+import jp.nyatla.nyartoolkit.utils.j2se.NyARBufferedImageRaster;
45+/**
46+ * JMFからの映像入力からマーカ1種を検出し、そこに立方体を重ねます。
47+ * ARマーカには、patt.hiroを使用して下さい。
48+ */
49+public class MarkerSystemTest
50+{
51+
52+ private final static String ARCODE_FILE = "../../Data/patt.hiro";
53+ private final static String raw_file = "../../Data/320x240ABGR.raw";
54+
55+ public static void main(String[] args)
56+ {
57+ try {
58+ NyARMarkerSystemConfig config = new NyARMarkerSystemConfig(320,240);
59+ NyARSensor s=new NyARSensor(new NyARIntSize(320,240));//create sensor system
60+ NyARMarkerSystem nyar=new NyARMarkerSystem(config); //create MarkerSystem
61+ int id=nyar.addARMarker(ARCODE_FILE,16,25,80);
62+ Date d2 = new Date();
63+ if(false){
64+ File f = new File(raw_file);
65+ FileInputStream fs = new FileInputStream(raw_file);
66+ byte[] buf = new byte[(int) f.length()];
67+ fs.read(buf);
68+ INyARRgbRaster ra = new NyARRgbRaster(320, 240,NyARBufferType.BYTE1D_B8G8R8X8_32,false);
69+ ra.wrapBuffer(buf);
70+ s.update(ra);
71+ }else{
72+ s.update(new NyARBufferedImageRaster(ImageIO.read(new File("../../Data/320x240ABGR.png"))));
73+ }
74+ for (int i = 0; i < 1000; i++) {
75+ // 変換行列を取得
76+ s.updateTimeStamp();
77+ nyar.update(s);
78+ }
79+ Date d = new Date();
80+ System.out.println("Time:"+(d.getTime()-d2.getTime()));
81+ if(nyar.isExistMarker(id)){
82+ System.out.println(nyar.getConfidence(id));
83+ }
84+ } catch (Exception e) {
85+ e.printStackTrace();
86+ }
87+ return;
88+ }
89+}
--- NyARToolkit/trunk/utils/jmf/test/jp/nyatla/nyartoolkit/jmf/utils/test/LabelingViewer.java (revision 993)
+++ NyARToolkit/trunk/utils/jmf/test/jp/nyatla/nyartoolkit/jmf/utils/test/LabelingViewer.java (revision 994)
@@ -44,6 +44,7 @@
4444 import jp.nyatla.nyartoolkit.core.param.NyARParam;
4545 import jp.nyatla.nyartoolkit.core.raster.*;
4646 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2gs.INyARRgb2GsFilter;
47+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector;
4748 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector_Rle;
4849 import jp.nyatla.nyartoolkit.core.types.*;
4950
@@ -53,13 +54,13 @@
5354 */
5455 public class LabelingViewer extends Frame implements JmfCaptureListener
5556 {
56- class SquareDetector extends NyARSquareContourDetector_Rle
57+ class SquareDetector extends NyARSquareContourDetector_Rle implements NyARSquareContourDetector.CbHandler
5758 {
5859 public SquareDetector(NyARIntSize i_size) throws NyARException
5960 {
6061 super(i_size);
6162 }
62- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
63+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
6364 {
6465
6566 }
@@ -132,7 +133,7 @@
132133 try{
133134 NyARIntRect rect=new NyARIntRect();
134135 // rect.x=0;rect.y=0;rect.w=220;rect.h=140;
135- this._detect.detectMarker(gs,110);
136+ this._detect.detectMarker(gs,110,this._detect);
136137 }catch(Exception e){
137138 e.printStackTrace();
138139 }
--- NyARToolkit/trunk/lib/test/jp/nyatla/nyartoolkit/test/NyIdTest.java (revision 993)
+++ NyARToolkit/trunk/lib/test/jp/nyatla/nyartoolkit/test/NyIdTest.java (revision 994)
@@ -33,7 +33,6 @@
3333 import java.io.*;
3434
3535
36-import jp.nyatla.nyartoolkit.core.NyARException;
3736 import jp.nyatla.nyartoolkit.core.param.NyARParam;
3837 import jp.nyatla.nyartoolkit.core.raster.rgb.*;
3938 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/processor/SingleARMarkerProcesser.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/processor/SingleARMarkerProcesser.java (revision 994)
@@ -65,7 +65,7 @@
6565 /**
6666 * detectMarkerのコールバック関数
6767 */
68- private class DetectSquare extends NyARSquareContourDetector_Rle
68+ private class DetectSquare extends NyARSquareContourDetector_Rle implements NyARSquareContourDetector.CbHandler
6969 {
7070 //公開プロパティ
7171 public final NyARSquare square=new NyARSquare();
@@ -117,7 +117,7 @@
117117 * 矩形が見付かるたびに呼び出されます。
118118 * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。
119119 */
120- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
120+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
121121 {
122122 if (this._match_patt==null) {
123123 return;
@@ -199,6 +199,7 @@
199199 }
200200 }
201201 }
202+
202203 }
203204 /** ユーザーが自由に使えるタグ変数です。*/
204205 public Object tag;
@@ -325,7 +326,7 @@
325326
326327 // スクエアコードを探す
327328 this._detectmarker.init(i_raster,this._current_arcode_index);
328- this._detectmarker.detectMarker(this._gs_raster,this._thdetect.getThreshold(this._hist));
329+ this._detectmarker.detectMarker(this._gs_raster,this._thdetect.getThreshold(this._hist),this._detectmarker);
329330
330331 // 認識状態を更新
331332 this.updateStatus(this._detectmarker.square,this._detectmarker.code_index);
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/processor/SingleNyIdMarkerProcesser.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/processor/SingleNyIdMarkerProcesser.java (revision 994)
@@ -65,7 +65,7 @@
6565 /**
6666 * Rle矩形Detectorのブリッジ
6767 */
68- private class RleDetector extends NyARSquareContourDetector_Rle
68+ private class RleDetector extends NyARSquareContourDetector_Rle implements NyARSquareContourDetector.CbHandler
6969 {
7070 //公開プロパティ
7171 public final NyARSquare square=new NyARSquare();
@@ -108,7 +108,7 @@
108108 * 矩形が見付かるたびに呼び出されます。
109109 * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。
110110 */
111- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
111+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
112112 {
113113 //既に発見済なら終了
114114 if(this.marker_data!=null){
@@ -279,7 +279,7 @@
279279
280280 // スクエアコードを探す(第二引数に指定したマーカ、もしくは新しいマーカを探す。)
281281 this._square_detect.init(this._gs_raster,this._is_active?this._data_current:null);
282- this._square_detect.detectMarker(this._gs_raster,this._current_threshold);
282+ this._square_detect.detectMarker(this._gs_raster,this._current_threshold,this._square_detect);
283283
284284 // 認識状態を更新(マーカを発見したなら、current_dataを渡すかんじ)
285285 final boolean is_id_found=updateStatus(this._square_detect.square,this._square_detect.marker_data);
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareContourDetector_Rle.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareContourDetector_Rle.java (revision 994)
@@ -41,7 +41,7 @@
4141 * 検出した矩形を、自己コールバック関数{@link #onSquareDetect}へ通知します。
4242 * 継承クラスで自己コールバック関数{@link #onSquareDetect}を実装する必要があります。
4343 */
44-public abstract class NyARSquareContourDetector_Rle extends NyARSquareContourDetector
44+public class NyARSquareContourDetector_Rle extends NyARSquareContourDetector
4545 {
4646 /** label_stackにソート後の結果を蓄積するクラス*/
4747 protected class Labeling extends NyARLabeling_Rle
@@ -90,6 +90,7 @@
9090 }
9191 this.label_stack.push(i_label);
9292 }
93+
9394 }
9495
9596 protected Labeling _labeling;
@@ -135,7 +136,7 @@
135136 * ラベルと判定する敷居値
136137 * @throws NyARException
137138 */
138- public void detectMarker(INyARGrayscaleRaster i_raster,NyARIntRect i_area,int i_th) throws NyARException
139+ public void detectMarker(INyARGrayscaleRaster i_raster,NyARIntRect i_area,int i_th,NyARSquareContourDetector.CbHandler i_cb) throws NyARException
139140 {
140141 assert(i_area.w*i_area.h>0);
141142
@@ -179,7 +180,7 @@
179180 continue;
180181 }
181182 //矩形を発見したことをコールバック関数で通知
182- this.onSquareDetect(coord,mkvertex);
183+ i_cb.detectMarkerCallback(coord,mkvertex);
183184
184185 // 検出済の矩形の属したラベルを重なりチェックに追加する。
185186 overlap.push(label_pt);
@@ -196,7 +197,7 @@
196197 * @param i_th
197198 * 画素の二値判定敷居値です。この値は、ラベリングと、輪郭線追跡時に使われます。
198199 */
199- public void detectMarker(INyARGrayscaleRaster i_raster,int i_th) throws NyARException
200+ public void detectMarker(INyARGrayscaleRaster i_raster,int i_th,NyARSquareContourDetector.CbHandler i_cb) throws NyARException
200201 {
201202 final NyARRleLabelFragmentInfoPtrStack flagment=this._labeling.label_stack;
202203 final NyARLabelOverlapChecker<NyARRleLabelFragmentInfo> overlap = this._overlap_checker;
@@ -239,7 +240,7 @@
239240 continue;
240241 }
241242 //矩形を発見したことをコールバック関数で通知
242- this.onSquareDetect(coord,mkvertex);
243+ i_cb.detectMarkerCallback(coord,mkvertex);
243244
244245 // 検出済の矩形の属したラベルを重なりチェックに追加する。
245246 overlap.push(label_pt);
@@ -247,7 +248,6 @@
247248 }
248249 return;
249250 }
250-
251251 }
252252
253253
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareContourDetector_ARToolKit.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareContourDetector_ARToolKit.java (revision 994)
@@ -36,7 +36,6 @@
3636 import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabel;
3737 import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabelStack;
3838 import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabeling_ARToolKit;
39-import jp.nyatla.nyartoolkit.core.raster.INyARRaster;
4039 import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;
4140 import jp.nyatla.nyartoolkit.core.types.NyARIntCoordinates;
4241 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;
@@ -84,6 +83,7 @@
8483 this._coord=new NyARIntCoordinates(number_of_coord);
8584 return;
8685 }
86+
8787 /**
8888 * この関数は、ラスタから矩形を検出して、自己コールバック関数{@link #onSquareDetect}で通知します。
8989 * 実装クラスでは、矩形検出処理をして、結果を通知する処理を実装してください。
@@ -91,7 +91,7 @@
9191 * 検出元のラスタ画像
9292 * @throws NyARException
9393 */
94- public final void detectMarker(NyARBinRaster i_raster) throws NyARException
94+ public final void detectMarker(NyARBinRaster i_raster,NyARSquareContourDetector.CbHandler i_cb) throws NyARException
9595 {
9696 final NyARLabelingImage limage = this._limage;
9797
@@ -153,15 +153,13 @@
153153 continue;
154154 }
155155 //矩形を発見したことをコールバック関数で通知
156- this.onSquareDetect(coord,mkvertex);
156+ i_cb.detectMarkerCallback(coord,mkvertex);
157157
158158 // 検出済の矩形の属したラベルを重なりチェックに追加する。
159159 overlap.push(label_pt);
160-
161160 }
162161 return;
163162 }
164-
165163 }
166164
167165
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareContourDetector.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareContourDetector.java (revision 994)
@@ -31,7 +31,6 @@
3131 package jp.nyatla.nyartoolkit.core.squaredetect;
3232
3333 import jp.nyatla.nyartoolkit.core.NyARException;
34-import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;
3534 import jp.nyatla.nyartoolkit.core.types.*;
3635
3736 /**
@@ -38,17 +37,23 @@
3837 * このクラスは、矩形検出器のベースクラスです。
3938 * 矩形検出機能を提供する関数を定義します。
4039 */
41-public abstract class NyARSquareContourDetector
40+public abstract class NyARSquareContourDetector
4241 {
4342 /**
44- * この関数は、自己コールバック関数です。{@link #detectMarker}が検出矩形を通知するために使います。
45- * 実装クラスでは、ここに矩形の発見時の処理を記述してください。
46- * @param i_coord
47- * 輪郭線オブジェクト
48- * @param i_vertex_index
49- * 矩形の4頂点に対応する、輪郭線オブジェクトのインデクス番号。
50- * @throws NyARException
43+ * {@link #NyARSquareContourDetector}クラスのコールバック関数のハンドラインタフェイス。
5144 */
52- protected abstract void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException;
45+ public interface CbHandler
46+ {
47+ /**
48+ * この関数は、自己コールバック関数です。{@link #detectMarker}が検出矩形を通知するために使います。
49+ * 実装クラスでは、ここに矩形の発見時の処理を記述してください。
50+ * @param i_coord
51+ * 輪郭線オブジェクト
52+ * @param i_vertex_index
53+ * 矩形の4頂点に対応する、輪郭線オブジェクトのインデクス番号。
54+ * @throws NyARException
55+ */
56+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException;
57+ }
5358 }
5459
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java (revision 994)
@@ -40,6 +40,7 @@
4040 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2gs.INyARRgb2GsFilterArtkTh;
4141 import jp.nyatla.nyartoolkit.core.squaredetect.NyARCoord2Linear;
4242 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;
43+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector;
4344 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector_Rle;
4445 import jp.nyatla.nyartoolkit.core.types.*;
4546 import jp.nyatla.nyartoolkit.core.types.stack.NyARObjectStack;
@@ -65,7 +66,7 @@
6566 public class NyARDetectMarker
6667 {
6768 /** 矩形検出器のブリッジ*/
68- private class RleDetector extends NyARSquareContourDetector_Rle
69+ private class RleDetector extends NyARSquareContourDetector_Rle implements NyARSquareContourDetector.CbHandler
6970 {
7071 //公開プロパティ
7172 public NyARDetectMarkerResultStack result_stack=new NyARDetectMarkerResultStack(NyARDetectMarker.AR_SQUARE_MAX);
@@ -103,7 +104,7 @@
103104 * 矩形が見付かるたびに呼び出されます。
104105 * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。
105106 */
106- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
107+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
107108 {
108109 NyARMatchPattResult mr=this.__detectMarkerLite_mr;
109110 //輪郭座標から頂点リストに変換
@@ -261,7 +262,7 @@
261262 this._tobin_filter.doFilter(i_threshold,this._bin_raster);
262263 //detect
263264 this._square_detect.init(i_raster);
264- this._square_detect.detectMarker(this._bin_raster,0);
265+ this._square_detect.detectMarker(this._bin_raster,0,this._square_detect);
265266
266267 //見付かった数を返す。
267268 return this._square_detect.result_stack.getLength();
--- NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/detector/NyARSingleDetectMarker.java (revision 993)
+++ NyARToolkit/trunk/lib/src/jp/nyatla/nyartoolkit/detector/NyARSingleDetectMarker.java (revision 994)
@@ -43,7 +43,6 @@
4343 import jp.nyatla.nyartoolkit.core.pickup.*;
4444 import jp.nyatla.nyartoolkit.core.types.*;
4545 import jp.nyatla.nyartoolkit.core.transmat.*;
46-import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker_ARTKv2.ARTKDetector;
4746
4847 /**
4948 * このクラスは、1個のマーカを取り扱うマーカ検出器を定義します。
@@ -306,7 +305,7 @@
306305 /**
307306 * ARTKラべリングを使った矩形検出機へのブリッジ
308307 */
309- public static class ARTKDetector extends NyARSquareContourDetector_ARToolKit
308+ public static class ARTKDetector extends NyARSquareContourDetector_ARToolKit implements NyARSquareContourDetector.CbHandler
310309 {
311310 private NyARSingleDetectMarker _parent;
312311 public ARTKDetector(NyARSingleDetectMarker i_parent,NyARIntSize i_size) throws NyARException
@@ -314,7 +313,7 @@
314313 super(i_size);
315314 this._parent=i_parent;
316315 }
317- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
316+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
318317 {
319318 this._parent.updateSquareInfo(i_coord, i_vertex_index);
320319 }
@@ -329,7 +328,7 @@
329328 protected void execDetectMarker() throws NyARException
330329 {
331330 //矩形を探す(戻り値はコールバック関数で受け取る。)
332- this._square_detect.detectMarker(this._bin_raster);
331+ this._square_detect.detectMarker(this._bin_raster,this._square_detect);
333332
334333 }
335334 }
@@ -346,7 +345,7 @@
346345 protected void execDetectMarker() throws NyARException
347346 {
348347 //矩形を探す(戻り値はコールバック関数で受け取る。)
349- this._square_detect.detectMarker(this._bin_raster);
348+ this._square_detect.detectMarker(this._bin_raster,this._square_detect);
350349 }
351350 }
352351 /**
@@ -360,7 +359,7 @@
360359 /**
361360 * RleLabelingを使った矩形検出機
362361 */
363- private class RleDetector extends NyARSquareContourDetector_Rle
362+ private class RleDetector extends NyARSquareContourDetector_Rle implements NyARSquareContourDetector.CbHandler
364363 {
365364 NyARSingleDetectMarker _parent;
366365 public RleDetector(NyARSingleDetectMarker i_parent,NyARIntSize i_size) throws NyARException
@@ -368,9 +367,11 @@
368367 super(i_size);
369368 this._parent=i_parent;
370369 }
371- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
370+
371+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
372372 {
373373 this._parent.updateSquareInfo(i_coord, i_vertex_index);
374+
374375 }
375376 }
376377
@@ -384,7 +385,7 @@
384385 protected void execDetectMarker() throws NyARException
385386 {
386387 //矩形を探す(戻り値はコールバック関数で受け取る。)
387- this._square_detect.detectMarker(this._bin_raster,0);
388+ this._square_detect.detectMarker(this._bin_raster,0,this._square_detect);
388389
389390 }
390391 }
--- NyARToolkit/trunk/lib/src.markersystem/jp/nyatla/nyartoolkit/markersystem/NyARMarkerSystem.java (revision 993)
+++ NyARToolkit/trunk/lib/src.markersystem/jp/nyatla/nyartoolkit/markersystem/NyARMarkerSystem.java (revision 994)
@@ -37,6 +37,7 @@
3737 import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;
3838 import jp.nyatla.nyartoolkit.core.rasterdriver.INyARPerspectiveCopy;
3939 import jp.nyatla.nyartoolkit.core.squaredetect.NyARCoord2Linear;
40+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector;
4041 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector_Rle;
4142 import jp.nyatla.nyartoolkit.core.transmat.INyARTransMat;
4243 import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;
@@ -74,12 +75,20 @@
7475 private static int IDTYPE_ARTK=0x00000000;
7576 private static int IDTYPE_NYID=0x00001000;
7677
77- private RleDetector _rledetect;
78+ protected INyARMarkerSystemSquareDetect _sqdetect;
7879 protected NyARParam _ref_param;
7980 protected NyARFrustum _frustum;
8081 private int _last_gs_th;
8182 private int _bin_threshold=THLESHOLD_AUTO;
83+ private TrackingList _tracking_list;
84+ private ARMarkerList _armk_list;
85+ private NyIdList _idmk_list;
86+ private int lost_th=5;
87+ private INyARTransMat _transmat;
88+ private final static int INITIAL_MARKER_STACK_SIZE=10;
89+ private SquareStack _sq_stack;
8290
91+
8392 /**
8493 * コンストラクタです。{@link INyARMarkerSystemConfig}を元に、インスタンスを生成します。
8594 * @param i_config
@@ -92,10 +101,18 @@
92101 this._frustum=new NyARFrustum();
93102 this.initInstance(i_config);
94103 this.setProjectionMatrixClipping(FRUSTUM_DEFAULT_NEAR_CLIP, FRUSTUM_DEFAULT_FAR_CLIP);
104+
105+ this._armk_list=new ARMarkerList();
106+ this._idmk_list=new NyIdList();
107+ this._tracking_list=new TrackingList();
108+ this._transmat=i_config.createTransmatAlgorism();
109+ //同時に判定待ちにできる矩形の数
110+ this._sq_stack=new SquareStack(INITIAL_MARKER_STACK_SIZE);
111+ this._on_sq_handler=new OnSquareDetect(i_config,this._armk_list,this._idmk_list,this._tracking_list,this._sq_stack);
95112 }
96113 protected void initInstance(INyARMarkerSystemConfig i_ref_config) throws NyARException
97114 {
98- this._rledetect=new RleDetector(i_ref_config);
115+ this._sqdetect=new SquareDetect(i_ref_config);
99116 this._hist_th=i_ref_config.createAutoThresholdArgorism();
100117 }
101118 /**
@@ -142,13 +159,13 @@
142159 public int addNyIdMarker(long i_id,double i_marker_size) throws NyARException
143160 {
144161 MarkerInfoNyId target=new MarkerInfoNyId(i_id,i_id,i_marker_size);
145- if(!this._rledetect._idmk_list.add(target)){
162+ if(!this._idmk_list.add(target)){
146163 throw new NyARException();
147164 }
148- if(!this._rledetect._tracking_list.add(target)){
165+ if(!this._tracking_list.add(target)){
149166 throw new NyARException();
150167 }
151- return (this._rledetect._idmk_list.size()-1)|IDTYPE_NYID;
168+ return (this._idmk_list.size()-1)|IDTYPE_NYID;
152169 }
153170 /**
154171 * この関数は、1個の範囲を持つidマーカをシステムに登録して、検出可能にします。
@@ -168,11 +185,11 @@
168185 public int addNyIdMarker(long i_id_s,long i_id_e,double i_marker_size) throws NyARException
169186 {
170187 MarkerInfoNyId target=new MarkerInfoNyId(i_id_s,i_id_e,i_marker_size);
171- if(!this._rledetect._idmk_list.add(target)){
188+ if(!this._idmk_list.add(target)){
172189 throw new NyARException();
173190 }
174- this._rledetect._tracking_list.add(target);
175- return (this._rledetect._idmk_list.size()-1)|IDTYPE_NYID;
191+ this._tracking_list.add(target);
192+ return (this._idmk_list.size()-1)|IDTYPE_NYID;
176193 }
177194 /**
178195 * この関数は、ARToolKitスタイルのマーカーを登録します。
@@ -189,11 +206,11 @@
189206 public int addARMarker(NyARCode i_code,int i_patt_edge_percentage,double i_marker_size) throws NyARException
190207 {
191208 MarkerInfoARMarker target=new MarkerInfoARMarker(i_code,i_patt_edge_percentage,i_marker_size);
192- if(!this._rledetect._armk_list.add(target)){
209+ if(!this._armk_list.add(target)){
193210 throw new NyARException();
194211 }
195- this._rledetect._tracking_list.add(target);
196- return (this._rledetect._armk_list.size()-1)| IDTYPE_ARTK;
212+ this._tracking_list.add(target);
213+ return (this._armk_list.size()-1)| IDTYPE_ARTK;
197214 }
198215 /**
199216 * この関数は、ARToolKitスタイルのマーカーをストリームから読みだして、登録します。
@@ -291,7 +308,7 @@
291308 {
292309 if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
293310 //ARマーカ
294- return this._rledetect._armk_list.get(i_id &MASK_IDNUM).cf;
311+ return this._armk_list.get(i_id &MASK_IDNUM).cf;
295312 }
296313 //Idマーカ?
297314 throw new NyARException();
@@ -309,7 +326,7 @@
309326 {
310327 if((i_id & MASK_IDTYPE)==IDTYPE_NYID){
311328 //Idマーカ
312- return this._rledetect._idmk_list.get(i_id &MASK_IDNUM).nyid;
329+ return this._idmk_list.get(i_id &MASK_IDNUM).nyid;
313330 }
314331 //ARマーカ?
315332 throw new NyARException();
@@ -336,10 +353,10 @@
336353 {
337354 if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
338355 //ARマーカ
339- return this._rledetect._armk_list.get(i_id & MASK_IDNUM).life;
356+ return this._armk_list.get(i_id & MASK_IDNUM).life;
340357 }else{
341358 //Idマーカ
342- return this._rledetect._idmk_list.get(i_id & MASK_IDNUM).life;
359+ return this._idmk_list.get(i_id & MASK_IDNUM).life;
343360 }
344361 }
345362 /**
@@ -354,10 +371,10 @@
354371 {
355372 if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
356373 //ARマーカ
357- return this._rledetect._armk_list.get(i_id & MASK_IDNUM).lost_count;
374+ return this._armk_list.get(i_id & MASK_IDNUM).lost_count;
358375 }else{
359376 //Idマーカ
360- return this._rledetect._idmk_list.get(i_id & MASK_IDNUM).lost_count;
377+ return this._idmk_list.get(i_id & MASK_IDNUM).lost_count;
361378 }
362379 }
363380 /**
@@ -498,10 +515,10 @@
498515 {
499516 if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
500517 //ARマーカ
501- return this._rledetect._armk_list.get(i_id &MASK_IDNUM).tmat;
518+ return this._armk_list.get(i_id &MASK_IDNUM).tmat;
502519 }else{
503520 //Idマーカ
504- return this._rledetect._idmk_list.get(i_id &MASK_IDNUM).tmat;
521+ return this._idmk_list.get(i_id &MASK_IDNUM).tmat;
505522 }
506523 }
507524 /**
@@ -515,10 +532,10 @@
515532 {
516533 if((i_id & MASK_IDTYPE)==IDTYPE_ARTK){
517534 //ARマーカ
518- return this._rledetect._armk_list.get(i_id &MASK_IDNUM).tl_vertex;
535+ return this._armk_list.get(i_id &MASK_IDNUM).tl_vertex;
519536 }else{
520537 //Idマーカ
521- return this._rledetect._idmk_list.get(i_id &MASK_IDNUM).tl_vertex;
538+ return this._idmk_list.get(i_id &MASK_IDNUM).tl_vertex;
522539 }
523540 }
524541 /**
@@ -538,7 +555,7 @@
538555 */
539556 public void setConfidenceThreshold(double i_val)
540557 {
541- this._rledetect._armk_list.setConficenceTh(i_val);
558+ this._armk_list.setConficenceTh(i_val);
542559 }
543560 /**
544561 * この関数は、消失時のディレイ値を指定します。
@@ -549,10 +566,11 @@
549566 */
550567 public void setLostDelay(int i_delay)
551568 {
552- this._rledetect.lost_th=i_delay;
569+ this.lost_th=i_delay;
553570 }
554571 private long _time_stamp=-1;
555- private INyARHistogramAnalyzer_Threshold _hist_th;
572+ protected INyARHistogramAnalyzer_Threshold _hist_th;
573+ private OnSquareDetect _on_sq_handler;
556574 /**
557575 * この関数は、入力したセンサ入力値から、インスタンスの状態を更新します。
558576 * 関数は、センサオブジェクトから画像を取得して、マーカ検出、一致判定、トラッキング処理を実行します。
@@ -568,9 +586,44 @@
568586 return;
569587 }
570588 int th=this._bin_threshold==THLESHOLD_AUTO?this._hist_th.getThreshold(i_sensor.getGsHistogram()):this._bin_threshold;
589+ this._sq_stack.clear();//矩形情報の保持スタック初期化
590+ //解析
591+ this._tracking_list.prepare();
592+ this._idmk_list.prepare();
593+ this._armk_list.prepare();
594+ //検出処理
595+ this._on_sq_handler._ref_input_rfb=i_sensor.getPerspectiveCopy();
596+ this._on_sq_handler._ref_input_gs=i_sensor.getGsImage();
597+ //検出
598+ this._sqdetect.detectMarkerCb(i_sensor,th,this._on_sq_handler);
571599
572- //解析器にかけてマーカを抽出。
573- this._rledetect.detectMarker(i_sensor, time_stamp, th);
600+ //検出結果の反映処理
601+ this._tracking_list.finish();
602+ this._armk_list.finish();
603+ this._idmk_list.finish();
604+ //期限切れチェック
605+ for(int i=this._tracking_list.size()-1;i>=0;i--){
606+ TMarkerData item=this._tracking_list.get(i);
607+ if(item.lost_count>this.lost_th){
608+ item.life=0;//活性off
609+ }
610+ }
611+ //各ターゲットの更新
612+ for(int i=this._armk_list.size()-1;i>=0;i--){
613+ MarkerInfoARMarker target=this._armk_list.get(i);
614+ if(target.lost_count==0){
615+ target.time_stamp=time_stamp;
616+ this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
617+ }
618+ }
619+ for(int i=this._idmk_list.size()-1;i>=0;i--){
620+ MarkerInfoNyId target=this._idmk_list.get(i);
621+ if(target.lost_count==0){
622+ target.time_stamp=time_stamp;
623+ this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
624+ }
625+ }
626+ //解析/
574627 //タイムスタンプを更新
575628 this._time_stamp=time_stamp;
576629 this._last_gs_th=th;
@@ -578,46 +631,33 @@
578631
579632 }
580633
581-
582-
583-
584-
585-
586-
587-
588-
589634 /**
590- * {@link NyARMarkerSystem}が使う矩形検出器です。
635+ * コールバック関数の隠蔽用クラス。
636+ * このクラスは、{@link NyARMarkerSystem}からプライベートに使います。
591637 */
592-class RleDetector extends NyARSquareContourDetector_Rle
638+class OnSquareDetect implements NyARSquareContourDetector.CbHandler
593639 {
594- private final static int INITIAL_MARKER_STACK_SIZE=10;
640+ private TrackingList _ref_tracking_list;
641+ private ARMarkerList _ref_armk_list;
642+ private NyIdList _ref_idmk_list;
643+ private SquareStack _ref_sq_stack;
644+ public INyARPerspectiveCopy _ref_input_rfb;
645+ public INyARGrayscaleRaster _ref_input_gs;
646+
595647 private NyARCoord2Linear _coordline;
596-
597- private SquareStack _sq_stack;
598- public int lost_th=5;
599- public TrackingList _tracking_list;
600- public ARMarkerList _armk_list;
601- public NyIdList _idmk_list;
602- public INyARTransMat _transmat;
603- private INyARPerspectiveCopy _ref_input_rfb;
604- private INyARGrayscaleRaster _ref_input_gs;
605- public RleDetector(INyARMarkerSystemConfig i_config) throws NyARException
648+ public OnSquareDetect(INyARMarkerSystemConfig i_config,ARMarkerList i_armk_list,NyIdList i_idmk_list,TrackingList i_tracking_list,SquareStack i_ref_sq_stack)
606649 {
607- super( i_config.getNyARParam().getScreenSize());
608650 this._coordline=new NyARCoord2Linear(i_config.getNyARParam().getScreenSize(),i_config.getNyARParam().getDistortionFactor());
609- this._armk_list=new ARMarkerList();
610- this._idmk_list=new NyIdList();
611- this._tracking_list=new TrackingList();
612- this._transmat=i_config.createTransmatAlgorism();
651+ this._ref_armk_list=i_armk_list;
652+ this._ref_idmk_list=i_idmk_list;
653+ this._ref_tracking_list=i_tracking_list;
613654 //同時に判定待ちにできる矩形の数
614- this._sq_stack=new SquareStack(INITIAL_MARKER_STACK_SIZE);
655+ this._ref_sq_stack=i_ref_sq_stack;
615656 }
616-
617- protected void onSquareDetect(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
657+ public void detectMarkerCallback(NyARIntCoordinates i_coord,int[] i_vertex_index) throws NyARException
618658 {
619659 //とりあえずSquareスタックを予約
620- SquareStack.Item sq_tmp=this._sq_stack.prePush();
660+ SquareStack.Item sq_tmp=this._ref_sq_stack.prePush();
621661 //観測座標点の記録
622662 for(int i2=0;i2<4;i2++){
623663 sq_tmp.ob_vertex[i2].setValue(i_coord.items[i_vertex_index[i2]]);
@@ -632,7 +672,7 @@
632672 boolean is_target_marker=false;
633673 for(;;){
634674 //トラッキング対象か確認する。
635- if(this._tracking_list.update(sq_tmp)){
675+ if(this._ref_tracking_list.update(sq_tmp)){
636676 //トラッキング対象ならブレーク
637677 is_target_marker=true;
638678 break;
@@ -640,15 +680,15 @@
640680 //@todo 複数マーカ時に、トラッキング済のarmarkerを探索対象外に出来ない?
641681
642682 //nyIdマーカの特定(IDマーカの特定はここで完結する。)
643- if(this._idmk_list.size()>0){
644- if(this._idmk_list.update(this._ref_input_gs,sq_tmp)){
683+ if(this._ref_idmk_list.size()>0){
684+ if(this._ref_idmk_list.update(this._ref_input_gs,sq_tmp)){
645685 is_target_marker=true;
646686 break;//idマーカを特定
647687 }
648688 }
649689 //ARマーカの特定
650- if(this._armk_list.size()>0){
651- if(this._armk_list.update(this._ref_input_rfb,sq_tmp)){
690+ if(this._ref_armk_list.size()>0){
691+ if(this._ref_armk_list.update(this._ref_input_rfb,sq_tmp)){
652692 is_target_marker=true;
653693 break;
654694 }
@@ -669,48 +709,25 @@
669709 }
670710 }else{
671711 //この矩形は検出対象にマークされなかったので、解除
672- this._sq_stack.pop();
712+ this._ref_sq_stack.pop();
673713 }
674714 }
675-
676- public void detectMarker(NyARSensor i_sensor,long i_time_stamp,int i_th) throws NyARException
715+}
716+
717+
718+
719+
720+class SquareDetect implements INyARMarkerSystemSquareDetect
721+{
722+ private NyARSquareContourDetector_Rle _sd;
723+ public SquareDetect(INyARMarkerSystemConfig i_config) throws NyARException
677724 {
678- this._sq_stack.clear();//矩形情報の保持スタック初期化
679- this._tracking_list.prepare();
680- this._idmk_list.prepare();
681- this._armk_list.prepare();
682- //検出処理
683- this._ref_input_rfb=i_sensor.getPerspectiveCopy();
684- this._ref_input_gs=i_sensor.getGsImage();
685- super.detectMarker(this._ref_input_gs,i_th);
686-
687- //検出結果の反映処理
688- this._tracking_list.finish();
689- this._armk_list.finish();
690- this._idmk_list.finish();
691- //期限切れチェック
692- for(int i=this._tracking_list.size()-1;i>=0;i--){
693- TMarkerData item=this._tracking_list.get(i);
694- if(item.lost_count>this.lost_th){
695- item.life=0;//活性off
696- }
697- }
698- //各ターゲットの更新
699- for(int i=this._armk_list.size()-1;i>=0;i--){
700- MarkerInfoARMarker target=this._armk_list.get(i);
701- if(target.lost_count==0){
702- target.time_stamp=i_time_stamp;
703- this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
704- }
705- }
706- for(int i=this._idmk_list.size()-1;i>=0;i--){
707- MarkerInfoNyId target=this._idmk_list.get(i);
708- if(target.lost_count==0){
709- target.time_stamp=i_time_stamp;
710- this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
711- }
712- }
725+ this._sd=new NyARSquareContourDetector_Rle(i_config.getScreenSize());
713726 }
727+ public void detectMarkerCb(NyARSensor i_sensor,int i_th,NyARSquareContourDetector.CbHandler i_handler) throws NyARException
728+ {
729+ this._sd.detectMarker(i_sensor.getGsImage(), i_th,i_handler);
730+ }
714731 }
715732
716733
@@ -723,3 +740,9 @@
723740
724741
725742
743+
744+
745+
746+
747+
748+
--- NyARToolkit/trunk/lib/src.markersystem/jp/nyatla/nyartoolkit/markersystem/NyARSensor.java (revision 993)
+++ NyARToolkit/trunk/lib/src.markersystem/jp/nyatla/nyartoolkit/markersystem/NyARSensor.java (revision 994)
@@ -45,11 +45,11 @@
4545 public class NyARSensor
4646 {
4747 protected NyARHistogram _gs_hist;
48- private INyARRgbRaster _ref_raster;
48+ protected INyARRgbRaster _ref_raster;
4949 protected INyARGrayscaleRaster _gs_raster;
50- private long _src_ts;
51- private long _gs_id_ts;
52- private long _gs_hist_ts;
50+ protected long _src_ts;
51+ protected long _gs_id_ts;
52+ protected long _gs_hist_ts;
5353 /**
5454 * 画像サイズ(スクリーンサイズ)を指定して、インスタンスを生成します。
5555 * @param i_size
--- NyARToolkit/trunk/lib/src.markersystem/jp/nyatla/nyartoolkit/markersystem/INyARMarkerSystemSquareDetect.java (nonexistent)
+++ NyARToolkit/trunk/lib/src.markersystem/jp/nyatla/nyartoolkit/markersystem/INyARMarkerSystemSquareDetect.java (revision 994)
@@ -0,0 +1,9 @@
1+package jp.nyatla.nyartoolkit.markersystem;
2+
3+import jp.nyatla.nyartoolkit.core.NyARException;
4+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector;
5+
6+public interface INyARMarkerSystemSquareDetect {
7+ public void detectMarkerCb(NyARSensor i_sensor,int i_th,NyARSquareContourDetector.CbHandler i_handler) throws NyARException;
8+
9+}
Show on old repository browser