From e717b0551b909432fcbf934eca2e94f5db810230 Mon Sep 17 00:00:00 2001 From: nyatla Date: Thu, 27 Aug 2009 06:49:31 +0000 Subject: [PATCH] =?utf8?q?[Backup]NyARToolkit=20for=20Java=20Rle=E3=83=A9?= =?utf8?q?=E3=83=99=E3=83=AA=E3=83=B3=E3=82=B0=E6=BC=94=E7=AE=97=E3=81=AE?= =?utf8?q?=E6=95=B4=E6=95=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit@282 7cac0a50-4618-4814-88d0-24b83990f816 --- .../sandbox/qrcode/NyARQrCodeDetector.java | 3 +- .../sandbox/quadx2/NyARSquareDetector_Quad.java | 7 +- .../sandbox/vertexdetect/NyARVertexDetector.java | 6 +- .../sandbox/x2/NyARSquareDetector_X2.java | 24 +---- .../labeling/artoolkit/NyARLabeling_ARToolKit.java | 4 +- .../labeling/rlelabeling/NyARLabeling_Rle.java | 103 ++++++++++++++++----- .../squaredetect/NyARSquareDetector_ARToolKit.java | 3 + .../core/squaredetect/NyARSquareDetector_Rle.java | 28 ++---- trunk/src/jp/nyatla/utils/NyObjectStack.java | 24 +++-- .../jp/nyatla/nyartoolkit/dev/LabelingCamera.java | 4 +- 10 files changed, 126 insertions(+), 80 deletions(-) diff --git a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/qrcode/NyARQrCodeDetector.java b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/qrcode/NyARQrCodeDetector.java index a58acc8..623437a 100644 --- a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/qrcode/NyARQrCodeDetector.java +++ b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/qrcode/NyARQrCodeDetector.java @@ -93,11 +93,10 @@ public class NyARQrCodeDetector implements INyARSquareDetector } final NyARLabelingLabelStack stack = limage.getLabelStack(); - final NyARLabelingLabel[] labels = stack.getArray(); - // ラベルを大きい順に整列 stack.sortByArea(); + final NyARLabelingLabel[] labels = stack.getArray(); // デカいラベルを読み飛ばし int i; for (i = 0; i < label_num; i++) { diff --git a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/quadx2/NyARSquareDetector_Quad.java b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/quadx2/NyARSquareDetector_Quad.java index bce9c29..689861e 100644 --- a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/quadx2/NyARSquareDetector_Quad.java +++ b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/quadx2/NyARSquareDetector_Quad.java @@ -125,12 +125,11 @@ public class NyARSquareDetector_Quad implements INyARSquareDetector } NyARLabelingLabelStack stack = limage.getLabelStack(); + // ラベルを大きい順に整列 + stack.sortByArea(); + NyARLabelingLabel[] labels = stack.getArray(); - - // ラベルを大きい順に整列 - stack.sortByArea(); - // デカいラベルを読み飛ばし int i; for (i = 0; i < label_num; i++) diff --git a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/vertexdetect/NyARVertexDetector.java b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/vertexdetect/NyARVertexDetector.java index c2f03ba..09a34e7 100644 --- a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/vertexdetect/NyARVertexDetector.java +++ b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/vertexdetect/NyARVertexDetector.java @@ -110,13 +110,13 @@ public class NyARVertexDetector implements INyARSquareDetector if (label_num < 1) { return; } + final NyARLabelingLabelStack stack = limage.getLabelStack(); - final NyARLabelingLabel[] labels = stack.getArray(); - - // ラベルを大きい順に整列 stack.sortByArea(); + + final NyARLabelingLabel[] labels = stack.getArray(); // デカいラベルを読み飛ばし int i; diff --git a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/x2/NyARSquareDetector_X2.java b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/x2/NyARSquareDetector_X2.java index 00948d7..fd2eaf4 100644 --- a/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/x2/NyARSquareDetector_X2.java +++ b/trunk/sample/sandbox/jp/nyatla/nyartoolkit/sandbox/x2/NyARSquareDetector_X2.java @@ -47,9 +47,6 @@ import jp.nyatla.nyartoolkit.core.param.*; */ public class NyARSquareDetector_X2 implements INyARSquareDetector { - private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000 - - private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70 private final int _width; private final int _height; @@ -70,7 +67,7 @@ public class NyARSquareDetector_X2 implements INyARSquareDetector { this._width = i_size.w; this._height = i_size.h; - this._labeling = new NyARLabeling_Rle(this._width); + this._labeling = new NyARLabeling_Rle(this._width,this._height); this._sqconvertor=new SquareContourDetector_X2(i_size,i_dist_factor_ref); this._stack=new RleLabelFragmentInfoStack(i_size.w*i_size.h*2048/(320*240)+32);//検出可能な最大ラベル数 @@ -113,17 +110,10 @@ public class NyARSquareDetector_X2 implements INyARSquareDetector if (label_num < 1) { return; } - + //ラベルをソートしておく + flagment.sortByArea(); RleLabelFragmentInfoStack.RleLabelFragmentInfo[] labels=flagment.getArray(); - // デカいラベルを読み飛ばし - int i; - for (i = 0; i < label_num; i++) { - // 検査対象内のラベルサイズになるまで無視 - if (labels[i].area <= AR_AREA_MAX) { - break; - } - } final int xsize = this._width; final int ysize = this._height; @@ -134,14 +124,10 @@ public class NyARSquareDetector_X2 implements INyARSquareDetector //重なりチェッカの最大数を設定 overlap.setMaxLabels(label_num); - for (; i < label_num; i++) { + for (int i=0; i < label_num; i++) { final RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt=labels[i]; final int label_area = label_pt.area; - // 検査対象サイズよりも小さくなったら終了 - if (label_pt.area < AR_AREA_MIN) { - break; - } - + // クリップ領域が画面の枠に接していれば除外 if (label_pt.clip_l == 0 || label_pt.clip_r == xsize-1){ continue; diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabeling_ARToolKit.java b/trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabeling_ARToolKit.java index 60c3cc5..ca07e31 100644 --- a/trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabeling_ARToolKit.java +++ b/trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabeling_ARToolKit.java @@ -258,9 +258,7 @@ final public class NyARLabeling_ARToolKit label_pt = labels[i]; label_pt.pos_x /= label_pt.area; label_pt.pos_y /= label_pt.area; - } - // ラベルを大きい順に整列 - label_list.sortByArea(); + } return wlabel_num; } diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java b/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java index e01843c..a1b71db 100644 --- a/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java +++ b/trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java @@ -27,9 +27,33 @@ package jp.nyatla.nyartoolkit.core.labeling.rlelabeling; import jp.nyatla.nyartoolkit.NyARException; import jp.nyatla.nyartoolkit.core.raster.*; +import jp.nyatla.utils.*; +class RleInfoStack extends NyObjectStack +{ + public class RleInfo + { + //継承メンバ + public int entry_x; // フラグメントラベルの位置 + public int area; + public int clip_r; + public int clip_l; + public int clip_b; + public int clip_t; + public long pos_x; + public long pos_y; + } + public RleInfoStack(int i_length) + { + super(i_length, RleInfoStack.RleInfo.class); + return; + } - + protected RleInfoStack.RleInfo createElement() + { + return new RleInfoStack.RleInfo(); + } +} /** * [strage class] */ @@ -53,14 +77,33 @@ class RleElement // RleImageをラベリングする。 public class NyARLabeling_Rle { + private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000 + private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70 + + private RleInfoStack _rlestack; private RleElement[] _rle1; - private RleElement[] _rle2; + private int _max_area; + private int _min_area; - public NyARLabeling_Rle(int i_width) + public NyARLabeling_Rle(int i_width,int i_height) { + this._rlestack=new RleInfoStack(i_width*i_height*2048/(320*240)+32); this._rle1 = RleElement.createArray(i_width/2+1); this._rle2 = RleElement.createArray(i_width/2+1); + setAreaRange(AR_AREA_MAX,AR_AREA_MIN); + + return; + } + /** + * 対象サイズ + * @param i_max + * @param i_min + */ + public void setAreaRange(int i_max,int i_min) + { + this._max_area=i_max; + this._min_area=i_min; return; } @@ -124,12 +167,12 @@ public class NyARLabeling_Rle return current; } - private void addFragment(RleElement i_rel_img, int i_nof, int i_row_index, int i_rel_index,RleLabelFragmentInfoStack o_stack) throws NyARException + private void addFragment(RleElement i_rel_img, int i_nof, int i_row_index, int i_rel_index,RleInfoStack o_stack) throws NyARException { int l=i_rel_img.l; final int len=i_rel_img.r - l; i_rel_img.fid = i_nof;// REL毎の固有ID - RleLabelFragmentInfoStack.RleLabelFragmentInfo v = o_stack.prePush(); + RleInfoStack.RleInfo v = o_stack.prePush(); v.entry_x = l; v.area =len; v.clip_l=l; @@ -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 { // リセット処理 - o_stack.clear(); + final RleInfoStack rlestack=this._rlestack; + rlestack.clear(); + // RleElement[] rle_prev = this._rle1; RleElement[] rle_current = this._rle2; @@ -162,12 +207,12 @@ public class NyARLabeling_Rle len_prev = toRel(in_buf, i_top, width, rle_prev); for (int i = 0; i < len_prev; i++) { // フラグメントID=フラグメント初期値、POS=Y値、RELインデクス=行 - addFragment(rle_prev[i], id_max, i_top, i,o_stack); + addFragment(rle_prev[i], id_max, i_top, i,rlestack); id_max++; // nofの最大値チェック label_count++; } - RleLabelFragmentInfoStack.RleLabelFragmentInfo[] f_array = o_stack.getArray(); + RleInfoStack.RleInfo[] f_array = rlestack.getArray(); // 次段結合 for (int y = i_top + 1; y < i_bottom; y++) { // カレント行の読込 @@ -185,14 +230,14 @@ public class NyARLabeling_Rle continue; } else if (rle_prev[index_prev].l - rle_current[i].r > 0) {// 0なら8方位ラベリングになる // prevがcur右方にある→独立フラグメント - addFragment(rle_current[i], id_max, y, i,o_stack); + addFragment(rle_current[i], id_max, y, i,rlestack); id_max++; label_count++; // 次のindexをしらべる continue SCAN_CUR; } id=rle_prev[index_prev].fid;//ルートフラグメントid - RleLabelFragmentInfoStack.RleLabelFragmentInfo id_ptr = f_array[id]; + RleInfoStack.RleInfo id_ptr = f_array[id]; //結合対象(初回)->prevのIDをコピーして、ルートフラグメントの情報を更新 rle_current[i].fid = id;//フラグメントIDを保存 // @@ -222,7 +267,7 @@ public class NyARLabeling_Rle //結合するルートフラグメントを取得 final int prev_id =rle_prev[index_prev].fid; - RleLabelFragmentInfoStack.RleLabelFragmentInfo prev_ptr = f_array[prev_id]; + RleInfoStack.RleInfo prev_ptr = f_array[prev_id]; if (id != prev_id){ label_count--; //prevとcurrentのフラグメントidを書き換える。 @@ -282,7 +327,7 @@ public class NyARLabeling_Rle // curにidが割り当てられたかを確認 // 右端独立フラグメントを追加 if (id < 0){ - addFragment(rle_current[i], id_max, y, i,o_stack); + addFragment(rle_current[i], id_max, y, i,rlestack); id_max++; label_count++; } @@ -293,18 +338,34 @@ public class NyARLabeling_Rle len_prev = len_current; rle_current = tmp; } - //ソートする。 - o_stack.sortByArea(); - //ラベル数を再設定 + //対象のラベルだけ転写 o_stack.reserv(label_count); - //posを計算 - for(int i=0;i=0;i--){ + final int area=f_array[i].area; + if(areamax){//対象外のエリア0のもminではじく + continue; + } + // + final RleInfoStack.RleInfo src_info=f_array[i]; + final RleLabelFragmentInfoStack.RleLabelFragmentInfo dest_info=o_dest_array[active_labels]; + dest_info.area=area; + dest_info.clip_b=src_info.clip_b; + dest_info.clip_r=src_info.clip_r; + dest_info.clip_t=src_info.clip_t; + dest_info.clip_l=src_info.clip_l; + dest_info.entry_x=src_info.entry_x; + dest_info.pos_x=src_info.pos_x/src_info.area; + dest_info.pos_y=src_info.pos_y/src_info.area; + active_labels++; } + //ラベル数を再設定 + o_stack.pops(label_count-active_labels); //ラベル数を返却 - return label_count; + return active_labels; } } diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java b/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java index 2dae3eb..94bff8f 100644 --- a/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java +++ b/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java @@ -79,6 +79,9 @@ public class NyARSquareDetector_ARToolKit implements INyARSquareDetector } final NyARLabelingLabelStack stack = limage.getLabelStack(); + //ラベルをソートしておく + stack.sortByArea(); + // final NyARLabelingLabel[] labels = stack.getArray(); // デカいラベルを読み飛ばし diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java b/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java index 2912e08..97feab1 100644 --- a/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java +++ b/trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java @@ -37,9 +37,9 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector { this._width = i_size.w; this._height = i_size.h; - //歪み計算テーブルを作ると、8*width/height*2の領域を消費します。 - //領域を取りたくない場合は、i_dist_factor_refの値をそのまま使ってください。 - this._labeling = new NyARLabeling_Rle(this._width); + //ラベリングのサイズを指定したいときはsetAreaRangeを使ってね。 + this._labeling = new NyARLabeling_Rle(this._width,this._height); + this._labeling.setAreaRange(AR_AREA_MAX, AR_AREA_MIN); this._sqconvertor=new SquareContourDetector(i_size,i_dist_factor_ref); this._stack=new RleLabelFragmentInfoStack(i_size.w*i_size.h*2048/(320*240)+32);//検出可能な最大ラベル数 @@ -72,39 +72,29 @@ public class NyARSquareDetector_Rle implements INyARSquareDetector // マーカーホルダをリセット o_square_stack.clear(); - // ラベル数が0ならここまで(Labeling内部でソートするようにした。) + // ラベル数が0ならここまで final int label_num=this._labeling.labeling(i_raster, 0, i_raster.getHeight(), flagment); if (label_num < 1) { return; } - // ラベルを大きい順に整列 + //ラベルをソートしておく + flagment.sortByArea(); + //ラベルリストを取得 RleLabelFragmentInfoStack.RleLabelFragmentInfo[] labels=flagment.getArray(); - // デカいラベルを読み飛ばし - int i; - for (i = 0; i < label_num; i++) { - // 検査対象内のラベルサイズになるまで無視 - if (labels[i].area <= AR_AREA_MAX) { - break; - } - } - final int xsize = this._width; final int ysize = this._height; final int[] xcoord = this._xcoord; final int[] ycoord = this._ycoord; final int coord_max = this._max_coord; + //重なりチェッカの最大数を設定 overlap.setMaxLabels(label_num); - for (; i < label_num; i++) { + for (int i=0; i < label_num; i++) { final RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt=labels[i]; final int label_area = label_pt.area; - // 検査対象サイズよりも小さくなったら終了 - if (label_pt.area < AR_AREA_MIN) { - break; - } // クリップ領域が画面の枠に接していれば除外 if (label_pt.clip_l == 0 || label_pt.clip_r == xsize-1){ diff --git a/trunk/src/jp/nyatla/utils/NyObjectStack.java b/trunk/src/jp/nyatla/utils/NyObjectStack.java index 7ca6c3d..5644696 100644 --- a/trunk/src/jp/nyatla/utils/NyObjectStack.java +++ b/trunk/src/jp/nyatla/utils/NyObjectStack.java @@ -92,17 +92,28 @@ public abstract class NyObjectStack * 見かけ上の要素数を1減らして、最後尾のアイテムを返します。 * @return */ - public final T pop() throws NyARException + public final T pop() { - if(this._length<1){ - throw new NyARException(); - } + assert(this._length>=1); this._length--; - return this.getItem(this._length); + return this._items[this._length]; } /** + * 見かけ上の要素数をi_count個減らします。 + * @param i_count + * @return + * NULLを返します。 + */ + public final void pops(int i_count) + { + assert(this._length>=i_count); + this._length-=i_count; + return; + } + + /** * 0~i_number_of_item-1までの領域を予約します。 - * 予約すると、見かけ上の要素数は0にリセットされます。 + * 予約済の領域よりも小さい場合には、現在の長さを調整します。 * @param i_number_of_reserv */ final public void reserv(int i_number_of_item) throws NyARException @@ -167,7 +178,6 @@ public abstract class NyObjectStack { return this._length; } - /** * 見かけ上の要素数をリセットします。 */ diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/LabelingCamera.java b/trunk/test/jp/nyatla/nyartoolkit/dev/LabelingCamera.java index 83ff9c5..8396b96 100644 --- a/trunk/test/jp/nyatla/nyartoolkit/dev/LabelingCamera.java +++ b/trunk/test/jp/nyatla/nyartoolkit/dev/LabelingCamera.java @@ -368,10 +368,10 @@ class NyARQRCodeDetector implements INyARSquareDetector } final NyARLabelingLabelStack stack = limage.getLabelStack(); - final NyARLabelingLabel[] labels = stack.getArray(); - // ラベルを大きい順に整列 stack.sortByArea(); + final NyARLabelingLabel[] labels = stack.getArray(); + // デカいラベルを読み飛ばし int i; -- 2.11.0