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
\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
//領域を取りたくない場合は、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
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
}\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
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