OSDN Git Service

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