/** * 現在リストにあるラベルと重なっているかを返す。 * * @param i_label * @return 何れかのラベルの内側にあるならばfalse,独立したラベルである可能性が高ければtrueです. */ public bool check(NyARLabelingLabel i_label) { // 重なり処理かな? NyARLabelingLabel[] label_pt = this._labels; int px1 = (int)i_label.pos_x; int py1 = (int)i_label.pos_y; int px2, py2, d; for (int i = this._length - 1; i >= 0; i--) { px2 = (int)label_pt[i].pos_x; py2 = (int)label_pt[i].pos_y; d = (px1 - px2) * (px1 - px2) + (py1 - py2) * (py1 - py2); if (d < label_pt[i].area / 4) { // 対象外 return(false); } } // 対象 return(true); }
/** * この関数は、i_labelのラベルのクリップ領域が上辺に接している点の、x座標を返します。 * NyARToolkitでは、ラベルの輪郭をトレースするときに、その始点を探索するために使います。 * @param i_label * 探索するラベル * @return * ラベルの上辺クリップとの接点となる、x位置 */ public int getTopClipTangentX(NyARLabelingLabel i_label) { int pix; int i_label_id = i_label.id; int[] index_table = this._index_table; int[] limage = this._buf; int limage_ptr = i_label.clip_t * this._size.w; int clip1 = i_label.clip_r; // p1=ShortPointer.wrap(limage,j*xsize+clip.get());//p1 =&(limage[j*xsize+clip[0]]); for (int i = i_label.clip_l; i <= clip1; i++) {// for( i = clip[0]; i <=clip[1]; i++, p1++ ) { pix = limage[limage_ptr + i]; if (pix > 0 && index_table[pix - 1] == i_label_id) { return(i); } } //あれ?見つからないよ? throw new NyARException(); }
/** * チェック対象のラベルを追加する。 * * @param i_label_ref */ public void push(NyARLabelingLabel i_label_ref) { this._labels[this._length] = i_label_ref; this._length++; }
/** * arDetectMarker2を基にした関数 * この関数はNyARSquare要素のうち、directionを除くパラメータを取得して返します。 * directionの確定は行いません。 * @param i_raster * 解析する2値ラスタイメージを指定します。 * @throws NyARException */ public override void detectMarker(NyARBinRaster i_raster) { 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; NyARIntCoordinates coord = this._coord; int[] mkvertex = this.__detectMarker_mkvertex; NyARLabelOverlapChecker <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; } // 輪郭を取得 if (!this._cpickup.getContour(limage, limage.getTopClipTangentX(label_pt), 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; }
/** * i_labelのラベルの、クリップ領域が上辺に接しているx座標を返します。 * @param i_index * @return */ public int getTopClipTangentX(NyARLabelingLabel i_label) { int pix; int i_label_id=i_label.id; int[] index_table=this._index_table; int[] limage=this._ref_buf; int limage_ptr=i_label.clip_t*this._size.w; int clip1 = i_label.clip_r; // p1=ShortPointer.wrap(limage,j*xsize+clip.get());//p1 =&(limage[j*xsize+clip[0]]); for (int i = i_label.clip_l; i <= clip1; i++) {// for( i = clip[0]; i <=clip[1]; i++, p1++ ) { pix = limage[limage_ptr+i]; if (pix > 0 && index_table[pix-1] == i_label_id){ return i; } } //あれ?見つからないよ? throw new NyARException(); }
/** * 現在リストにあるラベルと重なっているかを返す。 * * @param i_label * @return 何れかのラベルの内側にあるならばfalse,独立したラベルである可能性が高ければtrueです. */ public bool check(NyARLabelingLabel i_label) { // 重なり処理かな? NyARLabelingLabel[] label_pt = this._labels; int px1 = (int)i_label.pos_x; int py1 = (int)i_label.pos_y; int px2, py2, d; for (int i = this._length - 1; i >= 0; i--) { px2 = (int)label_pt[i].pos_x; py2 = (int)label_pt[i].pos_y; d = (px1 - px2) * (px1 - px2) + (py1 - py2) * (py1 - py2); if (d < label_pt[i].area / 4) { // 対象外 return false; } } // 対象 return true; }