1 package jp.nyatla.nyartoolkit.utils;
\r
3 import jp.nyatla.nyartoolkit.NyARException;
\r
4 import jp.nyatla.nyartoolkit.core.param.*;
\r
5 import jp.nyatla.nyartoolkit.core.pickup.*;
\r
6 import jp.nyatla.nyartoolkit.core.raster.rgb.*;
\r
7 import jp.nyatla.nyartoolkit.core.transmat.*;
\r
8 import jp.nyatla.nyartoolkit.core.types.*;
\r
9 import jp.nyatla.nyartoolkit.core.rasterreader.*;
\r
12 * このクラスは、姿勢変換行列を使用してマーカの周辺領域からパターンを取得する機能を持つラスタです。
\r
13 * 画像の画素形式は、{@link NyARBufferType#INT1D_X8R8G8B8_32}形式のです。
\r
14 * このクラスは試験的であり、異なる解像度のパターンを取得することや、異なる画素形式へ画像を出力する事ができません。
\r
15 * {@link NyARPerspectiveRasterReader}クラスの使用を検討してください。
\r
17 class TransformedBitmapPickup extends NyARColorPatt_Perspective_O2
\r
19 private NyARIntPoint2d[] _work_points = NyARIntPoint2d.createArray(4);
\r
20 private NyARPerspectiveProjectionMatrix _ref_perspective;
\r
23 * 射影変換パラメータ、ラスタサイズ、サンプリング解像度からインスタンスを生成します。
\r
24 * @param i_ref_cparam
\r
30 * @param i_resolution
\r
31 * ピクセルあたりのサンプリング解像度。1なら出力1ピクセルにつき1ピクセル、2なら1ピクセルにつき4ピクセル(2x2)をサンプリングします。
\r
32 * 小さい画像では数値が大きいほど良い結果が得られますが、時間がかかります。
\r
34 public TransformedBitmapPickup(NyARPerspectiveProjectionMatrix i_ref_cparam, int i_width, int i_height, int i_resolution)
\r
37 super(i_width, i_height, i_resolution, 0,NyARBufferType.NULL_ALLZERO);
\r
38 this._ref_perspective = i_ref_cparam;
\r
42 * この関数は、姿勢変換行列i_base_matで示される平面の矩形(i_l,i_t,i_r,i_b)から、ビットマップを読み出します。
\r
43 * 例えば、8cmマーカでRECT(i_l,i_t,i_r,i_b)に-40,0,0,-40.0を指定すると、マーカの左下部分の画像を抽出します。
\r
44 * マーカから離れた場所になるほど、また、マーカの鉛直方向から外れるほど誤差が大きくなります。
\r
46 * This function gets bitmap from the area defined by RECT(i_l,i_t,i_r,i_b) above transform matrix i_base_mat.
\r
47 * @param i_src_imege
\r
50 * 基準点からの左上の相対座標(x)を指定します。
\r
52 * 基準点からの左上の相対座標(y)を指定します。
\r
54 * 基準点からの右下の相対座標(x)を指定します。
\r
56 * 基準点からの右下の相対座標(y)を指定します。
\r
58 * 平面の姿勢を示す行列です。マーカ姿勢を指定することで、マーカの表面を指定することができます。
\r
60 * 画像の取得に成功するとtrueを返します。
\r
62 public boolean pickupImage2d(INyARRgbRaster i_src_imege, double i_l, double i_t, double i_r, double i_b, NyARTransMatResult i_base_mat) throws NyARException
\r
64 double cp00, cp01, cp02, cp11, cp12;
\r
65 cp00 = this._ref_perspective.m00;
\r
66 cp01 = this._ref_perspective.m01;
\r
67 cp02 = this._ref_perspective.m02;
\r
68 cp11 = this._ref_perspective.m11;
\r
69 cp12 = this._ref_perspective.m12;
\r
70 //マーカと同一平面上にある矩形の4個の頂点を座標変換して、射影変換して画面上の
\r
72 //[hX,hY,h]=[P][RT][x,y,z]
\r
75 NyARIntPoint2d[] poinsts = this._work_points;
\r
80 double m00=i_base_mat.m00;
\r
81 double m10=i_base_mat.m10;
\r
82 double m20=i_base_mat.m20;
\r
85 yt0=i_base_mat.m01 * i_t+i_base_mat.m03;
\r
86 yt1=i_base_mat.m11 * i_t+i_base_mat.m13;
\r
87 yt2=i_base_mat.m21 * i_t+i_base_mat.m23;
\r
89 x3 = m00 * i_l + yt0;
\r
90 y3 = m10 * i_l + yt1;
\r
91 z3 = m20 * i_l + yt2;
\r
92 poinsts[0].x = (int) ((x3 * cp00 + y3 * cp01 + z3 * cp02) / z3);
\r
93 poinsts[0].y = (int) ((y3 * cp11 + z3 * cp12) / z3);
\r
95 x3 = m00 * i_r + yt0;
\r
96 y3 = m10 * i_r + yt1;
\r
97 z3 = m20 * i_r + yt2;
\r
98 poinsts[1].x = (int) ((x3 * cp00 + y3 * cp01 + z3 * cp02) / z3);
\r
99 poinsts[1].y = (int) ((y3 * cp11 + z3 * cp12) / z3);
\r
102 yt0=i_base_mat.m01 * i_b+i_base_mat.m03;
\r
103 yt1=i_base_mat.m11 * i_b+i_base_mat.m13;
\r
104 yt2=i_base_mat.m21 * i_b+i_base_mat.m23;
\r
107 x3 = m00 * i_r + yt0;
\r
108 y3 = m10 * i_r + yt1;
\r
109 z3 = m20 * i_r + yt2;
\r
110 poinsts[2].x = (int) ((x3 * cp00 + y3 * cp01 + z3 * cp02) / z3);
\r
111 poinsts[2].y = (int) ((y3 * cp11 + z3 * cp12) / z3);
\r
113 x3 = m00 * i_l + yt0;
\r
114 y3 = m10 * i_l + yt1;
\r
115 z3 = m20 * i_l + yt2;
\r
116 poinsts[3].x = (int) ((x3 * cp00 + y3 * cp01 + z3 * cp02) / z3);
\r
117 poinsts[3].y = (int) ((y3 * cp11 + z3 * cp12) / z3);
\r
118 return this.pickFromRaster(i_src_imege, poinsts);
\r