OSDN Git Service

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