OSDN Git Service

初期インポート。
[nyartoolkit-and/nyartoolkit-android-0.9.git] / src / jp / nyatla / nyartoolkit / core / match / NyARMatchPatt_Color_WITHOUT_PCA.java
diff --git a/src/jp/nyatla/nyartoolkit/core/match/NyARMatchPatt_Color_WITHOUT_PCA.java b/src/jp/nyatla/nyartoolkit/core/match/NyARMatchPatt_Color_WITHOUT_PCA.java
new file mode 100644 (file)
index 0000000..6bb033d
--- /dev/null
@@ -0,0 +1,170 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ *   Hirokazu Kato\r
+ *   Mark Billinghurst\r
+ *   HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.match;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.*;\r
+\r
+/**\r
+ * AR_TEMPLATE_MATCHING_COLORかつAR_MATCHING_WITHOUT_PCAと同等のルールで\r
+ * マーカーを評価します。\r
+ *\r
+ */\r
+public class NyARMatchPatt_Color_WITHOUT_PCA implements NyARMatchPatt{\r
+    private int[][][]  input=new int[1][1][3];\r
+    private double datapow;\r
+\r
+    private int width =1;\r
+    private int height=1;\r
+    private double cf=0;\r
+    private int dir=0;\r
+    public double getConfidence(){\r
+       return cf;\r
+    }\r
+    public int getDirection(){\r
+       return dir;\r
+    }\r
+    /**\r
+     * input配列サイズを必要に応じて再アロケートする。\r
+     *\r
+     * @param i_width\r
+     * @param i_height\r
+     */\r
+    private void reallocInputArray(int i_width,int i_height)\r
+    {\r
+        if(this.input.length<i_height || this.input[0].length<i_width){\r
+            //配列が十分なサイズでなければ取り直す\r
+            this.input=new int[i_height][i_width][3];          \r
+        }\r
+        this.height=i_height;\r
+        this.width =i_width;\r
+    }\r
+    public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException\r
+    { \r
+       int i,k;\r
+       int[][][] data,linput;\r
+       \r
+       //input配列のサイズとwhも更新//       input=new int[height][width][3];\r
+       reallocInputArray(i_target_patt.getWidth(),i_target_patt.getHeight());\r
+       int lwidth =this.width;\r
+       int lheight=this.height;\r
+       linput=this.input;\r
+       data=i_target_patt.getPatArray();\r
+\r
+       int sum=0,l_ave=0,w_sum;\r
+        int[][] data_i,input_i;\r
+        int[] data_i_k,input_i_k;\r
+        for(i=lheight-1;i>=0;i--){//<Optimize/>for(int i=0;i<height;i++) {//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){\r
+            data_i=data[i];\r
+            for(k=lwidth-1;k>=0;k--) {//<Optimize/>for(int i2=0;i2<Config.AR_PATT_SIZE_X;i2++){\r
+               //<Optimize/>l_ave += (255-data[i][i2][0])+(255-data[i][i2][1])+(255-data[i][i2][2]);\r
+               data_i_k=data_i[k];\r
+               l_ave += 255*3-data_i_k[0]-data_i_k[1]-data_i_k[2];\r
+            }\r
+        }\r
+        l_ave /= (lheight*lwidth*3);\r
+        for(i=lheight-1;i>=0;i--){//for(i=0;i<height;i++){//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){\r
+            input_i=linput[i];\r
+            data_i=data[i];\r
+            for(k=lwidth-1;k>=0;k--){//for(i2=0;i2<width;i2++){//for(int i2=0;i2<Config.AR_PATT_SIZE_X;i2++){\r
+                //<Optimize>\r
+                //for(int i3=0;i3<3;i3++){\r
+                //    input[i][i2][i3] = (255-data[i][i2][i3]) - l_ave;\r
+                //    sum += input[i][i2][i3]*input[i][i2][i3];\r
+                //}\r
+               data_i_k =data_i[k];\r
+               input_i_k=input_i[k];\r
+               w_sum=(255-data_i_k[0]) - l_ave;\r
+               input_i_k[0]=w_sum;\r
+                sum += w_sum*w_sum;\r
+                \r
+                w_sum=(255-data_i_k[1]) - l_ave;\r
+                input_i_k[1]=w_sum;\r
+                sum += w_sum*w_sum;\r
+                \r
+                w_sum=(255-data_i_k[2]) - l_ave;\r
+                input_i_k[2]=w_sum;\r
+                sum+=w_sum*w_sum;\r
+                //</Optimize>\r
+            }\r
+        }\r
+        datapow = Math.sqrt( (double)sum );\r
+        if(datapow == 0.0){\r
+            return false;//            throw new NyARException();\r
+//            dir.set(0);//*dir  = 0;\r
+//            cf.set(-1.0);//*cf   = -1.0;\r
+//            return -1;\r
+        }\r
+        return true;\r
+    }\r
+    /**\r
+     * public int pattern_match(short[][][] data,IntPointer dir,DoublePointer cf)\r
+\r
+     */\r
+    public void evaluate(NyARCode i_code)\r
+    {\r
+       int[][][][] pat=i_code.getPat();\r
+       double[] patpow=i_code.getPatPow();\r
+       int res= -1;\r
+       double max=0.0;\r
+       int[][][] pat_j,linput;\r
+       int[][] pat_j_i,input_i;\r
+       int[] pat_j_i_k,input_i_k;\r
+       int l_width=this.width;\r
+       int l_height=this.height;\r
+       linput=this.input;\r
+       for(int j = 0; j < 4; j++ ) {\r
+           int sum = 0;\r
+           pat_j=pat[j];\r
+           for(int i=l_height-1;i>=0;i--){//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){\r
+               input_i=linput[i];\r
+               pat_j_i=pat_j[i];\r
+               for(int k=l_width-1;k>=0;k--){\r
+                   pat_j_i_k=pat_j_i[k];\r
+                   input_i_k=input_i[k];\r
+//                 for(int i3=0;i3<3;i3++){\r
+                   sum += input_i_k[0]*pat_j_i_k[0];//sum += input[i][i2][i3]*pat[k][j][i][i2][i3];\r
+                   sum += input_i_k[1]*pat_j_i_k[1];//sum += input[i][i2][i3]*pat[k][j][i][i2][i3];\r
+                   sum += input_i_k[2]*pat_j_i_k[2];//sum += input[i][i2][i3]*pat[k][j][i][i2][i3];\r
+//                 }\r
+               }\r
+           }\r
+           double sum2 = sum / patpow[j] / datapow;//sum2 = sum / patpow[k][j] / datapow;\r
+           if( sum2 > max ){\r
+               max = sum2;\r
+               res = j;\r
+           }\r
+       }\r
+       dir=res;\r
+       cf=max;\r
+    }\r
+}
\ No newline at end of file