* <airmail(at)ebony.plala.or.jp>\r
* \r
*/\r
-\r
package jp.nyatla.nyartoolkit.core;\r
\r
import java.io.FileInputStream;\r
+import java.io.InputStream;\r
import java.io.InputStreamReader;\r
import java.io.StreamTokenizer;\r
\r
\r
\r
\r
-\r
-\r
/**\r
* ARToolKitのマーカーコードを1個保持します。\r
- *\r
+ * \r
*/\r
-public class NyARCode{\r
- private int[][][][] pat;//static int pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
- private double[] patpow=new double[4];//static double patpow[AR_PATT_NUM_MAX][4];\r
- private short[][][] patBW;//static int patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
- private double[] patpowBW=new double[4];//static double patpowBW[AR_PATT_NUM_MAX][4]; \r
- private int width,height;\r
- public int[][][][] getPat()\r
- {\r
- return pat;\r
- }\r
- public double [] getPatPow()\r
- {\r
- return patpow;\r
- }\r
- public short[][][] getPatBW()\r
- {\r
- return patBW;\r
- }\r
- public double[] getPatPowBW()\r
- {\r
- return patpowBW;\r
- }\r
- public int getWidth()\r
- {\r
- return width;\r
- }\r
- public int getHeight()\r
- {\r
- return height;\r
- }\r
- \r
- public NyARCode(int i_width,int i_height)\r
- {\r
- width=i_width;\r
- height=i_height;\r
- 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
- patBW=new short[4][height][width];//static int patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
- }\r
-\r
-\r
- /**\r
- * int arLoadPatt( const char *filename );\r
- * ARToolKitのパターンファイルをロードする。\r
- * @param filename\r
- * @return\r
- * @throws Exception\r
- */\r
- public void loadFromARFile(String filename) throws NyARException\r
- {\r
- try{\r
- StreamTokenizer st=new StreamTokenizer(new InputStreamReader(new FileInputStream(filename)));\r
- //パターンデータはGBRAで並んでる。\r
- for(int h=0; h<4; h++ ) {\r
- int l = 0;\r
- for(int i3 = 0; i3 < 3; i3++ ) {\r
- for(int i2 = 0; i2 < height; i2++ ) {\r
- for(int i1 = 0; i1 < width; i1++ ){\r
- //数値のみ読み出す\r
- switch(st.nextToken()){//if( fscanf(fp, "%d", &j) != 1 ) {\r
- case StreamTokenizer.TT_NUMBER:\r
- break;\r
- default:\r
- throw new NyARException();\r
- }\r
- short j=(short)(255-st.nval);//j = 255-j;\r
- //標準ファイルのパターンはBGRでならんでるからRGBに並べなおす\r
- switch(i3){\r
- case 0:pat[h][i2][i1][2] = j;break;//pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+2] = j;break;\r
- case 1:pat[h][i2][i1][1] = j;break;//pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+1] = j;break;\r
- case 2:pat[h][i2][i1][0] = j;break;//pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+0] = j;break;\r
- }\r
- //pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+i3] = j;\r
- if( i3 == 0 ){\r
- patBW[h][i2][i1] = j;//patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1] = j;\r
- }else{\r
- patBW[h][i2][i1] += j;//patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1] += j;\r
- }\r
- if( i3 == 2 ){\r
- patBW[h][i2][i1] /= 3;//patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1] /= 3;\r
- }\r
- l += j;\r
- }\r
- }\r
- }\r
- \r
- l /= (height*width*3);\r
- \r
- int m = 0;\r
- for(int i = 0; i < height; i++ ) {//for( i = 0; i < AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3; i++ ) {\r
- for(int i2 = 0; i2 < width; i2++ ) {\r
- for(int i3 = 0; i3 < 3; i3++ ) {\r
- pat[h][i][i2][i3] -= l;\r
- m += (pat[h][i][i2][i3]*pat[h][i][i2][i3]);\r
- }\r
- }\r
- }\r
- patpow[h] = Math.sqrt((double)m);\r
- if( patpow[h] == 0.0 ){\r
- patpow[h] = 0.0000001;\r
- }\r
- \r
- m = 0;\r
- for(int i = 0; i < height; i++ ) {\r
- for(int i2 = 0; i2 < width; i2++ ) {\r
- patBW[h][i][i2] -= l;\r
- m += (patBW[h][i][i2]*patBW[h][i][i2]);\r
- }\r
- }\r
- patpowBW[h] = Math.sqrt((double)m);\r
- if(patpowBW[h] == 0.0 ){\r
- patpowBW[h] = 0.0000001;\r
- }\r
- }\r
- }catch(Exception e){\r
- throw new NyARException(e);\r
+public class NyARCode\r
+{\r
+ private int[][][][] pat;// static int\r
+ // pat[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
+\r
+ private double[] patpow = new double[4];// static double patpow[AR_PATT_NUM_MAX][4];\r
+\r
+ private short[][][] patBW;// static int patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
+\r
+ private double[] patpowBW = new double[4];// static double patpowBW[AR_PATT_NUM_MAX][4];\r
+\r
+ private int width, height;\r
+\r
+ public int[][][][] getPat()\r
+ {\r
+ return pat;\r
+ }\r
+\r
+ public double[] getPatPow()\r
+ {\r
+ return patpow;\r
+ }\r
+\r
+ public short[][][] getPatBW()\r
+ {\r
+ return patBW;\r
+ }\r
+\r
+ public double[] getPatPowBW()\r
+ {\r
+ return patpowBW;\r
+ }\r
+\r
+ public int getWidth()\r
+ {\r
+ return width;\r
+ }\r
+\r
+ public int getHeight()\r
+ {\r
+ return height;\r
+ }\r
+\r
+ public NyARCode(int i_width, int i_height)\r
+ {\r
+ width = i_width;\r
+ height = i_height;\r
+ 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
+ patBW = new short[4][height][width];// static int patBW[AR_PATT_NUM_MAX][4][AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3];\r
+ }\r
+\r
+ /**\r
+ * int arLoadPatt( const char *filename ); ARToolKitのパターンファイルをロードする。\r
+ * ファイル形式はBGR形式で記録されたパターンファイルであること。\r
+ * \r
+ * @param filename\r
+ * @return\r
+ * @throws Exception\r
+ */\r
+ public void loadARPattFromFile(String filename) throws NyARException\r
+ {\r
+ try {\r
+ loadARPatt(new FileInputStream(filename));\r
+\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param i_stream\r
+ * @throws NyARException\r
+ */\r
+ public void loadARPatt(InputStream i_stream) throws NyARException\r
+ {\r
+ try {\r
+ StreamTokenizer st = new StreamTokenizer(new InputStreamReader(\r
+ i_stream));\r
+ // パターンデータはGBRAで並んでる。\r
+ for (int h = 0; h < 4; h++) {\r
+ int l = 0;\r
+ for (int i3 = 0; i3 < 3; i3++) {\r
+ for (int i2 = 0; i2 < height; i2++) {\r
+ for (int i1 = 0; i1 < width; i1++) {\r
+ // 数値のみ読み出す\r
+ switch (st.nextToken()) {// if( fscanf(fp, "%d",&j) != 1 ) {\r
+ case StreamTokenizer.TT_NUMBER:\r
+ break;\r
+ default:\r
+ throw new NyARException();\r
+ }\r
+ short j = (short) (255 - st.nval);// j = 255-j;\r
+ // 標準ファイルのパターンはBGRでならんでるからRGBに並べなおす\r
+ switch (i3) {\r
+ case 0:\r
+ pat[h][i2][i1][2] = j;\r
+ break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+2]= j;break;\r
+ case 1:\r
+ pat[h][i2][i1][1] = j;\r
+ break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+1]= j;break;\r
+ case 2:\r
+ pat[h][i2][i1][0] = j;\r
+ break;// pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+0]= j;break;\r
+ }\r
+ // pat[patno][h][(i2*Config.AR_PATT_SIZE_X+i1)*3+i3]= j;\r
+ if (i3 == 0) {\r
+ patBW[h][i2][i1] = j;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1] = j;\r
+ } else {\r
+ patBW[h][i2][i1] += j;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1] += j;\r
+ }\r
+ if (i3 == 2) {\r
+ patBW[h][i2][i1] /= 3;// patBW[patno][h][i2*Config.AR_PATT_SIZE_X+i1]/= 3;\r
+ }\r
+ l += j;\r
+ }\r
+ }\r
+ }\r
+\r
+ l /= (height * width * 3);\r
+\r
+ int m = 0;\r
+ for (int i = 0; i < height; i++) {// for( i = 0; i < AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3;i++ ) {\r
+ for (int i2 = 0; i2 < width; i2++) {\r
+ for (int i3 = 0; i3 < 3; i3++) {\r
+ pat[h][i][i2][i3] -= l;\r
+ m += (pat[h][i][i2][i3] * pat[h][i][i2][i3]);\r
+ }\r
+ }\r
+ }\r
+ patpow[h] = Math.sqrt((double) m);\r
+ if (patpow[h] == 0.0) {\r
+ patpow[h] = 0.0000001;\r
+ }\r
+\r
+ m = 0;\r
+ for (int i = 0; i < height; i++) {\r
+ for (int i2 = 0; i2 < width; i2++) {\r
+ patBW[h][i][i2] -= l;\r
+ m += (patBW[h][i][i2] * patBW[h][i][i2]);\r
+ }\r
+ }\r
+ patpowBW[h] = Math.sqrt((double) m);\r
+ if (patpowBW[h] == 0.0) {\r
+ patpowBW[h] = 0.0000001;\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
}\r
- }\r
}\r