2 * PROJECT: NyARToolkit(Extension)
\r
3 * --------------------------------------------------------------------------------
\r
4 * The NyARToolkit is Java edition ARToolKit class library.
\r
5 * Copyright (C)2008-2009 Ryo Iizuka
\r
7 * This program is free software: you can redistribute it and/or modify
\r
8 * it under the terms of the GNU General Public License as published by
\r
9 * the Free Software Foundation, either version 3 of the License, or
\r
10 * (at your option) any later version.
\r
12 * This program is distributed in the hope that it will be useful,
\r
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 * GNU General Public License for more details.
\r
17 * You should have received a copy of the GNU General Public License
\r
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
20 * For further information please contact.
\r
21 * http://nyatla.jp/nyatoolkit/
\r
22 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
\r
25 package jp.nyatla.nyartoolkit.rpf.tracker.nyartk;
\r
27 import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;
\r
28 import jp.nyatla.nyartoolkit.core.raster.NyARGrayscaleRaster;
\r
29 import jp.nyatla.nyartoolkit.core.squaredetect.NyARContourPickup;
\r
30 import jp.nyatla.nyartoolkit.core.types.*;
\r
34 * グレイスケールラスタに対する、特殊な画素アクセス手段を提供します。
\r
37 public class NyARVectorReader_INT1D_GRAY_8 extends NyARVectorReader_Base
\r
41 * @param i_ref_raster
\r
43 * @param i_ref_raster_distortion
\r
44 * 歪み解除オブジェクト(nullの場合歪み解除を省略)
\r
45 * @param i_ref_rob_raster
\r
49 public NyARVectorReader_INT1D_GRAY_8(NyARGrayscaleRaster i_ref_raster,NyARCameraDistortionFactor i_ref_raster_distortion,NyARGrayscaleRaster i_ref_rob_raster)
\r
52 assert (i_ref_raster.getBufferType() == NyARBufferType.INT1D_GRAY_8);
\r
53 assert (i_ref_rob_raster.getBufferType() == NyARBufferType.INT1D_GRAY_8);
\r
54 this.initInstance(i_ref_raster, i_ref_raster_distortion, i_ref_rob_raster,new NyARContourPickup());
\r
58 * 画素の4近傍の画素ベクトルを取得します。 取得可能な範囲は、Rasterの1ドット内側です。 0 ,-1, 0 0, 0, 0 0 , x,
\r
59 * 0 + -1, y,+1 0 ,+1, 0 0, 0, 0
\r
67 public void getPixelVector4(int x, int y, NyARIntPoint2d o_v)
\r
69 assert ((x > 0) && (y > 0) && (x) < this._ref_base_raster.getWidth() && (y) < this._ref_base_raster.getHeight());
\r
70 int[] buf = (int[])(this._ref_base_raster.getBuffer());
\r
71 int w = this._ref_base_raster.getWidth();
\r
72 int idx = w * y + x;
\r
73 o_v.x = (buf[idx + 1] - buf[idx - 1]) >> 1;
\r
74 o_v.y = (buf[idx + w] - buf[idx - w]) >> 1;
\r
79 * 画素の8近傍画素ベクトルを取得します。 取得可能な範囲は、Rasterの1ドット内側です。
\r
81 * 0, y, 0 + -2, x,+2
\r
90 public void getPixelVector8(int x, int y, NyARIntPoint2d o_v) {
\r
91 assert ((x > 0) && (y > 0) && (x) < this._ref_base_raster.getWidth() && (y) < this._ref_base_raster.getHeight());
\r
92 int[] buf = (int[])this._ref_base_raster.getBuffer();
\r
93 int sw = this._ref_base_raster.getWidth();
\r
94 int idx_0 = sw * y + x;
\r
95 int idx_p1 = idx_0 + sw;
\r
96 int idx_m1 = idx_0 - sw;
\r
97 int b = buf[idx_m1 - 1];
\r
98 int d = buf[idx_m1 + 1];
\r
99 int h = buf[idx_p1 - 1];
\r
100 int f = buf[idx_p1 + 1];
\r
101 o_v.x = ((buf[idx_0 + 1] - buf[idx_0 - 1]) >> 1)
\r
102 + ((d - b + f - h) >> 2);
\r
103 o_v.y = ((buf[idx_p1] - buf[idx_m1]) >> 1) + ((f - d + h - b) >> 2);
\r
108 * RECT範囲内の画素ベクトルの合計値と、ベクトルのエッジ中心を取得します。 320*240の場合、
\r
109 * RECTの範囲は(x>=0 && x<319 x+w>=0 && x+w<319),(y>=0 && y<239 x+w>=0 && x+w<319)となります。
\r
111 * ピクセル取得を行う位置を設定します。
\r
113 * ピクセル取得を行う位置を設定します。
\r
115 * ピクセル取得を行う範囲を設定します。
\r
117 * ピクセル取得を行う範囲を設定します。
\r
121 * ベクトルの強度を返します。強度値は、差分値の二乗の合計です。
\r
123 public final int getAreaVector33(int ix, int iy, int iw, int ih,NyARVecLinear2d o_posvec)
\r
125 assert (ih >= 3 && iw >= 3);
\r
126 assert ((ix >= 0) && (iy >= 0) && (ix + iw) <= this._ref_base_raster.getWidth() && (iy + ih) <= this._ref_base_raster.getHeight());
\r
127 int[] buf =(int[])this._ref_base_raster.getBuffer();
\r
128 int stride =this._ref_base_raster.getWidth();
\r
129 // x=(Σ|Vx|*Xn)/n,y=(Σ|Vy|*Yn)/n
\r
130 // x=(ΣVx)^2/(ΣVx+ΣVy)^2,y=(ΣVy)^2/(ΣVx+ΣVy)^2
\r
131 int sum_x, sum_y, sum_wx, sum_wy, sum_vx, sum_vy;
\r
132 sum_x = sum_y = sum_wx = sum_wy = sum_vx = sum_vy = 0;
\r
135 for (int i = ih - 3; i >= 0; i--) {
\r
136 int idx_0 = stride * (i + 1 + iy) + (iw - 3 + 1 + ix);
\r
137 for (int i2 = lw; i2 >= 0; i2--){
\r
139 int idx_p1 = idx_0 + stride;
\r
140 int idx_m1 = idx_0 - stride;
\r
141 int b = buf[idx_m1 - 1];
\r
142 int d = buf[idx_m1 + 1];
\r
143 int h = buf[idx_p1 - 1];
\r
144 int f = buf[idx_p1 + 1];
\r
145 vx = ((buf[idx_0 + 1] - buf[idx_0 - 1]) >> 1)+ ((d - b + f - h) >> 2);
\r
146 vy = ((buf[idx_p1] - buf[idx_m1]) >> 1)+ ((f - d + h - b) >> 2);
\r
152 sum_wx += wx; //加重値
\r
153 sum_wy += wy; //加重値
\r
154 sum_vx += wx * vx; //加重*ベクトルの積
\r
155 sum_vy += wy * vy; //加重*ベクトルの積
\r
156 sum_x += wx * (i2 + 1);//位置
\r
157 sum_y += wy * (i + 1); //
\r
163 xx = ix + (iw >> 1);
\r
166 xx = ix+(double) sum_x / sum_wx;
\r
167 o_posvec.dx = (double) sum_vx / sum_wx;
\r
170 yy = iy + (ih >> 1);
\r
173 yy = iy+(double) sum_y / sum_wy;
\r
174 o_posvec.dy = (double) sum_vy / sum_wy;
\r
177 if(this._factor!=null){
\r
178 this._factor.observ2Ideal(xx, yy, o_posvec);
\r
184 return sum_wx+sum_wy;
\r
186 public final int getAreaVector22(int ix, int iy, int iw, int ih,NyARVecLinear2d o_posvec)
\r
188 assert (ih >= 3 && iw >= 3);
\r
189 assert ((ix >= 0) && (iy >= 0) && (ix + iw) <= this._ref_base_raster.getWidth() && (iy + ih) <= this._ref_base_raster.getHeight());
\r
190 int[] buf =(int[])this._ref_base_raster.getBuffer();
\r
191 int stride =this._ref_base_raster.getWidth();
\r
192 int sum_x, sum_y, sum_wx, sum_wy, sum_vx, sum_vy;
\r
193 sum_x = sum_y = sum_wx = sum_wy = sum_vx = sum_vy = 0;
\r
196 for (int i = 0; i<ih-1; i++) {
\r
197 int idx_0 = stride * (i+iy) + ix+1;
\r
198 int a=buf[idx_0-1];
\r
200 int c=buf[idx_0+stride-1];
\r
201 int d=buf[idx_0+stride];
\r
202 for (int i2 = 0; i2<ll; i2++){
\r
210 d=buf[idx_0+stride];
\r
214 sum_wx += wx; //加重値
\r
215 sum_vx += wx * vx; //加重*ベクトルの積
\r
216 sum_x += wx * i2;//位置
\r
219 sum_wy += wy; //加重値
\r
220 sum_vy += wy * vy; //加重*ベクトルの積
\r
221 sum_y += wy * i; //
\r
227 xx = ix + (iw >> 1);
\r
230 xx = ix+(double) sum_x / sum_wx;
\r
231 o_posvec.dx = (double) sum_vx / sum_wx;
\r
234 yy = iy + (ih >> 1);
\r
237 yy = iy+(double) sum_y / sum_wy;
\r
238 o_posvec.dy = (double) sum_vy / sum_wy;
\r
241 if(this._factor!=null){
\r
242 this._factor.observ2Ideal(xx, yy, o_posvec);
\r
248 return sum_wx+sum_wy;
\r