OSDN Git Service

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit/trunk@808 7cac0...
[nyartoolkit-and/nyartoolkit-and.git] / lib / src.rpf / jp / nyatla / nyartoolkit / rpf / mklib / ARTKMarkerTable.java
1 package jp.nyatla.nyartoolkit.rpf.mklib;\r
2 \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
12 \r
13 /**\r
14  * このクラスは、ARToolKitマーカパターンのテーブルです。\r
15  * マーカパターンにID番号とメタデータを関連付けたテーブルを持ち、パターンの一致検索機能を提供します。\r
16  * テーブルには、ARToolKitフォーマットのマーカパターンと、ID番号、ユーザ定義のデータのセットを格納します。\r
17  * このクラスは、テーブルの操作機能と、テーブル要素の検索機能を提供します。\r
18 \r
19  */\r
20 public class ARTKMarkerTable\r
21 {\r
22         /**\r
23          * 結果型です。{@link ARTKMarkerTable#getBestMatchTarget}関数の戻り値を格納します。\r
24          * <p>memo-\r
25          * 入れ子クラスの作れない処理系では、ARTKMarkerTable_GetBestMatchTargetResultとして宣言してください。\r
26          * </p>\r
27          */\r
28         public static class GetBestMatchTargetResult\r
29         {\r
30                 /** ユーザ定義のID値です。*/\r
31                 public int idtag;\r
32                 /** ユーザ定義の名前文字列です。*/\r
33                 public String name;\r
34                 /** マーカ幅です。単位は、mm単位です。*/\r
35                 public double marker_width;\r
36                 /** マーカ高さです。単位は、mm単位です。*/\r
37                 public double marker_height;\r
38                 /** ARToolKit準拠のマーカの方位値です。0&lt;=n&lt;=3の値が入ります。*/\r
39                 public int artk_direction;\r
40                 /** パターンの一致率です。0<&lt;n&lt;=1.0の数値が入ります。*/\r
41                 public double confidence;\r
42         }\r
43         /**\r
44          * データを格納するリストクラスを定義します。\r
45          */\r
46         private class MarkerTable extends NyARObjectStack<MarkerTable.SerialTableRow>\r
47         {\r
48                 public class SerialTableRow\r
49                 {\r
50                         public int idtag;\r
51                         public String name;\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
56                         {\r
57                                 this.code=i_code;\r
58                                 this.marker_height=i_height;\r
59                                 this.marker_width=i_width;\r
60                                 this.name=i_name;\r
61                                 this.idtag=i_idtag;\r
62                         }\r
63                 }               \r
64                 public MarkerTable(int i_length) throws NyARException\r
65                 {\r
66                         super.initInstance(i_length,SerialTableRow.class);\r
67                 }\r
68                 protected SerialTableRow createElement()\r
69                 {\r
70                         return new SerialTableRow();\r
71                 }\r
72         }\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
82         \r
83         /** ワーク変数*/\r
84         private NyARMatchPattResult __tmp_patt_result=new NyARMatchPattResult();\r
85         \r
86         \r
87         /**\r
88          * コンストラクタです。引数にあるパラメータで、空のテーブルを作ります。\r
89          * @param i_max\r
90          * 登録するアイテムの最大数です。\r
91          * @param i_resolution_x\r
92          * 登録するパターンの横解像度です。\r
93          * ARToolKit互換の標準値は16です。\r
94          * @param i_resolution_y\r
95          * 登録するパターンの縦解像度です。\r
96          * ARToolKit互換の標準値は16です。\r
97          * @param i_edge_x\r
98          * エッジ部分の割合です。0<n<100の数値を指定します。\r
99          * ARToolKit互換の標準値は25です。\r
100          * @param i_edge_y\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
109          */\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
111         {\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
121         }\r
122         /**\r
123          * テーブル操作関数です。{@link NyARCode}を元にして、テーブルにマーカパターンを追加します。\r
124          * @param i_code\r
125          * ARToolKit形式のパターンコードを格納したオブジェクト。このオブジェクトは、関数成功後はインスタンスが所有します。\r
126          * パターンコードの解像度は、コンストラクタに指定した高さと幅である必要があります。\r
127          * @param i_id\r
128          * このマーカを識別する、ユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。\r
129          * @param i_name\r
130          * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。\r
131          * @param i_width\r
132          * 実際のマーカの高さです。[通常mm単位]\r
133          * @param i_height\r
134          * 実際のマーカの幅です。[通常mm単位]\r
135          * @return\r
136          * 登録に成功すると、trueを返します。\r
137          */\r
138         public boolean addMarker(NyARCode i_code,int i_id,String i_name,double i_width,double i_height)\r
139         {\r
140                 assert(i_code.getHeight()== this._resolution_height && i_code.getHeight()== this._resolution_width);\r
141                 MarkerTable.SerialTableRow d=this._table.prePush();\r
142                 if(d==null){\r
143                         return false;\r
144                 }\r
145                 d.setValue(i_code,i_id,i_name,i_width,i_height);\r
146                 return true;\r
147         }\r
148         /**\r
149          * テーブル操作関数です。{@link NyARRgbRaster}クラスのオブジェクトからマーカパターンを生成して、テーブルへ追加します。方位は、上方向がdirection=0になります。\r
150          * @param i_raster\r
151          * マーカパターンの元となるラスタを指定します。解像度は、コンストラクタで指定したものと同じでなければなりません。\r
152          * @param i_id\r
153          * このマーカを識別するユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。\r
154          * @param i_name\r
155          * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。\r
156          * @param i_width\r
157          * 実際のマーカの高さです。[通常mm単位]\r
158          * @param i_height\r
159          * 実際のマーカの幅です。[通常mm単位]\r
160          * @return\r
161          * 登録に成功すると、trueを返します。\r
162          * @throws NyARException\r
163          */\r
164         public boolean addMarker(NyARRgbRaster i_raster,int i_id,String i_name,double i_width,double i_height) throws NyARException\r
165         {\r
166                 MarkerTable.SerialTableRow d=this._table.prePush();\r
167                 if(d==null){\r
168                         return false;\r
169                 }\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
173                 return true;\r
174         }\r
175         /**\r
176          * テーブル操作関数です。ARToolkit準拠のパターンファイルを読み込み、テーブルへ追加します。\r
177          * @param i_filename\r
178          * パターンファイルのファイルパスを指定します。\r
179          * @param i_id\r
180          * このマーカを識別するユーザ定義のID値です。任意の値を指定できます。不要な場合は0を指定してください。\r
181          * @param i_name\r
182          * ユーザ定義の名前です。任意の値を指定できます。不要な場合はnullを指定して下さい。\r
183          * @param i_width\r
184          * 実際のマーカの高さです。[通常mm単位]\r
185          * @param i_height\r
186          * 実際のマーカの幅です。[通常mm単位]\r
187          * @return\r
188          * 登録に成功すると、trueを返します。\r
189          * @throws NyARException\r
190          */\r
191         public boolean addMarkerFromARPattFile(String i_filename,int i_id,String i_name,double i_width,double i_height) throws NyARException\r
192         {\r
193                 MarkerTable.SerialTableRow d=this._table.prePush();\r
194                 if(d==null){\r
195                         return false;\r
196                 }\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
200                 return true;\r
201         }       \r
202         \r
203         /**\r
204          * テーブル検索関数です。\r
205          * {@link NyARRealityTarget}を元に{@link NyARRealitySource}からパターンのサンプリングを行い、最も一致するマーカパターンをテーブルから検索します。\r
206          * 検索キーとなる{@link NyARRealityTarget}は、{@link NyARReality}派生クラスから取得した物を指定します。\r
207          * @param i_target\r
208          * 検索キーとなる、Unknownステータスの{@link NyARRealityTarget}クラスのオブジェクトを指定します。\r
209          * @param i_rtsorce\r
210          * i_targetを検出した{@link NyARRealitySource}のインスタンスを指定します。関数は、このソースからパターン取得を行います。\r
211          * @param o_result\r
212          * 返却値を格納するインスタンスを設定します。\r
213          * @return\r
214          * パターンのサンプリングに成功すると、trueを返します。\r
215          * 返却値がtrueの場合のみ、内容が更新されています。\r
216          * @throws NyARException \r
217          */\r
218         public boolean getBestMatchTarget(NyARRealityTarget i_target,NyARRealitySource i_rtsorce,GetBestMatchTargetResult o_result) throws NyARException\r
219         {\r
220                 //パターン抽出\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
224                 //比較パターン生成\r
225                 this._deviation_data.setRaster(this._tmp_raster);\r
226                 int ret=-1;\r
227                 int dir=-1;\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
233                                 ret=i;\r
234                                 cf=tmp_patt_result.confidence;\r
235                                 dir=tmp_patt_result.direction;\r
236                         }\r
237                 }\r
238                 if(ret<0){\r
239                         return false;\r
240                 }\r
241                 //戻り値を設定\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
249                 return true;\r
250         }\r
251 }\r