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
20 public class ARTKMarkerTable
\r
23 * 結果型です。{@link ARTKMarkerTable#getBestMatchTarget}関数の戻り値を格納します。
\r
25 * 入れ子クラスの作れない処理系では、ARTKMarkerTable_GetBestMatchTargetResultとして宣言してください。
\r
28 public static class GetBestMatchTargetResult
\r
32 /** ユーザ定義の名前文字列です。*/
\r
34 /** マーカ幅です。単位は、mm単位です。*/
\r
35 public double marker_width;
\r
36 /** マーカ高さです。単位は、mm単位です。*/
\r
37 public double marker_height;
\r
38 /** ARToolKit準拠のマーカの方位値です。0<=n<=3の値が入ります。*/
\r
39 public int artk_direction;
\r
40 /** パターンの一致率です。0<<n<=1.0の数値が入ります。*/
\r
41 public double confidence;
\r
44 * データを格納するリストクラスを定義します。
\r
46 private class MarkerTable extends NyARObjectStack<MarkerTable.SerialTableRow>
\r
48 public class SerialTableRow
\r
52 public NyARCode code;
\r
53 public double marker_width;
\r
54 public double marker_height;
\r
55 public final void setValue(NyARCode i_code,int i_idtag,String i_name,double i_width,double i_height)
\r
58 this.marker_height=i_height;
\r
59 this.marker_width=i_width;
\r
64 public MarkerTable(int i_length) throws NyARException
\r
66 super.initInstance(i_length,SerialTableRow.class);
\r
68 protected SerialTableRow createElement()
\r
70 return new SerialTableRow();
\r
73 private int _resolution_width;
\r
74 private int _resolution_height;
\r
75 private int _edge_x;
\r
76 private int _edge_y;
\r
77 private int _sample_per_pix;
\r
78 private NyARRgbRaster _tmp_raster;
\r
79 private NyARMatchPatt_Color_WITHOUT_PCA _match_patt;
\r
80 private NyARMatchPattDeviationColorData _deviation_data;
\r
81 private MarkerTable _table;
\r
84 private NyARMatchPattResult __tmp_patt_result=new NyARMatchPattResult();
\r
88 * コンストラクタです。引数にあるパラメータで、空のテーブルを作ります。
\r
91 * @param i_resolution_x
\r
93 * ARToolKit互換の標準値は16です。
\r
94 * @param i_resolution_y
\r
96 * ARToolKit互換の標準値は16です。
\r
98 * エッジ部分の割合です。0<n<100の数値を指定します。
\r
99 * ARToolKit互換の標準値は25です。
\r
101 * エッジ部分の割合です。0<n<100の数値を指定します。
\r
102 * ARToolKit互換の標準値は25です。
\r
103 * @param i_sample_per_pix
\r
104 * 元画像からパターンを取得する時の、1ピクセル当たりのサンプリング数です。
\r
105 * 1なら1Pixel=1,2なら1Pixel=4ピクセルの画素を、元画像からサンプリングをします。
\r
106 * ARToolKit互換の標準値は4です。
\r
107 * 高解像度(64以上)のパターンを用いるときは、サンプリング数を低く設定してください。
\r
108 * @throws NyARException
\r
110 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
112 this._resolution_width=i_resolution_x;
\r
113 this._resolution_height=i_resolution_y;
\r
114 this._edge_x=i_edge_x;
\r
115 this._edge_y=i_edge_y;
\r
116 this._sample_per_pix=i_sample_per_pix;
\r
117 this._tmp_raster=new NyARRgbRaster(i_resolution_x,i_resolution_y,NyARBufferType.INT1D_X8R8G8B8_32);
\r
118 this._table=new MarkerTable(i_max);
\r
119 this._deviation_data=new NyARMatchPattDeviationColorData(i_resolution_x,i_resolution_y);
\r
120 this._match_patt=new NyARMatchPatt_Color_WITHOUT_PCA(i_resolution_x,i_resolution_y);
\r
123 * テーブル操作関数です。{@link NyARCode}を元にして、テーブルにマーカパターンを追加します。
\r
125 * ARToolKit形式のパターンコードを格納したオブジェクト。このオブジェクトは、関数成功後はインスタンスが所有します。
\r
126 * パターンコードの解像度は、コンストラクタに指定した高さと幅である必要があります。
\r
128 * このマーカを識別する、ユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。
\r
130 * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。
\r
132 * 実際のマーカの高さです。[通常mm単位]
\r
134 * 実際のマーカの幅です。[通常mm単位]
\r
136 * 登録に成功すると、trueを返します。
\r
138 public boolean addMarker(NyARCode i_code,int i_id,String i_name,double i_width,double i_height)
\r
140 assert(i_code.getHeight()== this._resolution_height && i_code.getHeight()== this._resolution_width);
\r
141 MarkerTable.SerialTableRow d=this._table.prePush();
\r
145 d.setValue(i_code,i_id,i_name,i_width,i_height);
\r
149 * テーブル操作関数です。{@link NyARRgbRaster}クラスのオブジェクトからマーカパターンを生成して、テーブルへ追加します。方位は、上方向がdirection=0になります。
\r
151 * マーカパターンの元となるラスタを指定します。解像度は、コンストラクタで指定したものと同じでなければなりません。
\r
153 * このマーカを識別するユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。
\r
155 * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。
\r
157 * 実際のマーカの高さです。[通常mm単位]
\r
159 * 実際のマーカの幅です。[通常mm単位]
\r
161 * 登録に成功すると、trueを返します。
\r
162 * @throws NyARException
\r
164 public boolean addMarker(NyARRgbRaster i_raster,int i_id,String i_name,double i_width,double i_height) throws NyARException
\r
166 MarkerTable.SerialTableRow d=this._table.prePush();
\r
170 NyARCode c=new NyARCode(this._resolution_width,this._resolution_height);
\r
171 c.setRaster(i_raster);
\r
172 d.setValue(c,i_id,i_name,i_width,i_height);
\r
176 * テーブル操作関数です。ARToolkit準拠のパターンファイルを読み込み、テーブルへ追加します。
\r
177 * @param i_filename
\r
178 * パターンファイルのファイルパスを指定します。
\r
180 * このマーカを識別するユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。
\r
182 * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。
\r
184 * 実際のマーカの高さです。[通常mm単位]
\r
186 * 実際のマーカの幅です。[通常mm単位]
\r
188 * 登録に成功すると、trueを返します。
\r
189 * @throws NyARException
\r
191 public boolean addMarkerFromARPattFile(String i_filename,int i_id,String i_name,double i_width,double i_height) throws NyARException
\r
193 MarkerTable.SerialTableRow d=this._table.prePush();
\r
197 NyARCode c=new NyARCode(this._resolution_width,this._resolution_height);
\r
198 c.loadARPattFromFile(i_filename);
\r
199 d.setValue(c,i_id,i_name,i_width,i_height);
\r
205 * {@link NyARRealityTarget}を元に{@link NyARRealitySource}からパターンのサンプリングを行い、最も一致するマーカパターンをテーブルから検索します。
\r
206 * 検索キーとなる{@link NyARRealityTarget}は、{@link NyARReality}派生クラスから取得した物を指定します。
\r
208 * 検索キーとなる、Unknownステータスの{@link NyARRealityTarget}クラスのオブジェクトを指定します。
\r
210 * i_targetを検出した{@link NyARRealitySource}のインスタンスを指定します。関数は、このソースからパターン取得を行います。
\r
212 * 返却値を格納するインスタンスを設定します。
\r
214 * パターンのサンプリングに成功すると、trueを返します。
\r
215 * 返却値がtrueの場合のみ、内容が更新されています。
\r
216 * @throws NyARException
\r
218 public boolean getBestMatchTarget(NyARRealityTarget i_target,NyARRealitySource i_rtsorce,GetBestMatchTargetResult o_result) throws NyARException
\r
221 NyARMatchPattResult tmp_patt_result=this.__tmp_patt_result;
\r
222 NyARPerspectiveRasterReader r=i_rtsorce.refPerspectiveRasterReader();
\r
223 r.read4Point(i_rtsorce.refRgbSource(),i_target.refTargetVertex(),this._edge_x,this._edge_y,this._sample_per_pix,this._tmp_raster);
\r
225 this._deviation_data.setRaster(this._tmp_raster);
\r
228 double cf=Double.MIN_VALUE;
\r
229 for(int i=this._table.getLength()-1;i>=0;i--){
\r
230 this._match_patt.setARCode(this._table.getItem(i).code);
\r
231 this._match_patt.evaluate(this._deviation_data, tmp_patt_result);
\r
232 if(cf<tmp_patt_result.confidence){
\r
234 cf=tmp_patt_result.confidence;
\r
235 dir=tmp_patt_result.direction;
\r
242 MarkerTable.SerialTableRow row=this._table.getItem(ret);
\r
243 o_result.artk_direction=dir;
\r
244 o_result.confidence=cf;
\r
245 o_result.idtag=row.idtag;
\r
246 o_result.marker_height=row.marker_height;
\r
247 o_result.marker_width=row.marker_width;
\r
248 o_result.name=row.name;
\r