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 package jp.nyatla.nyartoolkit.core;\r
33 \r
34 import java.io.FileInputStream;\r
35 import java.io.InputStream;\r
36 import java.io.InputStreamReader;\r
37 import java.io.StreamTokenizer;\r
38 \r
39 \r
40 \r
41 /**\r
42  * ARToolKitのマーカーコードを1個保持します。\r
43  * \r
44  */\r
45 public class NyARCode\r
46 {\r
47         private int[][][][] pat;// static int\r
48                                                         // pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
49 \r
50         private double[] patpow = new double[4];// static double\r
51                                                                                         // patpow[AR_PATT_NUM_MAX][4];\r
52 \r
53         private short[][][] patBW;// static int\r
54                                                                 // patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
55 \r
56         private double[] patpowBW = new double[4];// static double\r
57                                                                                                 // patpowBW[AR_PATT_NUM_MAX][4];\r
58 \r
59         private int width, height;\r
60 \r
61         public int[][][][] getPat()\r
62         {\r
63                 return pat;\r
64         }\r
65 \r
66         public double[] getPatPow()\r
67         {\r
68                 return patpow;\r
69         }\r
70 \r
71         public short[][][] getPatBW()\r
72         {\r
73                 return patBW;\r
74         }\r
75 \r
76         public double[] getPatPowBW()\r
77         {\r
78                 return patpowBW;\r
79         }\r
80 \r
81         public int getWidth()\r
82         {\r
83                 return width;\r
84         }\r
85 \r
86         public int getHeight()\r
87         {\r
88                 return height;\r
89         }\r
90 \r
91         public NyARCode(int i_width, int i_height)\r
92         {\r
93                 width = i_width;\r
94                 height = i_height;\r
95                 pat = new int[4][height][width][3];// static int\r
96                                                                                         // pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
97                 patBW = new short[4][height][width];// static int\r
98                                                                                         // patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
99         }\r
100 \r
101         /**\r
102          * int arLoadPatt( const char *filename ); ARToolKitのパターンファイルをロードする。\r
103          * ファイル形式はBGR形式で記録されたパターンファイルであること。\r
104          * \r
105          * @param filename\r
106          * @return\r
107          * @throws Exception\r
108          */\r
109         public void loadFromARFile(String filename) throws NyARException\r
110         {\r
111                 try {\r
112                         loadFromARFile(new FileInputStream(filename));\r
113 \r
114                 } catch (Exception e) {\r
115                         throw new NyARException(e);\r
116                 }\r
117         }\r
118 \r
119         /**\r
120          * \r
121          * @param i_stream\r
122          * @throws NyARException\r
123          */\r
124         public void loadFromARFile(InputStream i_stream) throws NyARException\r
125         {\r
126                 try {\r
127                         StreamTokenizer st = new StreamTokenizer(new InputStreamReader(\r
128                                         i_stream));\r
129                         // パターンデータはGBRAで並んでる。\r
130                         for (int h = 0; h < 4; h++) {\r
131                                 int l = 0;\r
132                                 for (int i3 = 0; i3 < 3; i3++) {\r
133                                         for (int i2 = 0; i2 < height; i2++) {\r
134                                                 for (int i1 = 0; i1 < width; i1++) {\r
135                                                         // 数値のみ読み出す\r
136                                                         switch (st.nextToken()) {// if( fscanf(fp, "%d",\r
137                                                                                                                 // &j) != 1 ) {\r
138                                                         case StreamTokenizer.TT_NUMBER:\r
139                                                                 break;\r
140                                                         default:\r
141                                                                 throw new NyARException();\r
142                                                         }\r
143                                                         short j = (short) (255 - st.nval);// j = 255-j;\r
144                                                         // 標準ファイルのパターンはBGRでならんでるからRGBに並べなおす\r
145                                                         switch (i3) {\r
146                                                         case 0:\r
147                                                                 pat[h][i2][i1][2] = j;\r
148                                                                 break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+2]\r
149                                                                                 // = j;break;\r
150                                                         case 1:\r
151                                                                 pat[h][i2][i1][1] = j;\r
152                                                                 break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+1]\r
153                                                                                 // = j;break;\r
154                                                         case 2:\r
155                                                                 pat[h][i2][i1][0] = j;\r
156                                                                 break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+0]\r
157                                                                                 // = j;break;\r
158                                                         }\r
159                                                         // pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+i3]\r
160                                                         // = j;\r
161                                                         if (i3 == 0) {\r
162                                                                 patBW[h][i2][i1] = j;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]\r
163                                                                                                                 // = j;\r
164                                                         } else {\r
165                                                                 patBW[h][i2][i1] += j;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]\r
166                                                                                                                 // += j;\r
167                                                         }\r
168                                                         if (i3 == 2) {\r
169                                                                 patBW[h][i2][i1] /= 3;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]\r
170                                                                                                                 // /= 3;\r
171                                                         }\r
172                                                         l += j;\r
173                                                 }\r
174                                         }\r
175                                 }\r
176 \r
177                                 l /= (height * width * 3);\r
178 \r
179                                 int m = 0;\r
180                                 for (int i = 0; i < height; i++) {// for( i = 0; i <\r
181                                                                                                         // AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3;\r
182                                                                                                         // i++ ) {\r
183                                         for (int i2 = 0; i2 < width; i2++) {\r
184                                                 for (int i3 = 0; i3 < 3; i3++) {\r
185                                                         pat[h][i][i2][i3] -= l;\r
186                                                         m += (pat[h][i][i2][i3] * pat[h][i][i2][i3]);\r
187                                                 }\r
188                                         }\r
189                                 }\r
190                                 patpow[h] = Math.sqrt((double) m);\r
191                                 if (patpow[h] == 0.0) {\r
192                                         patpow[h] = 0.0000001;\r
193                                 }\r
194 \r
195                                 m = 0;\r
196                                 for (int i = 0; i < height; i++) {\r
197                                         for (int i2 = 0; i2 < width; i2++) {\r
198                                                 patBW[h][i][i2] -= l;\r
199                                                 m += (patBW[h][i][i2] * patBW[h][i][i2]);\r
200                                         }\r
201                                 }\r
202                                 patpowBW[h] = Math.sqrt((double) m);\r
203                                 if (patpowBW[h] == 0.0) {\r
204                                         patpowBW[h] = 0.0000001;\r
205                                 }\r
206                         }\r
207                 } catch (Exception e) {\r
208                         throw new NyARException(e);\r
209                 }\r
210         }\r
211 }\r