Esempio n. 1
0
        //ターゲット操作系関数

        //IgnoreTargetの数は、NUMBER_OF_TARGETと同じです。



        /**
         * 新しいNewTargetを追加します。
         * @param i_clock
         * @param i_sample
         * @return
         * @throws NyARException
         */
        private NyARTarget addNewTarget(LowResolutionLabelingSamplerOut.Item i_sample)
        {
            //個数制限
            if (this._number_of_new >= this.MAX_NUMBER_OF_NEW)
            {
                return(null);
            }
            //アイテム生成
            NyARTarget t = this.target_pool.newNewTarget();

            if (t == null)
            {
                return(null);
            }
            t._status_life = LIFE_OF_NEW;
            t._st_type     = NyARTargetStatus.ST_NEW;
            t._delay_tick  = 0;
            t.setSampleArea(i_sample);
            t._ref_status = this.newst_pool.newObject();
            if (t._ref_status == null)
            {
                t.releaseObject();
                return(null);
            }
            ((NyARNewTargetStatus)t._ref_status).setValue(i_sample);
            //ターゲットリストへ追加
            this._targets.pushAssert(t);
            this._number_of_new++;
            return(t);
        }
Esempio n. 2
0
        /**
         * このターゲットのステータスを、IgnoreStatusへ変更します。
         * @throws NyARException
         */
        public void changeStatusToIgnore(NyARTarget i_target, int i_life)
        {
            //遷移元のステータスを制限すること!
            Debug.Assert((i_target._st_type == NyARTargetStatus.ST_NEW) ||
                         (i_target._st_type == NyARTargetStatus.ST_CONTURE) ||
                         (i_target._st_type == NyARTargetStatus.ST_RECT));

            //カウンタ更新
            switch (i_target._st_type)
            {
            case NyARTargetStatus.ST_NEW:
                this._number_of_new--;
                break;

            case NyARTargetStatus.ST_RECT:
                this._number_of_rect--;
                break;

            case NyARTargetStatus.ST_CONTURE:
                this._number_of_contoure--;
                break;

            default:
                return;
            }
            i_target._st_type = NyARTargetStatus.ST_IGNORE;
            i_target._ref_status.releaseObject();
            i_target._status_life = i_life;
            i_target._ref_status  = null;
            this._number_of_ignore++;
            return;
        }
Esempio n. 3
0
 private void upgradeRectTarget(NyARTarget i_rect_target)
 {
     Debug.Assert(i_rect_target._st_type == NyARTargetStatus.ST_RECT);
     if (i_rect_target._delay_tick > 20)
     {
         this.changeStatusToIgnore(i_rect_target, LIFE_OF_IGNORE_FROM_RECT);
         //一定の期間updateができなければ、ignoreへ遷移
     }
 }
Esempio n. 4
0
        /**
         * 指定したインデクスのターゲットをリストから削除します。
         * ターゲットだけを外部から参照している場合など、ターゲットのindexが不明な場合は、
         * ターゲットをignoreステータスに設定して、trackerのprogressを経由してdeleateを実行します。
         * @param i_index
         * @return
         * @throws NyARException
         */
        private void deleatTarget(int i_index)
        {
            Debug.Assert(this._targets.getItem(i_index)._st_type == NyARTargetStatus.ST_IGNORE);
            NyARTarget tr = this._targets.getItem(i_index);

            this._targets.removeIgnoreOrder(i_index);
            tr.releaseObject();
            this._number_of_ignore--;
            return;
        }
Esempio n. 5
0
 /**
  * ターゲットリストを参考に、sampleを振り分て、サンプルスタックに格納します。
  * ターゲットは、rect>coord>new>ignoreの順に優先して振り分けられます。
  * @param i_snapshot
  * @param i_source
  * @param i_new
  * @param i_ig
  * @param i_cood
  * @param i_rect
  * @param i_newsrc
  * @param i_igsrc
  * @param i_coodsrc
  * @param i_rectsrc
  * @throws NyARException
  */
 private void sampleMapper(
     LowResolutionLabelingSamplerOut i_source,
     NyARTargetList i_new, NyARTargetList i_ig, NyARTargetList i_cood, NyARTargetList i_rect,
     SampleStack i_newsrc, SampleStack i_igsrc, SampleStack i_coodsrc, SampleStack i_rectsrc)
 {
     //スタックを初期化
     i_newsrc.clear();
     i_coodsrc.clear();
     i_igsrc.clear();
     i_rectsrc.clear();
     //
     LowResolutionLabelingSamplerOut.Item[] sample_items = i_source.getArray();
     for (int i = i_source.getLength() - 1; i >= 0; i--)
     {
         //サンプラからの値を其々のターゲットのソースへ分配
         LowResolutionLabelingSamplerOut.Item sample_item = sample_items[i];
         int id;
         id = i_rect.getMatchTargetIndex(sample_item);
         if (id >= 0)
         {
             i_rectsrc.push(sample_item);
             continue;
         }
         //coord
         id = i_cood.getMatchTargetIndex(sample_item);
         if (id >= 0)
         {
             i_coodsrc.push(sample_item);
             continue;
         }
         //newtarget
         id = i_new.getMatchTargetIndex(sample_item);
         if (id >= 0)
         {
             i_newsrc.push(sample_item);
             continue;
         }
         //ignore target
         id = i_ig.getMatchTargetIndex(sample_item);
         if (id >= 0)
         {
             i_igsrc.push(sample_item);
             continue;
         }
         //マップできなかったものは、NewTragetへ登録(種類別のListには反映しない)
         NyARTarget t = this.addNewTarget(sample_item);
         if (t == null)
         {
             continue;
         }
         i_newsrc.push(sample_item);
     }
     return;
 }
Esempio n. 6
0
        /**
         * 新しいRealityTargetを作って返します。
         * @param tt
         * @return
         * @throws NyARException
         */
        public NyARRealityTarget newNewTarget(NyARTarget tt)
        {
            NyARRealityTarget ret = base.newObject();

            if (ret == null)
            {
                return(null);
            }
            ret.grab_rate        = 50;//開始時の捕捉レートは10%
            ret._ref_tracktarget = (NyARTarget)tt.referenceObject();
            ret._serial          = NyARRealityTarget.createSerialId();
            ret.tag = null;
            tt.tag  = ret;     //トラックターゲットのタグに自分の値設定しておく。
            return(ret);
        }
Esempio n. 7
0
 /**
  * このターゲットをRectターゲットに遷移させます。
  * @param i_target
  * @param i_c
  * @return
  */
 private NyARTarget changeStatusToRect(NyARTarget i_target, NyARRectTargetStatus i_c)
 {
     Debug.Assert(i_target._st_type == NyARTargetStatus.ST_CONTURE);
     if (this._number_of_rect >= this.MAX_NUMBER_OF_RECT)
     {
         return(null);
     }
     i_target._st_type = NyARTargetStatus.ST_RECT;
     i_target._ref_status.releaseObject();
     i_target._status_life = LIFE_OF_RECT_FROM_CONTOUR;
     i_target._ref_status  = i_c;
     //カウンタ更新
     this._number_of_contoure--;
     this._number_of_rect++;
     return(i_target);
 }
Esempio n. 8
0
        /**
         * Realityの状態を、i_inの{@link NyARRealitySource}を元に、1サイクル進めます。
         * 現在の更新ルールは以下の通りです。
         * 0.呼び出されるごとに、トラックターゲットからUnknownターゲットを生成する。
         * 1.一定時間捕捉不能なKnown,Unknownターゲットは、deadターゲットへ移動する。
         * 2.knownターゲットは最新の状態を維持する。
         * 3.deadターゲットは(次の呼び出しで)捕捉対象から削除する。
         * Knownターゲットが捕捉不能になった時の動作は、以下の通りです。
         * 4.[未実装]捕捉不能なターゲットの予測と移動
         * @param i_in
         * @throws NyARException
         */
        public void progress(NyARRealitySource i_in)
        {
            //tracker進行
            this._tracker.progress(i_in.makeTrackSource());

            //トラックしてないrectターゲット1個探してunknownターゲットに入力
            NyARTarget tt = findEmptyTagItem(this._tracker._targets);

            if (tt != null)
            {
                this.addUnknownTarget(tt);
            }
            //リストのアップデート
            updateLists();
            //リストのアップグレード
            upgradeLists();
            return;
        }
Esempio n. 9
0
        //RealityTargetの編集関数

        /**
         * Realityターゲットリストへ新しい{@link NyARRealityTarget}を追加する。
         * @param i_track_target
         * UnknownTargetに関連付ける{@link NyARTarget}.このターゲットは、{@link NyARTargetStatus#ST_RECT}であること?
         */
        private NyARRealityTarget addUnknownTarget(NyARTarget i_track_target)
        {
            Debug.Assert(i_track_target._st_type == NyARTargetStatus.ST_RECT);
            NyARRealityTarget rt = this._pool.newNewTarget(i_track_target);

            if (rt == null)
            {
                return(null);
            }
            //個数制限
            if (this._number_of_unknown >= this.MAX_LIMIT_UNKNOWN)
            {
                return(null);
            }
            rt._target_type = NyARRealityTarget.RT_UNKNOWN;
            this.target.pushAssert(rt);
            this._number_of_unknown++;
            return(rt);
        }
Esempio n. 10
0
 /**
  * このターゲットのステータスを、CntoureStatusへ遷移させます。
  * @param i_c
  */
 private NyARTarget changeStatusToCntoure(NyARTarget i_target, NyARContourTargetStatus i_c)
 {
     //遷移元のステータスを制限
     Debug.Assert(i_c != null);
     Debug.Assert(i_target._st_type == NyARTargetStatus.ST_NEW);
     //個数制限
     if (this._number_of_contoure >= this.MAX_NUMBER_OF_CONTURE)
     {
         return(null);
     }
     i_target._st_type = NyARTargetStatus.ST_CONTURE;
     i_target._ref_status.releaseObject();
     i_target._status_life = LIFE_OF_CONTURE_FROM_NEW;
     i_target._ref_status  = i_c;
     //カウンタ更新
     this._number_of_new--;
     this._number_of_contoure++;
     return(i_target);
 }
Esempio n. 11
0
        /**
         * i_new_targetのアップグレードを試行します。
         * アップグレードの種類は以下のにとおりです。1.一定期間経過後の破棄ルート(Ignoreへ遷移)2.正常認識ルート(Contourへ遷移)
         * @param i_new_target
         * @param i_base_raster
         * @return
         * @throws NyARException
         */
        private void upgradeNewTarget(NyARTarget i_new_target, INyARVectorReader i_vecreader)
        {
            Debug.Assert(i_new_target._st_type == NyARTargetStatus.ST_NEW);

            //寿命を超えたらignoreへ遷移
            if (i_new_target._status_life <= 0)
            {
                this.changeStatusToIgnore(i_new_target, LIFE_OF_IGNORE_FROM_NEW);
                return;
            }
            NyARNewTargetStatus st = (NyARNewTargetStatus)i_new_target._ref_status;

            //このターゲットをアップグレードできるか確認
            if (st.current_sampleout == null)
            {
                //直近のsampleoutが無い。->なにもできない。
                return;
            }
            //coordステータスを生成
            NyARContourTargetStatus c = this.contourst_pool.newObject();

            if (c == null)
            {
                //ターゲットがいっぱい。(失敗して何もしない)
//			    System.out.println("upgradeNewTarget:status pool full");
                return;
            }
            //ステータスの値をセット
            if (!c.setValue(i_vecreader, st.current_sampleout))
            {
                //値のセットに失敗したので、Ignoreへ遷移(この対象は輪郭認識できない)
                this.changeStatusToIgnore(i_new_target, LIFE_OF_IGNORE_FROM_NEW);
                //System.out.println("drop:new->ignore[contoure failed.]"+t.serial+":"+t.last_update);
                c.releaseObject();
                return;            //失敗しようが成功しようが終了
            }
            if (this.changeStatusToCntoure(i_new_target, c) == null)
            {
                c.releaseObject();
                return;
            }
            return;
        }
Esempio n. 12
0
        /**
         * NyARTrackerOutのCOntourTargetについて、アップグレード処理をします。
         * アップグレードの種類は以下のにとおりです。1.一定期間経過後の破棄ルート(Ignoreへ遷移)2.正常認識ルート(Rectへ遷移)
         * @param i_base_raster
         * @param i_trackdata
         * @throws NyARException
         */
        private void upgradeContourTarget(NyARTarget i_contoure_target)
        {
            Debug.Assert(i_contoure_target._st_type == NyARTargetStatus.ST_CONTURE);
            if (i_contoure_target._status_life <= 0)
            {
                //一定の期間が経過したら、ignoreへ遷移
                this.changeStatusToIgnore(i_contoure_target, LIFE_OF_IGNORE_FROM_CONTOUR);
                return;
            }
            if (i_contoure_target._delay_tick > 20)
            {
                this.changeStatusToIgnore(i_contoure_target, LIFE_OF_IGNORE_FROM_CONTOUR);
                return;
                //一定の期間updateができなければ、ignoreへ遷移
            }

            NyARContourTargetStatus st = (NyARContourTargetStatus)i_contoure_target._ref_status;
            //coordステータスを生成
            NyARRectTargetStatus c = this.rect_pool.newObject();

            if (c == null)
            {
                //ターゲットがいっぱい。
                return;
            }
            //ステータスの値をセット
            if (!c.setValueWithInitialCheck(st, i_contoure_target._sample_area))
            {
                //値のセットに失敗した。
                c.releaseObject();
                return;
            }
            if (this.changeStatusToRect(i_contoure_target, c) == null)
            {
                //ターゲットいっぱい?
                c.releaseObject();
                return;
            }
            return;
        }
     /**
      * Newtargetを表示します。
      */
     private void drawNewTarget(NyARTarget t, Graphics sink)
     {
         Font f = new Font("System", 14);
 	    //サンプリング結果の表示
         sink.DrawString("NW" + "-" + t._delay_tick, f, Brushes.Green, new PointF(t._sample_area.x, t._sample_area.y));
         sink.DrawRectangle(Pens.Green,t._sample_area.x, t._sample_area.y, t._sample_area.w, t._sample_area.h);
     }
        /**
         * ContourTargetを表示します。
         */
        private void drawContourTarget(NyARTarget t, Graphics sink)
        {
            Font f = new Font("System", 14);
            sink.DrawString("CT",f, Brushes.Blue, new PointF(t._sample_area.x, t._sample_area.y));
    //		g.drawRect(t._sample_area.x,t._sample_area.y,t._sample_area.w,t._sample_area.h);
		    NyARContourTargetStatus st=(NyARContourTargetStatus)t._ref_status;
		    VecLinearCoordinatesOperator vp=new VecLinearCoordinatesOperator();
		    vp.margeResembleCoords(st.vecpos);
		    for(int i2=0;i2<st.vecpos.length;i2++){
    //		for(int i2=43;i2<44;i2++){
    //			g.drawString(i2+":"+"-"+t._delay_tick,(int)st.vecpos.items[i2].x-1, (int)st.vecpos.items[i2].y-1);
                sink.FillRectangle(Brushes.Blue,(int)st.vecpos.items[i2].x, (int)st.vecpos.items[i2].y, 1, 1);
			    double co,si;
			    co=st.vecpos.items[i2].dx;
			    si=st.vecpos.items[i2].dy;
			    double p=Math.Sqrt(co*co+si*si);
			    co/=p;
			    si/=p;
			    double ss=st.vecpos.items[i2].scalar*3;
			    sink.DrawLine(
                    Pens.Blue,
				    (int)st.vecpos.items[i2].x,
				    (int)st.vecpos.items[i2].y,
				    (int)(co*ss)+(int)st.vecpos.items[i2].x,(int)(si*ss)+(int)st.vecpos.items[i2].y);
			    int xx=(int)st.vecpos.items[i2].x;
			    int yy=(int)st.vecpos.items[i2].y;
    //			g.drawRect(xx/8*8,yy/8*8,16,16);
    			
		    }
        }
        /**
         * RectTargetを表示します。
         */
        private void drawRectTarget(NyARTarget t,Graphics sink)
        {
            Font f = new Font("System", 14);
    	    //サンプリング結果の表示
		    NyARRectTargetStatus s=(NyARRectTargetStatus)t._ref_status;
            sink.DrawString("RT:" + t._serial + "(" + s.detect_type + ")" + "-" + t._delay_tick, f, Brushes.Cyan, new PointF(t._sample_area.x, t._sample_area.y));
            sink.DrawRectangle(Pens.Cyan, (int)s.vertex[0].x - 1, (int)s.vertex[0].y - 1, 2, 2);
		    for(int i2=0;i2<4;i2++){
//				g.fillRect((int)st.vecpos[i2].x-1, (int)st.vecpos[i2].y-1,2,2);
                sink.DrawLine(Pens.Cyan,
				    (int)s.vertex[i2].x,
				    (int)s.vertex[i2].y,
				    (int)s.vertex[(i2+1)%4].x,
				    (int)s.vertex[(i2+1)%4].y);
		    }
        }
Esempio n. 16
0
	    //RealityTargetの編集関数

	    /**
	     * Realityターゲットリストへ新しい{@link NyARRealityTarget}を追加する。
	     * @param i_track_target
	     * UnknownTargetに関連付ける{@link NyARTarget}.このターゲットは、{@link NyARTargetStatus#ST_RECT}であること?
	     */
	    private NyARRealityTarget addUnknownTarget(NyARTarget i_track_target)
	    {
            Debug.Assert(i_track_target._st_type == NyARTargetStatus.ST_RECT);
		    NyARRealityTarget rt=this._pool.newNewTarget(i_track_target);
		    if(rt==null){
			    return null;
		    }
		    //個数制限
		    if(this._number_of_unknown>=this.MAX_LIMIT_UNKNOWN)
		    {
			    return null;
		    }
		    rt._target_type=NyARRealityTarget.RT_UNKNOWN;
		    this.target.pushAssert(rt);
		    this._number_of_unknown++;
		    return rt;
	    }