2 * PROJECT: NyARToolkit
\r
3 * --------------------------------------------------------------------------------
\r
4 * This work is based on the original ARToolKit developed by
\r
7 * HITLab, University of Washington, Seattle
\r
8 * http://www.hitl.washington.edu/artoolkit/
\r
10 * The NyARToolkit is Java version ARToolkit class library.
\r
11 * Copyright (C)2008 R.Iizuka
\r
13 * This program is free software; you can redistribute it and/or
\r
14 * modify it under the terms of the GNU General Public License
\r
15 * as published by the Free Software Foundation; either version 2
\r
16 * of the License, or (at your option) any later version.
\r
18 * This program is distributed in the hope that it will be useful,
\r
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
21 * GNU General Public License for more details.
\r
23 * You should have received a copy of the GNU General Public License
\r
24 * along with this framework; if not, write to the Free Software
\r
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
27 * For further information please contact.
\r
28 * http://nyatla.jp/nyatoolkit/
\r
29 * <airmail(at)ebony.plala.or.jp>
\r
32 package jp.nyatla.nyartoolkit.core.match;
\r
34 import jp.nyatla.nyartoolkit.NyARException;
\r
35 import jp.nyatla.nyartoolkit.core.*;
\r
38 * AR_TEMPLATE_MATCHING_COLORかつAR_MATCHING_WITHOUT_PCAと同等のルールで
\r
42 public class NyARMatchPatt_Color_WITHOUT_PCA implements ARMatchPatt{
\r
43 private int[][][] input=new int[1][1][3];
\r
44 private double datapow;
\r
46 private int width =1;
\r
47 private int height=1;
\r
48 private double cf=0;
\r
50 public double getConfidence(){
\r
53 public int getDirection(){
\r
57 * input配列サイズを必要に応じて再アロケートする。
\r
62 private void reallocInputArray(int i_width,int i_height)
\r
64 if(this.input.length<i_height || this.input[0].length<i_width){
\r
65 //配列が十分なサイズでなければ取り直す
\r
66 this.input=new int[i_height][i_width][3];
\r
68 this.height=i_height;
\r
69 this.width =i_width;
\r
71 public boolean setPatt(NyARColorPatt i_target_patt) throws NyARException
\r
74 int[][][] data,linput;
\r
76 //input配列のサイズとwhも更新// input=new int[height][width][3];
\r
77 reallocInputArray(i_target_patt.getWidth(),i_target_patt.getHeight());
\r
78 int lwidth =this.width;
\r
79 int lheight=this.height;
\r
81 data=i_target_patt.getPatArray();
\r
83 int sum=0,l_ave=0,w_sum;
\r
84 int[][] data_i,input_i;
\r
85 int[] data_i_k,input_i_k;
\r
86 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
88 for(k=lwidth-1;k>=0;k--) {//<Optimize/>for(int i2=0;i2<Config.AR_PATT_SIZE_X;i2++){
\r
89 //<Optimize/>l_ave += (255-data[i][i2][0])+(255-data[i][i2][1])+(255-data[i][i2][2]);
\r
91 l_ave += 255*3-data_i_k[0]-data_i_k[1]-data_i_k[2];
\r
94 l_ave /= (lheight*lwidth*3);
\r
95 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
98 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
100 //for(int i3=0;i3<3;i3++){
\r
101 // input[i][i2][i3] = (255-data[i][i2][i3]) - l_ave;
\r
102 // sum += input[i][i2][i3]*input[i][i2][i3];
\r
104 data_i_k =data_i[k];
\r
105 input_i_k=input_i[k];
\r
106 w_sum=(255-data_i_k[0]) - l_ave;
\r
107 input_i_k[0]=w_sum;
\r
108 sum += w_sum*w_sum;
\r
110 w_sum=(255-data_i_k[1]) - l_ave;
\r
111 input_i_k[1]=w_sum;
\r
112 sum += w_sum*w_sum;
\r
114 w_sum=(255-data_i_k[2]) - l_ave;
\r
115 input_i_k[2]=w_sum;
\r
120 datapow = Math.sqrt( (double)sum );
\r
121 if(datapow == 0.0){
\r
122 return false;// throw new NyARException();
\r
123 // dir.set(0);//*dir = 0;
\r
124 // cf.set(-1.0);//*cf = -1.0;
\r
130 * public int pattern_match(short[][][] data,IntPointer dir,DoublePointer cf)
\r
133 public void evaluate(NyARCode i_code)
\r
135 int[][][][] pat=i_code.getPat();
\r
136 double[] patpow=i_code.getPatPow();
\r
139 int[][][] pat_j,linput;
\r
140 int[][] pat_j_i,input_i;
\r
141 int[] pat_j_i_k,input_i_k;
\r
142 int l_width=this.width;
\r
143 int l_height=this.height;
\r
145 for(int j = 0; j < 4; j++ ) {
\r
148 for(int i=l_height-1;i>=0;i--){//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){
\r
151 for(int k=l_width-1;k>=0;k--){
\r
152 pat_j_i_k=pat_j_i[k];
\r
153 input_i_k=input_i[k];
\r
154 // for(int i3=0;i3<3;i3++){
\r
155 sum += input_i_k[0]*pat_j_i_k[0];//sum += input[i][i2][i3]*pat[k][j][i][i2][i3];
\r
156 sum += input_i_k[1]*pat_j_i_k[1];//sum += input[i][i2][i3]*pat[k][j][i][i2][i3];
\r
157 sum += input_i_k[2]*pat_j_i_k[2];//sum += input[i][i2][i3]*pat[k][j][i][i2][i3];
\r
161 double sum2 = sum / patpow[j] / datapow;//sum2 = sum / patpow[k][j] / datapow;
\r