/**
         * 現在リストにあるラベルと重なっているかを返す。
         *
         * @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);
        }
Esempio n. 2
0
        /**
         * この関数は、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;
 }
 /**
  * チェック対象のラベルを追加する。
  * 
  * @param i_label_ref
  */
 public void push(NyARLabelingLabel i_label_ref)
 {
     this._labels[this._length] = i_label_ref;
     this._length++;
 }