OSDN Git Service

[Backup]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / squaredetect / NyARSquareDetector_Rle.java
index 112092e..a94189c 100644 (file)
@@ -1,10 +1,13 @@
 package jp.nyatla.nyartoolkit.core.squaredetect;\r
 \r
 \r
+import java.util.Date;\r
+\r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.INyARSquareDetector;\r
 import jp.nyatla.nyartoolkit.core.NyARSquare;\r
 import jp.nyatla.nyartoolkit.core.NyARSquareStack;\r
+import jp.nyatla.nyartoolkit.core.labeling.LabelOverlapChecker;\r
 import jp.nyatla.nyartoolkit.core.labeling.rlelabeling.*;\r
 import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;\r
 import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
@@ -21,14 +24,14 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector
 \r
        private final NyARLabeling_Rle _labeling;\r
 \r
-       private final LabelOverlapChecker _overlap_checker = new LabelOverlapChecker(32);\r
+       private final LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo> _overlap_checker = new LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo>(32,RleLabelFragmentInfoStack.RleLabelFragmentInfo.class);\r
        private final SquareContourDetector _sqconvertor;\r
        private final ContourPickup _cpickup=new ContourPickup();\r
        private final RleLabelFragmentInfoStack _stack;\r
        \r
        private final int _max_coord;\r
        private final int[] _xcoord;\r
-       private final int[] _ycoord;    \r
+       private final int[] _ycoord;\r
        /**\r
         * 最大i_squre_max個のマーカーを検出するクラスを作成する。\r
         * \r
@@ -42,7 +45,7 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector
                //領域を取りたくない場合は、i_dist_factor_refの値をそのまま使ってください。\r
                this._labeling = new NyARLabeling_Rle(this._width);\r
                this._sqconvertor=new SquareContourDetector(i_size,i_dist_factor_ref);\r
-               this._stack=new RleLabelFragmentInfoStack(1024);//検出可能な最大ラベル数\r
+               this._stack=new RleLabelFragmentInfoStack(i_size.w*i_size.h*2048/(320*240)+32);//検出可能な最大ラベル数\r
                \r
 \r
                // 輪郭の最大長は画面に映りうる最大の長方形サイズ。\r
@@ -68,22 +71,17 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector
        public final void detectMarker(NyARBinRaster i_raster, NyARSquareStack o_square_stack) throws NyARException\r
        {\r
                final RleLabelFragmentInfoStack flagment=this._stack;\r
+               final LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo> overlap = this._overlap_checker;\r
 \r
                // マーカーホルダをリセット\r
                o_square_stack.clear();\r
 \r
-               // ラベリング\r
-               this._labeling.labeling(i_raster, 0, i_raster.getHeight(), flagment);\r
-\r
-               // ラベル数が0ならここまで\r
-               final int label_num = flagment.getLength();\r
+               // ラベル数が0ならここまで(Labeling内部でソートするようにした。)\r
+               final int label_num=this._labeling.labeling(i_raster, 0, i_raster.getHeight(), flagment);\r
                if (label_num < 1) {\r
                        return;\r
                }\r
-               \r
-               \r
                // ラベルを大きい順に整列\r
-               flagment.sortByArea();\r
                RleLabelFragmentInfoStack.RleLabelFragmentInfo[] labels=flagment.getArray();\r
 \r
                // デカいラベルを読み飛ばし\r
@@ -95,36 +93,38 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector
                        }\r
                }\r
 \r
+               final int xsize = this._width;\r
+               final int ysize = this._height;\r
                final int[] xcoord = this._xcoord;\r
                final int[] ycoord = this._ycoord;\r
                final int coord_max = this._max_coord;\r
-               int coord_num;\r
-               int label_area;\r
 \r
                //重なりチェッカの最大数を設定\r
-//             overlap.setMaxlabel(label_num);\r
+               overlap.setMaxLabels(label_num);\r
 \r
                for (; i < label_num; i++) {\r
                        final RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt=labels[i];\r
-                       label_area = label_pt.area;\r
+                       final int label_area = label_pt.area;\r
                        // 検査対象サイズよりも小さくなったら終了\r
-                       if (label_area < AR_AREA_MIN) {\r
+                       if (label_pt.area < AR_AREA_MIN) {\r
                                break;\r
                        }\r
-//                     // クリップ領域が画面の枠に接していれば除外\r
-//                     if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){\r
-//                             continue;\r
-//                     }\r
-//                     if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){\r
-//                             continue;\r
-//                     }\r
-//                     // 既に検出された矩形との重なりを確認\r
-//                     if (!overlap.check(label_pt)) {\r
-//                             // 重なっているようだ。\r
-//                             continue;\r
-//                     }\r
+               \r
+                       // クリップ領域が画面の枠に接していれば除外\r
+                       if (label_pt.clip_l == 0 || label_pt.clip_r == xsize-1){\r
+                               continue;\r
+                       }\r
+                       if (label_pt.clip_t == 0 || label_pt.clip_b == ysize-1){\r
+                               continue;\r
+                       }\r
+                       // 既に検出された矩形との重なりを確認\r
+                       if (!overlap.check(label_pt)) {\r
+                               // 重なっているようだ。\r
+                               continue;\r
+                       }\r
+                       \r
                        // 輪郭を取得\r
-                       coord_num = _cpickup.getContour(i_raster,label_pt.entry_x,label_pt.clip_t, coord_max, xcoord, ycoord);\r
+                       final int coord_num = _cpickup.getContour(i_raster,label_pt.entry_x,label_pt.clip_t, coord_max, xcoord, ycoord);\r
                        if (coord_num == coord_max) {\r
                                // 輪郭が大きすぎる。\r
                                continue;\r
@@ -139,10 +139,18 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector
                                continue;                               \r
                        }\r
                        // 検出済の矩形の属したラベルを重なりチェックに追加する。\r
-//                     overlap.push(label_pt);\r
-               }       \r
+                       overlap.push(label_pt);\r
+               }\r
                return;\r
        }\r
+       /**\r
+        * デバック用API\r
+        * @return\r
+        */\r
+       public RleLabelFragmentInfoStack _getFragmentStack()\r
+       {\r
+               return this._stack;\r
+       }\r
 \r
 }\r
 \r