Beispiel #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);
        }
Beispiel #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;
        }
Beispiel #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へ遷移
     }
 }
Beispiel #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;
        }
Beispiel #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;
 }
Beispiel #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);
        }
Beispiel #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);
 }
Beispiel #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;
        }
Beispiel #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);
        }
Beispiel #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);
 }
Beispiel #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;
        }
Beispiel #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;
        }
Beispiel #13
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;
 }