OSDN Git Service

[更新]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / NyARCode.java
index 886b716..d5e487b 100644 (file)
@@ -36,163 +36,160 @@ import java.io.InputStream;
 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