public override void detectMarkerCB(NyARBinRaster i_raster, IDetectMarkerCallback i_callback) { RleLabelFragmentInfoStack flagment = this._stack; LabelOverlapChecker <RleLabelFragmentInfoStack.RleLabelFragmentInfo> overlap = this._overlap_checker; // ラベル数が0ならここまで 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 xsize = this._width; int ysize = this._height; int[] xcoord = this._xcoord; int[] ycoord = this._ycoord; int coord_max = this._max_coord; int[] mkvertex = this.__detectMarker_mkvertex; //重なりチェッカの最大数を設定 overlap.setMaxLabels(label_num); for (int i = 0; i < label_num; i++) { RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt = labels[i]; int label_area = label_pt.area; // クリップ領域が画面の枠に接していれば除外 if (label_pt.clip_l == 0 || label_pt.clip_r == xsize - 1) { continue; } if (label_pt.clip_t == 0 || label_pt.clip_b == ysize - 1) { continue; } // 既に検出された矩形との重なりを確認 if (!overlap.check(label_pt)) { // 重なっているようだ。 continue; } //輪郭を取得 int coord_num = _cpickup.getContour(i_raster, label_pt.entry_x, label_pt.clip_t, coord_max, xcoord, ycoord); if (coord_num == coord_max) { // 輪郭が大きすぎる。 continue; } //輪郭線をチェックして、矩形かどうかを判定。矩形ならばmkvertexに取得 if (!this._coord2vertex.getVertexIndexes(xcoord, ycoord, coord_num, label_area, mkvertex)) { // 頂点の取得が出来なかった continue; } //矩形を発見したことをコールバック関数で通知 i_callback.onSquareDetect(this, xcoord, ycoord, coord_num, mkvertex); // 検出済の矩形の属したラベルを重なりチェックに追加する。 overlap.push(label_pt); } return; }
/** * arDetectMarker2を基にした関数 * この関数はNyARSquare要素のうち、directionを除くパラメータを取得して返します。 * directionの確定は行いません。 * @param i_raster * 解析する2値ラスタイメージを指定します。 * @param o_square_stack * 抽出した正方形候補を格納するリスト * @throws NyARException */ public override void detectMarkerCB(NyARBinRaster i_raster, IDetectMarkerCallback i_callback) { NyARLabelingImage limage = this._limage; // ラベル数が0ならここまで int label_num = this._labeling.labeling(i_raster, this._limage); if (label_num < 1) { return; } NyARLabelingLabelStack stack = limage.getLabelStack(); //ラベルをソートしておく stack.sortByArea(); // NyARLabelingLabel[] labels = stack.getArray(); // デカいラベルを読み飛ばし int i; for (i = 0; i < label_num; i++) { // 検査対象内のラベルサイズになるまで無視 if (labels[i].area <= AR_AREA_MAX) { break; } } int xsize = this._width; int ysize = this._height; int[] xcoord = this._xcoord; int[] ycoord = this._ycoord; int coord_max = this._max_coord; int[] mkvertex = this.__detectMarker_mkvertex; LabelOverlapChecker <NyARLabelingLabel> overlap = this._overlap_checker; //重なりチェッカの最大数を設定 overlap.setMaxLabels(label_num); for (; i < label_num; i++) { NyARLabelingLabel label_pt = labels[i]; int label_area = label_pt.area; // 検査対象サイズよりも小さくなったら終了 if (label_area < AR_AREA_MIN) { break; } // クリップ領域が画面の枠に接していれば除外 if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){ continue; } if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){ continue; } // 既に検出された矩形との重なりを確認 if (!overlap.check(label_pt)) { // 重なっているようだ。 continue; } // 輪郭を取得 int coord_num = _cpickup.getContour(limage, limage.getTopClipTangentX(label_pt), label_pt.clip_t, coord_max, xcoord, ycoord); if (coord_num == coord_max) { // 輪郭が大きすぎる。 continue; } //輪郭線をチェックして、矩形かどうかを判定。矩形ならばmkvertexに取得 if (!this._coord2vertex.getVertexIndexes(xcoord, ycoord, coord_num, label_area, mkvertex)) { // 頂点の取得が出来なかった continue; } //矩形を発見したことをコールバック関数で通知 i_callback.onSquareDetect(this, xcoord, ycoord, coord_num, mkvertex); // 検出済の矩形の属したラベルを重なりチェックに追加する。 overlap.push(label_pt); } return; }