OSDN Git Service

[NyARToolKit for java]update document
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / utils / TransformedBitmapPickup.java
1 package jp.nyatla.nyartoolkit.utils;\r
2 \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
10 \r
11 /**\r
12  * このクラスは、姿勢変換行列を使用してマーカの周辺領域からパターンを取得する機能を持つラスタです。\r
13  * 画像の画素形式は、{@link NyARBufferType#INT1D_X8R8G8B8_32}形式のです。\r
14  * このクラスは試験的であり、異なる解像度のパターンを取得することや、異なる画素形式へ画像を出力する事ができません。\r
15  * {@link NyARPerspectiveRasterReader}クラスの使用を検討してください。\r
16  */\r
17 class TransformedBitmapPickup extends NyARColorPatt_Perspective_O2\r
18 {\r
19         private NyARIntPoint2d[] _work_points = NyARIntPoint2d.createArray(4);\r
20         private NyARPerspectiveProjectionMatrix _ref_perspective;\r
21         /**\r
22          * コンストラクタです。\r
23          * 射影変換パラメータ、ラスタサイズ、サンプリング解像度からインスタンスを生成します。\r
24          * @param i_ref_cparam\r
25          * 射影変換パラメータの参照値\r
26          * @param i_width\r
27          * ラスタの幅\r
28          * @param i_height\r
29          * ラスタの高さ\r
30          * @param i_resolution\r
31          * ピクセルあたりのサンプリング解像度。1なら出力1ピクセルにつき1ピクセル、2なら1ピクセルにつき4ピクセル(2x2)をサンプリングします。\r
32          * 小さい画像では数値が大きいほど良い結果が得られますが、時間がかかります。\r
33          */\r
34         public TransformedBitmapPickup(NyARPerspectiveProjectionMatrix i_ref_cparam, int i_width, int i_height, int i_resolution)\r
35         {\r
36                 //ANYラスタで構築\r
37                 super(i_width, i_height, i_resolution, 0,NyARBufferType.NULL_ALLZERO);\r
38                 this._ref_perspective = i_ref_cparam;\r
39         }\r
40 \r
41         /**\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
45          * ----\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
48          * 詠み出し元の画像を指定します。\r
49          * @param i_l\r
50          * 基準点からの左上の相対座標(x)を指定します。\r
51          * @param i_t\r
52          * 基準点からの左上の相対座標(y)を指定します。\r
53          * @param i_r\r
54          * 基準点からの右下の相対座標(x)を指定します。\r
55          * @param i_b\r
56          * 基準点からの右下の相対座標(y)を指定します。\r
57          * @param i_base_mat\r
58          * 平面の姿勢を示す行列です。マーカ姿勢を指定することで、マーカの表面を指定することができます。\r
59          * @return\r
60          * 画像の取得に成功するとtrueを返します。\r
61          */\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
63         {\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
71                 //頂点を計算する。\r
72                 //[hX,hY,h]=[P][RT][x,y,z]\r
73 \r
74                 //出力先\r
75                 NyARIntPoint2d[] poinsts = this._work_points;           \r
76                 \r
77                 double yt0,yt1,yt2;\r
78                 double x3, y3, z3;\r
79                 \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
83                 \r
84                 //yとtの要素を先に計算\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
88                 // l,t\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
94                 // r,t\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
100 \r
101                 //yとtの要素を先に計算\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
105 \r
106                 // r,b\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
112                 // l,b\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
119         }\r
120 }