OSDN Git Service

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit/trunk@802 7cac0...
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / core / match / NyARMatchPattDeviationBlackWhiteData.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.types.*;\r
36 \r
37 \r
38 /**\r
39  * このクラスは、グレースケールの差分画像を格納します。\r
40  * 差分画像は、p[i]=((255-画素[i])-画像全体の平均値)のピクセルで構成されている、平均値との差分値です。\r
41  * {@link NyARMatchPatt_BlackWhite}の入力値と使います。\r
42  * <p>使い方 - \r
43  * {@link #setRaster}関数で、差分画像を作成し、プロパティ取得関数でその情報を得ます。\r
44  * </p>\r
45  */\r
46 public class NyARMatchPattDeviationBlackWhiteData\r
47 {\r
48         private int[] _data;\r
49         private double _pow;\r
50         //\r
51         private int _number_of_pixels;\r
52         /**\r
53          * この関数は、画素データを格納した配列を返します。\r
54          * {@link NyARMatchPatt_BlackWhite#evaluate}関数から使います。\r
55          */\r
56         public int[] refData()\r
57         {\r
58                 return this._data;\r
59         }\r
60         /**\r
61          * この関数は、差分画像の強度値を返します。\r
62          * 強度値は、差分画像の画素を二乗した値の合計です。\r
63          * @return\r
64          * 0&lt;nの強度値。\r
65          */\r
66         public double getPow()\r
67         {\r
68                 return this._pow;\r
69         }\r
70         /**\r
71          * コンストラクタです。\r
72          * 差分画像のサイズを指定して、インスタンスを生成します。\r
73          * @param i_width\r
74          * 差分画像のサイズ\r
75          * @param i_height\r
76          * 差分画像のサイズ\r
77          */\r
78         public NyARMatchPattDeviationBlackWhiteData(int i_width,int i_height)\r
79         {\r
80                 this._number_of_pixels=i_height*i_width;\r
81                 this._data=new int[this._number_of_pixels];\r
82                 return;\r
83         }\r
84         /**\r
85          * この関数は、ラスタから差分画像を生成して、格納します。\r
86          * 制限事項として、{@link NyARBufferType#INT1D_X8R8G8B8_32}形式のラスタのみ、入力できます。\r
87          * @param i_buffer\r
88          * 差分画像の元画像。サイズは、このインスタンスと同じである必要があります。\r
89          */\r
90         public void setRaster(INyARRaster i_raster)\r
91         {\r
92                 //i_buffer[XRGB]→差分[BW]変換                     \r
93                 int i;\r
94                 int ave;//<PV/>\r
95                 int rgb;//<PV/>\r
96                 final int[] linput=this._data;//<PV/>\r
97                 final int[] buf=(int[])i_raster.getBuffer();\r
98 \r
99                 // input配列のサイズとwhも更新// input=new int[height][width][3];\r
100                 final int number_of_pixels=this._number_of_pixels;\r
101 \r
102                 //<平均値計算(FORの1/8展開)/>\r
103                 ave = 0;\r
104                 for(i=number_of_pixels-1;i>=0;i--){\r
105                         rgb = buf[i];\r
106                         ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);\r
107                 }\r
108                 ave=(number_of_pixels*255*3-ave)/(3*number_of_pixels);\r
109                 //\r
110                 int sum = 0,w_sum;\r
111                 \r
112                 //<差分値計算/>\r
113                 for (i = number_of_pixels-1; i >= 0;i--) {\r
114                         rgb = buf[i];\r
115                         w_sum =((255*3-(rgb & 0xff)-((rgb >> 8) & 0xff)-((rgb >> 16) & 0xff))/3)-ave;\r
116                         linput[i] = w_sum;\r
117                         sum += w_sum * w_sum;\r
118                 }\r
119                 final double p=Math.sqrt((double) sum);\r
120                 this._pow=p!=0.0?p:0.0000001;\r
121                 return;\r
122         }\r
123 }\r