public Labeling(int i_width, int i_height) : base(i_width, i_height) { this.label_stack = new NyARRleLabelFragmentInfoPtrStack(i_width * i_height * 2048 / (320 * 240) + 32);//検出可能な最大ラベル数 this._bottom = i_height - 1; this._right = i_width - 1; return; }
/** * @override */ public override void detectMarker(NyARBinRaster i_raster) { NyARRleLabelFragmentInfoPtrStack flagment = this._labeling.label_stack; NyARLabelOverlapChecker <NyARRleLabelFragmentInfo> overlap = this._overlap_checker; // ラベル数が0ならここまで flagment.clear(); this._labeling.labeling(i_raster); int label_num = flagment.getLength(); if (label_num < 1) { return; } //ラベルをソートしておく flagment.sortByArea(); //ラベルリストを取得 NyARRleLabelFragmentInfo[] labels = flagment.getArray(); NyARIntCoordinates coord = this._coord; int[] mkvertex = this.__detectMarker_mkvertex; //重なりチェッカの最大数を設定 overlap.setMaxLabels(label_num); for (int i = 0; i < label_num; i++) { NyARRleLabelFragmentInfo label_pt = labels[i]; int label_area = label_pt.area; // 既に検出された矩形との重なりを確認 if (!overlap.check(label_pt)) { // 重なっているようだ。 continue; } //輪郭を取得 if (!this._cpickup.getContour(i_raster, label_pt.entry_x, label_pt.clip_t, coord)) { continue; } //輪郭線をチェックして、矩形かどうかを判定。矩形ならばmkvertexに取得 if (!this._coord2vertex.getVertexIndexes(coord, label_area, mkvertex)) { // 頂点の取得が出来なかった continue; } //矩形を発見したことをコールバック関数で通知 this.onSquareDetect(coord, mkvertex); // 検出済の矩形の属したラベルを重なりチェックに追加する。 overlap.push(label_pt); } return; }
public Labeling(int i_width, int i_height) : base(i_width, i_height) { long t = (long)i_width * i_height * 2048 / (320 * 240) + 32; //full HD support this.label_stack = new NyARRleLabelFragmentInfoPtrStack((int)t); //検出可能な最大ラベル数 this._bottom = i_height - 1; this._right = i_width - 1; return; }
/** * この関数は、ラスタから矩形を検出して、自己コールバック関数{@link #onSquareDetect}で通知します。 * @param i_raster * 検出元のラスタ画像 * 入力できるラスタの画素形式は、{@link NyARLabeling_Rle#labeling(INyARRaster, int)}と同じです。 * @param i_area * 検出する範囲。検出元のラスタの内側である必要があります。 * @param i_th * ラベルと判定する敷居値 * @ */ public void detectMarker(INyARGrayscaleRaster i_raster, NyARIntRect i_area, int i_th, NyARSquareContourDetector.CbHandler i_cb) { Debug.Assert(i_area.w * i_area.h > 0); NyARRleLabelFragmentInfoPtrStack flagment = this._labeling.label_stack; NyARLabelOverlapChecker <NyARRleLabelFragmentInfo> overlap = this._overlap_checker; //ラベルの生成エラーならここまで if (!this._labeling.labeling(i_raster, i_area, i_th)) { return; } // ラベル数が0ならここまで int label_num = flagment.getLength(); if (label_num < 1) { return; } //ラベルリストを取得 NyARRleLabelFragmentInfo[] labels = flagment.getArray(); NyARIntCoordinates coord = this._coord; int[] mkvertex = this.__detectMarker_mkvertex; //重なりチェッカの最大数を設定 overlap.setMaxLabels(label_num); for (int i = 0; i < label_num; i++) { NyARRleLabelFragmentInfo label_pt = labels[i]; // 既に検出された矩形との重なりを確認 if (!overlap.check(label_pt)) { // 重なっているようだ。 continue; } //輪郭を取得 if (!this._cpickup.getContour(i_raster, i_area, i_th, label_pt.entry_x, label_pt.clip_t, coord)) { continue; } int label_area = label_pt.area; //輪郭線をチェックして、矩形かどうかを判定。矩形ならばmkvertexに取得 if (!this._coord2vertex.getVertexIndexes(coord, label_area, mkvertex)) { // 頂点の取得が出来なかった continue; } //矩形を発見したことをコールバック関数で通知 i_cb.detectMarkerCallback(coord, mkvertex); // 検出済の矩形の属したラベルを重なりチェックに追加する。 overlap.push(label_pt); } return; }