//ターゲット操作系関数 //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); }
/** * このターゲットのステータスを、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; }
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へ遷移 } }
/** * 指定したインデクスのターゲットをリストから削除します。 * ターゲットだけを外部から参照している場合など、ターゲットの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; }
/** * ターゲットリストを参考に、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; }
/** * このターゲットを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); }
/** * このターゲットのステータスを、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); }
/** * 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; }
/** * 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; }