OSDN Git Service

[更新]NyARToolkit/nyatlaブランチ
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core / NyARCode.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java version ARToolkit class library.\r
11  * Copyright (C)2008 R.Iizuka\r
12  *\r
13  * This program is free software; you can redistribute it and/or\r
14  * modify it under the terms of the GNU General Public License\r
15  * as published by the Free Software Foundation; either version 2\r
16  * of the License, or (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  * \r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this framework; if not, write to the Free Software\r
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
26  * \r
27  * For further information please contact.\r
28  *      http://nyatla.jp/nyatoolkit/\r
29  *      <airmail(at)ebony.plala.or.jp>\r
30  * \r
31  */\r
32 \r
33 package jp.nyatla.nyartoolkit.core;\r
34 \r
35 import java.io.FileInputStream;\r
36 import java.io.InputStream;\r
37 import java.io.InputStreamReader;\r
38 import java.io.StreamTokenizer;\r
39 \r
40 import jp.nyatla.nyartoolkit.NyARException;\r
41 \r
42 /**\r
43  * ARToolKitのマーカーコードを1個保持します。\r
44  * \r
45  */\r
46 public class NyARCode\r
47 {\r
48         private int[][][][] pat;// static int\r
49                                                         // pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
50 \r
51         private double[] patpow = new double[4];// static double\r
52                                                                                         // patpow[AR_PATT_NUM_MAX][4];\r
53 \r
54         private short[][][] patBW;// static int\r
55                                                                 // patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
56 \r
57         private double[] patpowBW = new double[4];// static double\r
58                                                                                                 // patpowBW[AR_PATT_NUM_MAX][4];\r
59 \r
60         private int width, height;\r
61 \r
62         public int[][][][] getPat()\r
63         {\r
64                 return pat;\r
65         }\r
66 \r
67         public double[] getPatPow()\r
68         {\r
69                 return patpow;\r
70         }\r
71 \r
72         public short[][][] getPatBW()\r
73         {\r
74                 return patBW;\r
75         }\r
76 \r
77         public double[] getPatPowBW()\r
78         {\r
79                 return patpowBW;\r
80         }\r
81 \r
82         public int getWidth()\r
83         {\r
84                 return width;\r
85         }\r
86 \r
87         public int getHeight()\r
88         {\r
89                 return height;\r
90         }\r
91 \r
92         public NyARCode(int i_width, int i_height)\r
93         {\r
94                 width = i_width;\r
95                 height = i_height;\r
96                 pat = new int[4][height][width][3];// static int\r
97                                                                                         // pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
98                 patBW = new short[4][height][width];// static int\r
99                                                                                         // patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
100         }\r
101 \r
102         /**\r
103          * int arLoadPatt( const char *filename ); ARToolKitのパターンファイルをロードする。\r
104          * ファイル形式はBGR形式で記録されたパターンファイルであること。\r
105          * \r
106          * @param filename\r
107          * @return\r
108          * @throws Exception\r
109          */\r
110         public void loadFromARFile(String filename) throws NyARException\r
111         {\r
112                 try {\r
113                         loadFromARFile(new FileInputStream(filename));\r
114 \r
115                 } catch (Exception e) {\r
116                         throw new NyARException(e);\r
117                 }\r
118         }\r
119 \r
120         /**\r
121          * \r
122          * @param i_stream\r
123          * @throws NyARException\r
124          */\r
125         public void loadFromARFile(InputStream i_stream) throws NyARException\r
126         {\r
127                 try {\r
128                         StreamTokenizer st = new StreamTokenizer(new InputStreamReader(\r
129                                         i_stream));\r
130                         // パターンデータはGBRAで並んでる。\r
131                         for (int h = 0; h < 4; h++) {\r
132                                 int l = 0;\r
133                                 for (int i3 = 0; i3 < 3; i3++) {\r
134                                         for (int i2 = 0; i2 < height; i2++) {\r
135                                                 for (int i1 = 0; i1 < width; i1++) {\r
136                                                         // 数値のみ読み出す\r
137                                                         switch (st.nextToken()) {// if( fscanf(fp, "%d",\r
138                                                                                                                 // &j) != 1 ) {\r
139                                                         case StreamTokenizer.TT_NUMBER:\r
140                                                                 break;\r
141                                                         default:\r
142                                                                 throw new NyARException();\r
143                                                         }\r
144                                                         short j = (short) (255 - st.nval);// j = 255-j;\r
145                                                         // 標準ファイルのパターンはBGRでならんでるからRGBに並べなおす\r
146                                                         switch (i3) {\r
147                                                         case 0:\r
148                                                                 pat[h][i2][i1][2] = j;\r
149                                                                 break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+2]\r
150                                                                                 // = j;break;\r
151                                                         case 1:\r
152                                                                 pat[h][i2][i1][1] = j;\r
153                                                                 break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+1]\r
154                                                                                 // = j;break;\r
155                                                         case 2:\r
156                                                                 pat[h][i2][i1][0] = j;\r
157                                                                 break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+0]\r
158                                                                                 // = j;break;\r
159                                                         }\r
160                                                         // pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+i3]\r
161                                                         // = j;\r
162                                                         if (i3 == 0) {\r
163                                                                 patBW[h][i2][i1] = j;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]\r
164                                                                                                                 // = j;\r
165                                                         } else {\r
166                                                                 patBW[h][i2][i1] += j;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]\r
167                                                                                                                 // += j;\r
168                                                         }\r
169                                                         if (i3 == 2) {\r
170                                                                 patBW[h][i2][i1] /= 3;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]\r
171                                                                                                                 // /= 3;\r
172                                                         }\r
173                                                         l += j;\r
174                                                 }\r
175                                         }\r
176                                 }\r
177 \r
178                                 l /= (height * width * 3);\r
179 \r
180                                 int m = 0;\r
181                                 for (int i = 0; i < height; i++) {// for( i = 0; i <\r
182                                                                                                         // AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3;\r
183                                                                                                         // i++ ) {\r
184                                         for (int i2 = 0; i2 < width; i2++) {\r
185                                                 for (int i3 = 0; i3 < 3; i3++) {\r
186                                                         pat[h][i][i2][i3] -= l;\r
187                                                         m += (pat[h][i][i2][i3] * pat[h][i][i2][i3]);\r
188                                                 }\r
189                                         }\r
190                                 }\r
191                                 patpow[h] = Math.sqrt((double) m);\r
192                                 if (patpow[h] == 0.0) {\r
193                                         patpow[h] = 0.0000001;\r
194                                 }\r
195 \r
196                                 m = 0;\r
197                                 for (int i = 0; i < height; i++) {\r
198                                         for (int i2 = 0; i2 < width; i2++) {\r
199                                                 patBW[h][i][i2] -= l;\r
200                                                 m += (patBW[h][i][i2] * patBW[h][i][i2]);\r
201                                         }\r
202                                 }\r
203                                 patpowBW[h] = Math.sqrt((double) m);\r
204                                 if (patpowBW[h] == 0.0) {\r
205                                         patpowBW[h] = 0.0000001;\r
206                                 }\r
207                         }\r
208                 } catch (Exception e) {\r
209                         throw new NyARException(e);\r
210                 }\r
211         }\r
212 }\r