/** * このターゲットを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); }
/** * 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); } }
/** * 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; }
public static void updateRectStatus(NyARTargetList i_list, INyARVectorReader i_vecreader, NyARRectTargetStatusPool i_stpool, LowResolutionLabelingSamplerOut.Item[] source, int[] index) { NyARTarget[] rct = i_list.getArray(); NyARTarget d_ptr; //ターゲットの更新 for (int i = i_list.getLength() - 1; i >= 0; i--) { d_ptr = rct[i]; //年齢を加算 d_ptr._status_life--; //新しいステータスの作成 NyARRectTargetStatus st = i_stpool.newObject(); if (st == null) { //失敗(作れなかった?) d_ptr._delay_tick++; continue; } int sample_index = index[i]; LowResolutionLabelingSamplerOut.Item s = sample_index < 0?null:source[sample_index]; if (!st.setValueByAutoSelect(i_vecreader, s, (NyARRectTargetStatus)d_ptr._ref_status)) { st.releaseObject(); d_ptr._delay_tick++; continue; } else { if (s != null) { d_ptr.setSampleArea(s); } } d_ptr._ref_status.releaseObject(); d_ptr._ref_status = st; d_ptr._delay_tick = 0; } }