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
 /**
  * このターゲットを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 #7
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 #8
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 #9
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;
        }