OSDN Git Service

[Backup]NyARToolkit for Java
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Tue, 11 Aug 2009 16:15:30 +0000 (16:15 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Tue, 11 Aug 2009 16:15:30 +0000 (16:15 +0000)
新型ラベリングの強化など

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit@274 7cac0a50-4618-4814-88d0-24b83990f816

trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java
trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/RleLabelFragmentInfoStack.java
trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java
trunk/src/jp/nyatla/nyartoolkit/sample/RawFileTest.java

index 02e677d..8d412f2 100644 (file)
@@ -16,8 +16,8 @@ import jp.nyatla.nyartoolkit.core.raster.*;
 \r
 class RleElement\r
 {\r
-       short l;\r
-       short r;\r
+       int l;\r
+       int r;\r
        short id;\r
        public static RleElement[] createArray(int i_length)\r
        {\r
@@ -52,8 +52,8 @@ public class NyARLabeling_Rle
         */\r
        private int toRel(int[] i_bin_buf, int i_st, int i_len, RleElement[] i_out)\r
        {\r
-               short current = 0;\r
-               short r = -1;\r
+               int current = 0;\r
+               int r = -1;\r
                // 行確定開始\r
                int x = i_st;\r
                final int right_edge = i_st + i_len - 1;\r
@@ -64,7 +64,7 @@ public class NyARLabeling_Rle
                                continue;\r
                        }\r
                        // 暗点発見→暗点長を調べる\r
-                       r = (short) (x - i_st);\r
+                       r = (x - i_st);\r
                        i_out[current].l = r;\r
                        r++;// 暗点+1\r
                        x++;\r
@@ -93,11 +93,11 @@ public class NyARLabeling_Rle
                } else {\r
                        // 暗点→カウント中でなければl1で追加\r
                        if (r >= 0) {\r
-                               i_out[current].r = (short) (r + 1);\r
+                               i_out[current].r = (r + 1);\r
                        } else {\r
                                // 最後の1点の場合\r
-                               i_out[current].l = (short) (i_st + i_len - 1);\r
-                               i_out[current].r = (short) (i_st + i_len);\r
+                               i_out[current].l = (i_st + i_len - 1);\r
+                               i_out[current].r = (i_st + i_len);\r
                        }\r
                        current++;\r
                }\r
@@ -107,12 +107,21 @@ public class NyARLabeling_Rle
 \r
        private void addFragment(RleElement i_rel_img, short i_nof, int i_row_index, int i_rel_index,RleLabelFragmentInfoStack 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.id = i_nof;// REL毎の固有ID\r
                RleLabelFragmentInfoStack.RleLabelFragmentInfo v = o_stack.prePush();\r
                v.id = i_nof;\r
-               v.entry_x = i_rel_img.l;\r
-               v.entry_y = (short) i_row_index;\r
-               v.area = i_rel_img.r - i_rel_img.l;\r
+               v.entry_x = l;\r
+               v.area =len;\r
+               v.clip_l=l;\r
+               v.clip_r=i_rel_img.r;\r
+               v.clip_t=i_row_index;\r
+               v.clip_b=i_row_index;\r
+               v.pos_x+=len*(2*l+(len-1)*1);\r
+               v.pos_y+=i_row_index*len;\r
+\r
+               \r
                return;\r
        }\r
 \r
@@ -169,10 +178,18 @@ public class NyARLabeling_Rle
                                        final RleLabelFragmentInfoStack.RleLabelFragmentInfo id_ptr = f_array[id];\r
                                        prev_ptr = f_array[rle_prev[index_prev].id];\r
                                        rle_current[i].id = id;\r
-                                       id_ptr.area += (rle_current[i].r - rle_current[i].l);\r
-                                       // エントリポイントの情報をコピー\r
+                                       //\r
+                                       final int l= rle_current[i].l;\r
+                                       final int r= rle_current[i].r;\r
+                                       final int len=rle_current[i].r - rle_current[i].l;\r
+                                       id_ptr.area += len;\r
                                        id_ptr.entry_x = prev_ptr.entry_x;\r
-                                       id_ptr.entry_y = prev_ptr.entry_y;\r
+                                       id_ptr.clip_l=l<prev_ptr.clip_l?l:prev_ptr.clip_l;\r
+                                       id_ptr.clip_r=r>prev_ptr.clip_r?r:prev_ptr.clip_r;\r
+                                       //id_ptr.clip_tは変更無し。\r
+                                       id_ptr.clip_b=y;\r
+                                       id_ptr.pos_x+=len*(2*l+(len-1)*1);\r
+                                       id_ptr.pos_y+=y*len;\r
                                        // 多重リンクの確認\r
 \r
                                        index_prev++;\r
@@ -193,21 +210,32 @@ public class NyARLabeling_Rle
                                                        prev_ptr.area = 0;\r
                                                        // 結合対象->現在のidをインデクスにセット\r
                                                        prev_ptr.id = id;\r
-                                                       // エントリポイントを訂正\r
-                                                       if (id_ptr.entry_y > prev_ptr.entry_y) {\r
-                                                               // 現在のエントリポイントの方が下にある。(何もしない)\r
-                                                       }\r
-                                                       if (id_ptr.entry_y < prev_ptr.entry_y) {\r
-                                                               // 現在のエントリポイントの方が上にある。(エントリポイントの交換)\r
-                                                               prev_ptr.entry_y = id_ptr.entry_y;\r
-                                                               prev_ptr.entry_x = id_ptr.entry_x;\r
+                                                       //tとentry_xの決定\r
+                                                       if (id_ptr.clip_t > prev_ptr.clip_t) {\r
+                                                               // 現在の方が下にある。\r
+                                                               id_ptr.clip_t = prev_ptr.clip_t;\r
+                                                               id_ptr.entry_x = prev_ptr.entry_x;\r
+                                                       }else if (id_ptr.clip_t < prev_ptr.clip_t) {\r
+                                                               // 現在の方が上にある。なにもしない。\r
                                                        } else {\r
                                                                // 水平方向で小さい方がエントリポイント。\r
-                                                               if (id_ptr.entry_x < prev_ptr.entry_x) {\r
-                                                                       prev_ptr.entry_y = id_ptr.entry_y;\r
-                                                                       prev_ptr.entry_x = id_ptr.entry_x;\r
+                                                               if (id_ptr.entry_x > prev_ptr.entry_x) {\r
+                                                                       id_ptr.entry_x = prev_ptr.entry_x;\r
                                                                }\r
+                                                       }                                                       \r
+                                                       //bの決定(現状のまま)\r
+                                                       //lの決定\r
+                                                       if (id_ptr.clip_l > prev_ptr.clip_l) {\r
+                                                               id_ptr.clip_l=prev_ptr.clip_l;\r
                                                        }\r
+                                                       //rの決定\r
+                                                       if (id_ptr.clip_r < prev_ptr.clip_r) {\r
+                                                               id_ptr.clip_r=prev_ptr.clip_r;\r
+                                                       }\r
+                                                       id_ptr.pos_x+=prev_ptr.pos_x;\r
+                                                       id_ptr.pos_y+=prev_ptr.pos_y;                                                   \r
+                                                       \r
+\r
                                                }\r
                                                index_prev++;\r
                                        }\r
index 34c9bbf..29697c2 100644 (file)
@@ -12,12 +12,13 @@ public class RleLabelFragmentInfoStack  extends NyARLabelInfoStack<RleLabelFragm
                //継承メンバ\r
                //int area; // フラグメントラベルの領域数\r
                public short id; // フラグメントラベルのインデクス\r
-               public short entry_x; // フラグメントラベルの位置\r
-               public short entry_y; // フラグメントラベルの位置\r
-               public short clip_t;\r
-               public short clip_l;\r
-               public short clip_r;\r
-               public short clip_b;\r
+               public int entry_x; // フラグメントラベルの位置\r
+               public int clip_t;\r
+               public int clip_l;\r
+               public int clip_r;\r
+               public int clip_b;\r
+               public double pos_x;\r
+               public double pos_y;\r
        }       \r
        public RleLabelFragmentInfoStack(int i_length)\r
        {\r
index fc3212d..112092e 100644 (file)
@@ -1,5 +1,6 @@
 package jp.nyatla.nyartoolkit.core.squaredetect;\r
 \r
+\r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.INyARSquareDetector;\r
 import jp.nyatla.nyartoolkit.core.NyARSquare;\r
@@ -67,7 +68,6 @@ 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
-               // 初期化\r
 \r
                // マーカーホルダをリセット\r
                o_square_stack.clear();\r
@@ -124,7 +124,7 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector
 //                             continue;\r
 //                     }\r
                        // 輪郭を取得\r
-                       coord_num = _cpickup.getContour(i_raster,label_pt.entry_x,label_pt.entry_y, coord_max, xcoord, ycoord);\r
+                       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
index 530c57c..39c3d02 100644 (file)
@@ -87,7 +87,7 @@ public class RawFileTest
 \r
                // マーカーを検出\r
                Date d2 = new Date();\r
-               for (int i = 0; i < 100; i++) {\r
+               for (int i = 0; i < 1000; i++) {\r
                        // 変換行列を取得\r
                        ar.detectMarkerLite(ra, 100);\r
                        ar.getTransmationMatrix(result_mat);\r