OSDN Git Service

[リリース]NyARToolkit 1.0.0
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core / match / NyARMatchPatt_Color_WITHOUT_PCA.java
index 8f17c04..84df205 100644 (file)
@@ -40,12 +40,11 @@ import jp.nyatla.nyartoolkit.core.*;
  *\r
  */\r
 public class NyARMatchPatt_Color_WITHOUT_PCA implements ARMatchPatt{\r
-    private int[][][]  input;\r
-    private int ave;\r
+    private int[][][]  input=new int[1][1][3];\r
     private double datapow;\r
 \r
-    private int width;\r
-    private int height;\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
@@ -54,29 +53,68 @@ public class NyARMatchPatt_Color_WITHOUT_PCA implements ARMatchPatt{
     public int getDirection(){\r
        return dir;\r
     }\r
-    public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException\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
-       width=i_target_patt.getWidth();\r
-       height=i_target_patt.getHeight();\r
-       short[][][] data=i_target_patt.getPatArray();\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=new int[height][width][3];\r
-        int sum;\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
-        sum = ave = 0;\r
-        for(int i=0;i<height;i++) {//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){\r
-            for(int i2=0;i2<width;i2++) {//for(int i2=0;i2<Config.AR_PATT_SIZE_X;i2++){\r
-                ave += (255-data[i][i2][0])+(255-data[i][i2][1])+(255-data[i][i2][2]);\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
-        ave /= (height*width*3);\r
-\r
-        for(int i=0;i<height;i++){//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){\r
-            for(int i2=0;i2<width;i2++){//for(int i2=0;i2<Config.AR_PATT_SIZE_X;i2++){\r
-                for(int i3=0;i3<3;i3++){\r
-                    input[i][i2][i3] = (255-data[i][i2][i3]) - ave;\r
-                    sum += input[i][i2][i3]*input[i][i2][i3];\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
@@ -98,22 +136,35 @@ public class NyARMatchPatt_Color_WITHOUT_PCA implements ARMatchPatt{
        double[] patpow=i_code.getPatPow();\r
        int res= -1;\r
        double max=0.0;\r
-        for(int j = 0; j < 4; j++ ) {\r
-            int sum = 0;\r
-            for(int i=0;i<height;i++){//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){\r
-               for(int i2=0;i2<width;i2++){\r
-                   for(int i3=0;i3<3;i3++){\r
-                       sum += input[i][i2][i3]*pat[j][i][i2][i3];//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
+       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