import java.io.InputStreamReader;\r
import java.io.StreamTokenizer;\r
\r
-import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.*;\r
+import jp.nyatla.nyartoolkit.core.match.*;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
\r
-\r
-\r
-/**\r
- * ARToolKitのマーカーコードを1個保持します。\r
- * \r
- */\r
-public class NyARCode\r
+class NyARCodeFileReader\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
+ * ARコードファイルからデータを読み込んでo_raster[4]に格納します。\r
+ * @param i_stream\r
+ * @param o_raster\r
+ * @throws NyARException\r
+ */\r
+ public static void loadFromARToolKitFormFile(InputStream i_stream,NyARRaster[] o_raster) throws NyARException\r
{\r
- return pat;\r
+ assert o_raster.length==4;\r
+ //4個の要素をラスタにセットする。\r
+ try {\r
+ StreamTokenizer st = new StreamTokenizer(new InputStreamReader(i_stream));\r
+ //GBRAで一度読みだす。\r
+ for (int h = 0; h < 4; h++) {\r
+ assert o_raster[h].getBufferReader().isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_X8R8G8B8_32);\r
+ final NyARRaster ra=o_raster[h];\r
+ readBlock(st,ra.getWidth(),ra.getHeight(),(int[])ra.getBufferReader().getBuffer());\r
+ }\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
+ return;\r
}\r
-\r
- public double[] getPatPow()\r
+ /**\r
+ * ARコードファイルからデータを読み込んでo_codeに格納します。\r
+ * @param i_stream\r
+ * @param o_code\r
+ * @throws NyARException\r
+ */\r
+ public static void loadFromARToolKitFormFile(InputStream i_stream,NyARCode o_code) throws NyARException\r
{\r
- return patpow;\r
+ int width=o_code.getWidth();\r
+ int height=o_code.getHeight();\r
+ NyARRaster tmp_raster=new NyARRaster(new NyARIntSize(width,height),new int[width*height],INyARBufferReader.BUFFERFORMAT_INT1D_X8R8G8B8_32);\r
+ //4個の要素をラスタにセットする。\r
+ try {\r
+ StreamTokenizer st = new StreamTokenizer(new InputStreamReader(i_stream));\r
+ int[] buf=(int[])tmp_raster.getBufferReader().getBuffer();\r
+ //GBRAで一度読みだす。\r
+ for (int h = 0; h < 4; h++){\r
+ readBlock(st,width,height,buf);\r
+ //ARCodeにセット(カラー)\r
+ o_code.getColorData(h).setRaster(tmp_raster);\r
+ o_code.getBlackWhiteData(h).setRaster(tmp_raster);\r
+ }\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ }\r
+ tmp_raster=null;//ポイ\r
+ return;\r
}\r
-\r
- public short[][][] getPatBW()\r
+ /**\r
+ * 1ブロック分のXRGBデータをi_stからo_bufへ読みだします。\r
+ * @param i_st\r
+ * @param o_buf\r
+ */\r
+ private static void readBlock(StreamTokenizer i_st,int i_width,int i_height,int[] o_buf) throws NyARException\r
{\r
- return patBW;\r
+ try {\r
+ final int pixels=i_width*i_height;\r
+ for (int i3 = 0; i3 < 3; i3++) {\r
+ for (int i2 = 0; i2 < pixels; i2++){\r
+ // 数値のみ読み出す\r
+ switch (i_st.nextToken()){\r
+ case StreamTokenizer.TT_NUMBER:\r
+ break;\r
+ default:\r
+ throw new NyARException();\r
+ }\r
+ o_buf[i2]=(o_buf[i2]<<8)|((0x000000ff&(int)i_st.nval));\r
+ }\r
+ }\r
+ //GBR→RGB\r
+ for(int i3=0;i3<pixels;i3++){\r
+ o_buf[i3]=((o_buf[i3]<<16)&0xff0000)|(o_buf[i3]&0x00ff00)|((o_buf[i3]>>16)&0x0000ff);\r
+ }\r
+ } catch (Exception e) {\r
+ throw new NyARException(e);\r
+ } \r
+ return;\r
}\r
+}\r
\r
- public double[] getPatPowBW()\r
+/**\r
+ * ARToolKitのマーカーコードを1個保持します。\r
+ * \r
+ */\r
+public class NyARCode\r
+{\r
+ private NyARMatchPattDeviationColorData[] _color_pat=new NyARMatchPattDeviationColorData[4];\r
+ private NyARMatchPattDeviationBlackWhiteData[] _bw_pat=new NyARMatchPattDeviationBlackWhiteData[4];\r
+ private int _width;\r
+ private int _height;\r
+ \r
+ public NyARMatchPattDeviationColorData getColorData(int i_index)\r
{\r
- return patpowBW;\r
+ return this._color_pat[i_index];\r
}\r
-\r
+ public NyARMatchPattDeviationBlackWhiteData getBlackWhiteData(int i_index)\r
+ {\r
+ return this._bw_pat[i_index];\r
+ } \r
public int getWidth()\r
{\r
- return width;\r
+ return _width;\r
}\r
\r
public int getHeight()\r
{\r
- return height;\r
+ return _height;\r
}\r
-\r
- public NyARCode(int i_width, int i_height)\r
+ public NyARCode(int i_width, int i_height) throws NyARException\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
+ this._width = i_width;\r
+ this._height = i_height;\r
+ //空のラスタを4個作成\r
+ for(int i=0;i<4;i++){\r
+ this._color_pat[i]=new NyARMatchPattDeviationColorData(i_width,i_height);\r
+ this._bw_pat[i]=new NyARMatchPattDeviationBlackWhiteData(i_width,i_height);\r
+ }\r
+ return;\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
+ return;\r
+ }\r
+ public void setRaster(NyARRaster[] i_raster) throws NyARException\r
+ {\r
+ assert i_raster.length!=4;\r
+ //ラスタにパターンをロードする。\r
+ for(int i=0;i<4;i++){\r
+ this._color_pat[i].setRaster(i_raster[i]); \r
+ }\r
+ return;\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
+ NyARCodeFileReader.loadFromARToolKitFormFile(i_stream,this);\r
+ return;\r
}\r
}\r