//ターゲット操作系関数 //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; }
/** * 新しい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); }
/** * このターゲットを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); }
/** * 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; }
//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); }
/** * このターゲットのステータスを、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; }
/** * 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); } }
//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; }