OSDN Git Service

[Backup]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / labeling / rlelabeling / NyARLabeling_Rle.java
index e01843c..a1b71db 100644 (file)
@@ -27,9 +27,33 @@ package jp.nyatla.nyartoolkit.core.labeling.rlelabeling;
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.utils.*;\r
 \r
+class RleInfoStack extends NyObjectStack<RleInfoStack.RleInfo>\r
+{\r
+       public class RleInfo\r
+       {\r
+               //継承メンバ\r
+               public int entry_x; // フラグメントラベルの位置\r
+               public int area;\r
+               public int clip_r;\r
+               public int clip_l;\r
+               public int clip_b;\r
+               public int clip_t;\r
+               public long pos_x;\r
+               public long pos_y;              \r
+       }       \r
+       public RleInfoStack(int i_length)\r
+       {\r
+               super(i_length, RleInfoStack.RleInfo.class);\r
+               return;\r
+       }\r
 \r
-\r
+       protected RleInfoStack.RleInfo createElement()\r
+       {\r
+               return new RleInfoStack.RleInfo();\r
+       }\r
+}\r
 /**\r
  * [strage class]\r
  */\r
@@ -53,14 +77,33 @@ class RleElement
 // RleImageをラベリングする。\r
 public class NyARLabeling_Rle\r
 {\r
+       private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000\r
+       private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70\r
+       \r
+       private RleInfoStack _rlestack;\r
        private RleElement[] _rle1;\r
-\r
        private RleElement[] _rle2;\r
+       private int _max_area;\r
+       private int _min_area;\r
 \r
-       public NyARLabeling_Rle(int i_width)\r
+       public NyARLabeling_Rle(int i_width,int i_height)\r
        {\r
+               this._rlestack=new RleInfoStack(i_width*i_height*2048/(320*240)+32);\r
                this._rle1 = RleElement.createArray(i_width/2+1);\r
                this._rle2 = RleElement.createArray(i_width/2+1);\r
+               setAreaRange(AR_AREA_MAX,AR_AREA_MIN);\r
+\r
+               return;\r
+       }\r
+       /**\r
+        * 対象サイズ\r
+        * @param i_max\r
+        * @param i_min\r
+        */\r
+       public void setAreaRange(int i_max,int i_min)\r
+       {\r
+               this._max_area=i_max;\r
+               this._min_area=i_min;\r
                return;\r
        }\r
 \r
@@ -124,12 +167,12 @@ public class NyARLabeling_Rle
                return current;\r
        }\r
 \r
-       private void addFragment(RleElement i_rel_img, int i_nof, int i_row_index, int i_rel_index,RleLabelFragmentInfoStack o_stack) throws NyARException\r
+       private void addFragment(RleElement i_rel_img, int i_nof, int i_row_index, int i_rel_index,RleInfoStack o_stack) throws NyARException\r
        {\r
                int l=i_rel_img.l;\r
                final int len=i_rel_img.r - l;\r
                i_rel_img.fid = i_nof;// REL毎の固有ID\r
-               RleLabelFragmentInfoStack.RleLabelFragmentInfo v = o_stack.prePush();\r
+               RleInfoStack.RleInfo v = o_stack.prePush();\r
                v.entry_x = l;\r
                v.area =len;\r
                v.clip_l=l;\r
@@ -146,7 +189,9 @@ public class NyARLabeling_Rle
        public int labeling(NyARBinRaster i_bin_raster, int i_top, int i_bottom,RleLabelFragmentInfoStack o_stack) throws NyARException\r
        {\r
                // リセット処理\r
-               o_stack.clear();\r
+               final RleInfoStack rlestack=this._rlestack;\r
+               rlestack.clear();\r
+\r
                //\r
                RleElement[] rle_prev = this._rle1;\r
                RleElement[] rle_current = this._rle2;\r
@@ -162,12 +207,12 @@ public class NyARLabeling_Rle
                len_prev = toRel(in_buf, i_top, width, rle_prev);\r
                for (int i = 0; i < len_prev; i++) {\r
                        // フラグメントID=フラグメント初期値、POS=Y値、RELインデクス=行\r
-                       addFragment(rle_prev[i], id_max, i_top, i,o_stack);\r
+                       addFragment(rle_prev[i], id_max, i_top, i,rlestack);\r
                        id_max++;\r
                        // nofの最大値チェック\r
                        label_count++;\r
                }\r
-               RleLabelFragmentInfoStack.RleLabelFragmentInfo[] f_array = o_stack.getArray();\r
+               RleInfoStack.RleInfo[] f_array = rlestack.getArray();\r
                // 次段結合\r
                for (int y = i_top + 1; y < i_bottom; y++) {\r
                        // カレント行の読込\r
@@ -185,14 +230,14 @@ public class NyARLabeling_Rle
                                                continue;\r
                                        } else if (rle_prev[index_prev].l - rle_current[i].r > 0) {// 0なら8方位ラベリングになる\r
                                                // prevがcur右方にある→独立フラグメント\r
-                                               addFragment(rle_current[i], id_max, y, i,o_stack);\r
+                                               addFragment(rle_current[i], id_max, y, i,rlestack);\r
                                                id_max++;\r
                                                label_count++;\r
                                                // 次のindexをしらべる\r
                                                continue SCAN_CUR;\r
                                        }\r
                                        id=rle_prev[index_prev].fid;//ルートフラグメントid\r
-                                       RleLabelFragmentInfoStack.RleLabelFragmentInfo id_ptr = f_array[id];\r
+                                       RleInfoStack.RleInfo id_ptr = f_array[id];\r
                                        //結合対象(初回)->prevのIDをコピーして、ルートフラグメントの情報を更新\r
                                        rle_current[i].fid = id;//フラグメントIDを保存\r
                                        //\r
@@ -222,7 +267,7 @@ public class NyARLabeling_Rle
                                                \r
                                                //結合するルートフラグメントを取得\r
                                                final int prev_id =rle_prev[index_prev].fid;\r
-                                               RleLabelFragmentInfoStack.RleLabelFragmentInfo prev_ptr = f_array[prev_id];\r
+                                               RleInfoStack.RleInfo prev_ptr = f_array[prev_id];\r
                                                if (id != prev_id){\r
                                                        label_count--;\r
                                                        //prevとcurrentのフラグメントidを書き換える。\r
@@ -282,7 +327,7 @@ public class NyARLabeling_Rle
                                // curにidが割り当てられたかを確認\r
                                // 右端独立フラグメントを追加\r
                                if (id < 0){\r
-                                       addFragment(rle_current[i], id_max, y, i,o_stack);\r
+                                       addFragment(rle_current[i], id_max, y, i,rlestack);\r
                                        id_max++;\r
                                        label_count++;\r
                                }\r
@@ -293,18 +338,34 @@ public class NyARLabeling_Rle
                        len_prev = len_current;\r
                        rle_current = tmp;\r
                }\r
-               //ソートする。\r
-               o_stack.sortByArea();\r
-               //ラベル数を再設定\r
+               //対象のラベルだけ転写\r
                o_stack.reserv(label_count);\r
-               //posを計算\r
-               for(int i=0;i<label_count;i++){\r
-                       final RleLabelFragmentInfoStack.RleLabelFragmentInfo tmp=f_array[i];\r
-                       tmp.pos_x/=tmp.area;\r
-                       tmp.pos_y/=tmp.area;\r
+               RleLabelFragmentInfoStack.RleLabelFragmentInfo[] o_dest_array=o_stack.getArray();\r
+               final int max=this._max_area;\r
+               final int min=this._min_area;\r
+               int active_labels=0;\r
+               for(int i=id_max-1;i>=0;i--){\r
+                       final int area=f_array[i].area;\r
+                       if(area<min || area>max){//対象外のエリア0のもminではじく\r
+                               continue;\r
+                       }\r
+                       //\r
+                       final RleInfoStack.RleInfo src_info=f_array[i];\r
+                       final RleLabelFragmentInfoStack.RleLabelFragmentInfo dest_info=o_dest_array[active_labels];\r
+                       dest_info.area=area;\r
+                       dest_info.clip_b=src_info.clip_b;\r
+                       dest_info.clip_r=src_info.clip_r;\r
+                       dest_info.clip_t=src_info.clip_t;\r
+                       dest_info.clip_l=src_info.clip_l;\r
+                       dest_info.entry_x=src_info.entry_x;\r
+                       dest_info.pos_x=src_info.pos_x/src_info.area;\r
+                       dest_info.pos_y=src_info.pos_y/src_info.area;\r
+                       active_labels++;\r
                }\r
+               //ラベル数を再設定\r
+               o_stack.pops(label_count-active_labels);\r
                //ラベル数を返却\r
-               return label_count;\r
+               return active_labels;\r
        }       \r
 }\r
 \r