OSDN Git Service

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit/trunk@808 7cac0...
[nyartoolkit-and/nyartoolkit-and.git] / lib / src.rpf / jp / nyatla / nyartoolkit / rpf / sampler / lrlabel / LowResolutionLabelingSampler.java
1 package jp.nyatla.nyartoolkit.rpf.sampler.lrlabel;\r
2 \r
3 import jp.nyatla.nyartoolkit.*;\r
4 import jp.nyatla.nyartoolkit.core.labeling.rlelabeling.*;\r
5 import jp.nyatla.nyartoolkit.core.raster.*;\r
6 import jp.nyatla.nyartoolkit.rpf.tracker.nyartk.*;\r
7 \r
8 \r
9 \r
10 \r
11 \r
12 /**\r
13  * 画像データのサンプラです。画像データから、輪郭線抽出のヒントを計算して、出力コンテナに格納します。\r
14  * 入力-LowResolutionLabelingSamplerIn\r
15  * 出力-LowResolutionLabelingSamplerOut\r
16  */\r
17 /**\r
18  * このクラスは、{@link NyARTracker}が使う、ラべリングクラスです。\r
19  * 1/2^nに縮尺した画像をラべリングして、元画像の解像度でラベルデータを返します。\r
20  * このクラスに入力されるデータは縮尺されたエッジ画像のため、その為のパラメータ調整がしてあります。\r
21  */\r
22 public class LowResolutionLabelingSampler\r
23 {\r
24         /**\r
25          * 1/n画像のラべリングをするクラス。\r
26          */\r
27         private class Main_Labeling extends NyARLabeling_Rle\r
28         {\r
29                 private int _pix;\r
30                 public int current_th;\r
31                 public LowResolutionLabelingSamplerOut current_output;\r
32                 public Main_Labeling(int i_width,int i_height,int i_pix_base) throws NyARException\r
33                 {\r
34                         super(i_width,i_height);\r
35                         this._pix=i_pix_base;\r
36                 }\r
37                 /**\r
38                  * @Override\r
39                  */\r
40                 protected void onLabelFound(NyARRleLabelFragmentInfo iRefLabel)throws NyARException\r
41                 {\r
42                         //widthとheightの計算\r
43                         int w=iRefLabel.clip_r-iRefLabel.clip_l;\r
44                         int h=iRefLabel.clip_b-iRefLabel.clip_t;\r
45                         //1*1(1bitPixelの5*5)以下の場合は、検出不能\r
46                         //未実装部分:2*2(1bitPixelの8*8)以下の場合は、解像度1で再検出\r
47                         //未実装部分:3*3,4*4(1bitPixelの12*12,16*16)以下の場合は、解像度2で再検出\r
48                         if(w<10 || h<10){\r
49                                 //今のところは再検出機構なし。\r
50                                 return;\r
51                         }\r
52                         LowResolutionLabelingSamplerOut.Item item=current_output.prePush();\r
53                         if(item==null){\r
54                                 return;\r
55                         }\r
56                         int pix=this._pix;\r
57                         item.entry_pos.x=iRefLabel.entry_x;\r
58                         item.entry_pos.y=iRefLabel.clip_t;\r
59                         item.base_area.x=iRefLabel.clip_l*pix;\r
60                         item.base_area.y=iRefLabel.clip_t*pix;\r
61                         item.base_area.w=w*pix;\r
62                         item.base_area.h=h*pix;\r
63                         item.base_area_center.x=item.base_area.x+item.base_area.w/2;\r
64                         item.base_area_center.y=item.base_area.y+item.base_area.h/2;\r
65                         item.base_area_sq_diagonal=(w*w+h*h)*(pix*pix);\r
66                         item.lebeling_th=this.current_th;\r
67                 }\r
68                 \r
69         }\r
70         private Main_Labeling _main_labeling;\r
71         /**\r
72          * コンストラクタです。\r
73          * 入力画像解像度と、サンプリングパラメータを指定して、インスタンスを初期化します。\r
74          * @param i_width\r
75          * サンプリングするラスタの解像度\r
76          * @param i_height\r
77          * サンプリングするラスタの解像度\r
78          * @param i_pix_size\r
79          * 座標系の倍率係数。\r
80          * 例えば1/2画像(面積1/4)のサンプリング結果を元画像サイズに戻すときは、2を指定する。\r
81          * @throws NyARException\r
82          */\r
83         public LowResolutionLabelingSampler(int i_width,int i_height,int i_pix_size) throws NyARException\r
84         {\r
85                 this._main_labeling=new Main_Labeling(i_width/i_pix_size,i_height/i_pix_size,i_pix_size);\r
86         }\r
87         /**\r
88          * この関数は、入力ラスタをサンプリングして、o_outにラベル情報を出力します。\r
89          * @param i_in\r
90          * 入力元のデータです。\r
91          * @param i_th\r
92          * ラべリングの敷居値です。\r
93          * @param o_out\r
94          * 出力先のデータです。\r
95          * オブジェクトのデータは、初期化されます。\r
96          * @throws NyARException\r
97          */\r
98         public void sampling(NyARGrayscaleRaster i_in,int i_th,LowResolutionLabelingSamplerOut o_out) throws NyARException\r
99         {\r
100                 //クラスのパラメータ初期化\r
101                 Main_Labeling lb=this._main_labeling;\r
102                 lb.current_output=o_out;\r
103                 lb.current_th=i_th;\r
104 \r
105 \r
106                 //パラメータの設定\r
107                 o_out.initializeParams();\r
108                 //ラべリング\r
109                 lb.setAreaRange(10000,3);\r
110                 lb.labeling(i_in,i_th);\r
111         }\r
112 }