OSDN Git Service

[Backup]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core / match / NyARMatchPattDeviationColorData.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java edition ARToolKit class library.\r
11  * Copyright (C)2008-2009 Ryo Iizuka\r
12  *\r
13  * This program is free software: you can redistribute it and/or modify\r
14  * it under the terms of the GNU General Public License as published by\r
15  * the Free Software Foundation, either version 3 of the License, or\r
16  * (at your option) any later version.\r
17  * \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
22  *\r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
25  * \r
26  * For further information please contact.\r
27  *      http://nyatla.jp/nyatoolkit/\r
28  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
29  * \r
30  */\r
31 package jp.nyatla.nyartoolkit.core.match;\r
32 \r
33 \r
34 import jp.nyatla.nyartoolkit.core.raster.*;\r
35 import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
36 \r
37 /**\r
38  * INyARMatchPattのRGBColor差分データを格納するクラスです。\r
39  *\r
40  */\r
41 public class NyARMatchPattDeviationColorData\r
42 {\r
43         private int[] _data;\r
44         private double _pow;\r
45         //\r
46         private int _number_of_pixels;\r
47         private int _optimize_for_mod;\r
48         public int[] refData()\r
49         {\r
50                 return this._data;\r
51         }\r
52         public double getPow()\r
53         {\r
54                 return this._pow;\r
55         }\r
56                           \r
57         public NyARMatchPattDeviationColorData(int i_width,int i_height)\r
58         {\r
59                 this._number_of_pixels=i_height*i_width;\r
60                 this._data=new int[this._number_of_pixels*3];\r
61                 this._optimize_for_mod=this._number_of_pixels-(this._number_of_pixels%8);       \r
62                 return;\r
63         }\r
64 \r
65         \r
66         /**\r
67          * NyARRasterからパターンデータをセットします。\r
68          * この関数は、データを元に所有するデータ領域を更新します。\r
69          * @param i_buffer\r
70          */\r
71         public void setRaster(INyARRaster i_raster)\r
72         {\r
73                 //画素フォーマット、サイズ制限\r
74                 assert i_raster.getBufferReader().isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_X8R8G8B8_32);\r
75                 assert i_raster.getSize().isEqualSize(i_raster.getSize());\r
76 \r
77                 final int[] buf=(int[])i_raster.getBufferReader().getBuffer();\r
78                 //i_buffer[XRGB]→差分[R,G,B]変換                  \r
79                 int i;\r
80                 int ave;//<PV/>\r
81                 int rgb;//<PV/>\r
82                 final int[] linput=this._data;//<PV/>\r
83 \r
84                 // input配列のサイズとwhも更新// input=new int[height][width][3];\r
85                 final int number_of_pixels=this._number_of_pixels;\r
86                 final int for_mod=this._optimize_for_mod;\r
87 \r
88                 //<平均値計算(FORの1/8展開)>\r
89                 ave = 0;\r
90                 for(i=number_of_pixels-1;i>=for_mod;i--){\r
91                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);\r
92                 }\r
93                 for (;i>=0;) {\r
94                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
95                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
96                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
97                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
98                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
99                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
100                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
101                         rgb = buf[i];ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);i--;\r
102                 }\r
103                 //<平均値計算(FORの1/8展開)/>\r
104                 ave=number_of_pixels*255*3-ave;\r
105                 ave =255-(ave/ (number_of_pixels * 3));//(255-R)-ave を分解するための事前計算\r
106 \r
107                 int sum = 0,w_sum;\r
108                 int input_ptr=number_of_pixels*3-1;\r
109                 //<差分値計算(FORの1/8展開)>\r
110                 for (i = number_of_pixels-1; i >= for_mod;i--) {\r
111                         rgb = buf[i];\r
112                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
113                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
114                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
115                 }\r
116                 for (; i >=0;) {\r
117                         rgb = buf[i];i--;\r
118                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
119                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
120                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
121                         rgb = buf[i];i--;\r
122                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
123                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
124                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
125                         rgb = buf[i];i--;\r
126                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
127                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
128                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
129                         rgb = buf[i];i--;\r
130                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
131                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
132                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
133                         rgb = buf[i];i--;\r
134                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
135                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
136                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
137                         rgb = buf[i];i--;\r
138                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
139                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
140                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
141                         rgb = buf[i];i--;\r
142                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
143                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
144                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
145                         rgb = buf[i];i--;\r
146                         w_sum = (ave - (rgb & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//B\r
147                         w_sum = (ave - ((rgb >> 8) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//G\r
148                         w_sum = (ave - ((rgb >> 16) & 0xff)) ;linput[input_ptr--] = w_sum;sum += w_sum * w_sum;//R\r
149                 }\r
150                 //<差分値計算(FORの1/8展開)/>\r
151                 final double p=Math.sqrt((double) sum);\r
152                 this._pow=p!=0.0?p:0.0000001;\r
153                 return;\r
154         }\r
155 \r
156 }\r