*\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
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
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