1 package jp.nyatla.nyartoolkit.rpf.mklib;
\r
3 import jp.nyatla.nyartoolkit.NyARException;
\r
4 import jp.nyatla.nyartoolkit.core.NyARCode;
\r
5 import jp.nyatla.nyartoolkit.core.match.*;
\r
6 import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;
\r
7 import jp.nyatla.nyartoolkit.core.rasterreader.NyARPerspectiveRasterReader;
\r
8 import jp.nyatla.nyartoolkit.core.types.NyARBufferType;
\r
9 import jp.nyatla.nyartoolkit.core.types.stack.NyARObjectStack;
\r
10 import jp.nyatla.nyartoolkit.rpf.reality.nyartk.*;
\r
11 import jp.nyatla.nyartoolkit.rpf.realitysource.nyartk.*;
\r
14 * このクラスは、ARToolKitマーカパターンのテーブルです。
\r
15 * マーカパターンをID番号やメタデータに変換する事に役立ちます。
\r
16 * テーブルには、ARToolKitフォーマットのマーカパターンと、ID番号、ユーザ定義のデータのセットを格納します。
\r
17 * このクラスは、テーブルの操作機能と、テーブル要素の検索機能を提供します。
\r
19 public class ARTKMarkerTable
\r
22 * 結果型です。{@link ARTKMarkerTable#getBestMatchTarget}関数の戻り値を格納します。
\r
24 * 入れ子クラスの作れない処理系では、ARTKMarkerTable_GetBestMatchTargetResultとして宣言してください。
\r
27 public static class GetBestMatchTargetResult
\r
29 /** 登録時に設定したID値です。*/
\r
31 /** 登録時に設定した名前文字列です。*/
\r
33 /** 登録時に設定したマーカ幅です。単位は、mm単位です。*/
\r
34 public double marker_width;
\r
35 /** 登録時に設定したマーカ高さです。単位は、mm単位です。*/
\r
36 public double marker_height;
\r
37 /** ARToolKit準拠の、マーカの方位値です。0<=n<=3の値が入ります。*/
\r
38 public int artk_direction;
\r
39 /** パターンの一致率です。0<<n<=1.0の数値が入ります。*/
\r
40 public double confidence;
\r
43 * データを格納するリストクラスを定義します。
\r
45 private class MarkerTable extends NyARObjectStack<MarkerTable.SerialTableRow>
\r
47 public class SerialTableRow
\r
51 public NyARCode code;
\r
52 public double marker_width;
\r
53 public double marker_height;
\r
54 public final void setValue(NyARCode i_code,int i_idtag,String i_name,double i_width,double i_height)
\r
57 this.marker_height=i_height;
\r
58 this.marker_width=i_width;
\r
63 public MarkerTable(int i_length) throws NyARException
\r
65 super.initInstance(i_length,SerialTableRow.class);
\r
67 protected SerialTableRow createElement()
\r
69 return new SerialTableRow();
\r
72 private int _resolution_width;
\r
73 private int _resolution_height;
\r
74 private int _edge_x;
\r
75 private int _edge_y;
\r
76 private int _sample_per_pix;
\r
77 private NyARRgbRaster _tmp_raster;
\r
78 private NyARMatchPatt_Color_WITHOUT_PCA _match_patt;
\r
79 private NyARMatchPattDeviationColorData _deviation_data;
\r
80 private MarkerTable _table;
\r
83 private NyARMatchPattResult __tmp_patt_result=new NyARMatchPattResult();
\r
87 * コンストラクタです。引数にあるパラメータで、空のテーブルを作ります。
\r
90 * @param i_resolution_x
\r
92 * ARToolKit互換の標準値は16です。
\r
93 * @param i_resolution_y
\r
95 * ARToolKit互換の標準値は16です。
\r
97 * エッジ部分の割合です。0<n<100の数値を指定します。
\r
98 * ARToolKit互換の標準値は25です。
\r
100 * エッジ部分の割合です。0<n<100の数値を指定します。
\r
101 * ARToolKit互換の標準値は25です。
\r
102 * @param i_sample_per_pix
\r
103 * 元画像からパターンを取得する時の、1ピクセル当たりのサンプリング数です。
\r
104 * 1なら1Pixel=1,2なら1Pixel=4ピクセルの画素を、元画像からサンプリングをします。
\r
105 * ARToolKit互換の標準値は4です。
\r
106 * 高解像度(64以上)のパターンを用いるときは、サンプリング数を低く設定してください。
\r
107 * @throws NyARException
\r
109 public ARTKMarkerTable(int i_max,int i_resolution_x,int i_resolution_y,int i_edge_x,int i_edge_y,int i_sample_per_pix) throws NyARException
\r
111 this._resolution_width=i_resolution_x;
\r
112 this._resolution_height=i_resolution_y;
\r
113 this._edge_x=i_edge_x;
\r
114 this._edge_y=i_edge_y;
\r
115 this._sample_per_pix=i_sample_per_pix;
\r
116 this._tmp_raster=new NyARRgbRaster(i_resolution_x,i_resolution_y,NyARBufferType.INT1D_X8R8G8B8_32);
\r
117 this._table=new MarkerTable(i_max);
\r
118 this._deviation_data=new NyARMatchPattDeviationColorData(i_resolution_x,i_resolution_y);
\r
119 this._match_patt=new NyARMatchPatt_Color_WITHOUT_PCA(i_resolution_x,i_resolution_y);
\r
122 * テーブル操作関数です。{@link NyARCode}を元にして、テーブルにマーカパターンを追加します。
\r
124 * ARToolKit形式のパターンコードを格納したオブジェクト。このオブジェクトは、関数成功後はインスタンスが所有します。
\r
125 * パターンコードの解像度は、コンストラクタに指定した高さと幅である必要があります。
\r
127 * このマーカを識別する、ユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。
\r
129 * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。
\r
131 * 実際のマーカの高さです。[通常mm単位]
\r
133 * 実際のマーカの幅です。[通常mm単位]
\r
135 * 登録に成功すると、trueを返します。
\r
137 public boolean addMarker(NyARCode i_code,int i_id,String i_name,double i_width,double i_height)
\r
139 assert(i_code.getHeight()== this._resolution_height && i_code.getHeight()== this._resolution_width);
\r
140 MarkerTable.SerialTableRow d=this._table.prePush();
\r
144 d.setValue(i_code,i_id,i_name,i_width,i_height);
\r
148 * テーブル操作関数です。{@link NyARRgbRaster}クラスのオブジェクトからマーカパターンを生成して、テーブルへ追加します。方位は、上方向がdirection=0になります。
\r
150 * マーカパターンの元となるラスタを指定します。解像度は、コンストラクタで指定したものと同じでなければなりません。
\r
152 * このマーカを識別するユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。
\r
154 * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。
\r
156 * 実際のマーカの高さです。[通常mm単位]
\r
158 * 実際のマーカの幅です。[通常mm単位]
\r
160 * 登録に成功すると、trueを返します。
\r
161 * @throws NyARException
\r
163 public boolean addMarker(NyARRgbRaster i_raster,int i_id,String i_name,double i_width,double i_height) throws NyARException
\r
165 MarkerTable.SerialTableRow d=this._table.prePush();
\r
169 NyARCode c=new NyARCode(this._resolution_width,this._resolution_height);
\r
170 c.setRaster(i_raster);
\r
171 d.setValue(c,i_id,i_name,i_width,i_height);
\r
175 * テーブル操作関数です。ARToolkit準拠のパターンファイルを読み込み、テーブルへ追加します。
\r
176 * @param i_filename
\r
177 * パターンファイルのファイルパスを指定します。
\r
179 * このマーカを識別するユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。
\r
181 * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。
\r
183 * 実際のマーカの高さです。[通常mm単位]
\r
185 * 実際のマーカの幅です。[通常mm単位]
\r
187 * 登録に成功すると、trueを返します。
\r
188 * @throws NyARException
\r
190 public boolean addMarkerFromARPattFile(String i_filename,int i_id,String i_name,double i_width,double i_height) throws NyARException
\r
192 MarkerTable.SerialTableRow d=this._table.prePush();
\r
196 NyARCode c=new NyARCode(this._resolution_width,this._resolution_height);
\r
197 c.loadARPattFromFile(i_filename);
\r
198 d.setValue(c,i_id,i_name,i_width,i_height);
\r
204 * {@link NyARRealityTarget}を元に{@link NyARRealitySource}からパターンのサンプリングを行い、最も一致するマーカパターンをテーブルから検索します。
\r
205 * 検索キーとなる{@link NyARRealityTarget}は、{@link NyARReality}派生クラスから取得した物を指定します。
\r
207 * 検索キーとなる、Unknownステータスの{@link NyARRealityTarget}クラスのオブジェクトを指定します。
\r
209 * i_targetを検出した{@link NyARRealitySource}のインスタンスを指定します。関数は、このソースからパターン取得を行います。
\r
211 * 返却値を格納するインスタンスを設定します。
\r
213 * パターンのサンプリングに成功すると、trueを返します。
\r
214 * 返却値がtrueの場合のみ、内容が更新されています。
\r
215 * @throws NyARException
\r
217 public boolean getBestMatchTarget(NyARRealityTarget i_target,NyARRealitySource i_rtsorce,GetBestMatchTargetResult o_result) throws NyARException
\r
220 NyARMatchPattResult tmp_patt_result=this.__tmp_patt_result;
\r
221 NyARPerspectiveRasterReader r=i_rtsorce.refPerspectiveRasterReader();
\r
222 r.read4Point(i_rtsorce.refRgbSource(),i_target.refTargetVertex(),this._edge_x,this._edge_y,this._sample_per_pix,this._tmp_raster);
\r
224 this._deviation_data.setRaster(this._tmp_raster);
\r
227 double cf=Double.MIN_VALUE;
\r
228 for(int i=this._table.getLength()-1;i>=0;i--){
\r
229 this._match_patt.setARCode(this._table.getItem(i).code);
\r
230 this._match_patt.evaluate(this._deviation_data, tmp_patt_result);
\r
231 if(cf<tmp_patt_result.confidence){
\r
233 cf=tmp_patt_result.confidence;
\r
234 dir=tmp_patt_result.direction;
\r
241 MarkerTable.SerialTableRow row=this._table.getItem(ret);
\r
242 o_result.artk_direction=dir;
\r
243 o_result.confidence=cf;
\r
244 o_result.idtag=row.idtag;
\r
245 o_result.marker_height=row.marker_height;
\r
246 o_result.marker_width=row.marker_width;
\r
247 o_result.name=row.name;
\r