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}で通知します。 * ARToolKitのarDetectMarker2を基にしています。 * @param i_raster * 検出元のラスタ画像 * 入力できるラスタの画素形式は、{@link NyARLabeling_Rle#labeling(NyARGrayscaleRaster, int)}と同じです。 * @param i_th * 画素の二値判定敷居値です。この値は、ラベリングと、輪郭線追跡時に使われます。 */ public void detectMarker(INyARGrayscaleRaster i_raster, int i_th, NyARSquareContourDetector.CbHandler i_cb) { NyARRleLabelFragmentInfoPtrStack flagment = this._labeling.label_stack; NyARLabelOverlapChecker <NyARRleLabelFragmentInfo> overlap = this._overlap_checker; flagment.clear(); //ラベルの生成エラーならここまで if (!this._labeling.labeling(i_raster, i_th)) { return; } int label_num = flagment.getLength(); // ラベル数が0ならここまで 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, i_th, label_pt.entry_x, label_pt.clip_t, coord)) { continue; } //輪郭線をチェックして、矩形かどうかを判定。矩形ならばmkvertexに取得 if (!this._coord2vertex.getVertexIndexes(coord, label_area, mkvertex)) { // 頂点の取得が出来なかった continue; } //矩形を発見したことをコールバック関数で通知 i_cb.detectMarkerCallback(coord, mkvertex); // 検出済の矩形の属したラベルを重なりチェックに追加する。 overlap.push(label_pt); } return; }