/** * ターゲットリストを参考に、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; }
/** * トラックターゲットリストから、tagがNULLの{@link NyARTargetStatus#ST_RECT}アイテムを探して返します。 * @return */ private static NyARTarget FindEmptyTagItem(NyARTargetList i_list) { NyARTarget[] items = i_list.getArray(); for (int i = i_list.getLength() - 1; i >= 0; i--) { if (items[i]._st_type != NyARTargetStatus.ST_RECT) { continue; } if (items[i].tag != null) { continue; } return(items[i]); } return(null); }
/** * ContoureTargetのステータスを更新します。 * @param i_list * @param i_vecreader * @param i_stpool * @param source * @param index * @throws NyARException */ public static void updateContureStatus(NyARTargetList i_list, INyARVectorReader i_vecreader, NyARContourTargetStatusPool i_stpool, LowResolutionLabelingSamplerOut.Item[] source, int[] index) { NyARTarget[] crd = i_list.getArray(); NyARTarget d_ptr; //ターゲットの更新 for (int i = i_list.getLength() - 1; i >= 0; i--) { d_ptr = crd[i]; int sample_index = index[i]; //年齢を加算 d_ptr._status_life--; if (sample_index < 0) { //このターゲットに合致するアイテムは無い。 d_ptr._delay_tick++; continue; } LowResolutionLabelingSamplerOut.Item s = source[sample_index]; //失敗の可能性を考慮して、Statusを先に生成しておく NyARContourTargetStatus st = i_stpool.newObject(); if (st == null) { //失敗(作れなかった?) d_ptr._delay_tick++; continue; } if (!st.setValue(i_vecreader, s)) { //新しいステータスのセットに失敗? st.releaseObject(); d_ptr._delay_tick++; continue; } d_ptr.setSampleArea(s); d_ptr._delay_tick = 0; //ref_statusの切り替え d_ptr._ref_status.releaseObject(); d_ptr._ref_status = st; } }
/** * NewTargetのステータスを更新します。 * @param i_sample * @throws NyARException */ public static void updateNewStatus(NyARTargetList i_list, NyARNewTargetStatusPool i_pool, LowResolutionLabelingSamplerOut.Item[] source, int[] index) { NyARTarget d_ptr; NyARTarget[] i_nes = i_list.getArray(); //ターゲットの更新 for (int i = i_list.getLength() - 1; i >= 0; i--) { d_ptr = i_nes[i]; int sample_index = index[i]; //年齢を加算 d_ptr._status_life--; if (sample_index < 0) { //このターゲットに合致するアイテムは無い。 ((NyARNewTargetStatus)d_ptr._ref_status).setValue(null); d_ptr._delay_tick++; continue; } LowResolutionLabelingSamplerOut.Item s = source[sample_index]; //先にステータスを作成しておく NyARNewTargetStatus st = i_pool.newObject(); if (st == null) { //ステータスの生成に失敗 d_ptr._delay_tick++; //System.out.println("updateNewStatus:status pool full"); continue; } //新しいステータス値のセット st.setValue(s); //ターゲットの更新 d_ptr.setSampleArea(s); d_ptr._delay_tick = 0; //ref_statusのセットと切り替え(失敗時の上書き防止のためにダブルバッファ化) d_ptr._ref_status.releaseObject(); d_ptr._ref_status = st; } }
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; } }
/** * コンストラクタです。 * @param i_max_new * Newトラックターゲットの最大数を指定します。 * @param i_max_cont * Contourトラックターゲットの最大数を指定します。 * @param i_max_rect * Rectトラックターゲットの最大数を指定します。 * @throws NyARException */ public NyARTracker(int i_max_new, int i_max_cont, int i_max_rect) { //環境定数の設定 this.MAX_NUMBER_OF_NEW = i_max_new; this.MAX_NUMBER_OF_CONTURE = i_max_cont; this.MAX_NUMBER_OF_RECT = i_max_rect; this.MAX_NUMBER_OF_TARGET = (i_max_new + i_max_cont + i_max_rect) * 5; //ターゲットマップ用の配列と、リスト。この関数はNyARTargetStatusのIDと絡んでるので、気をつけて! this._temp_targets = new NyARTargetList[NyARTargetStatus.MAX_OF_ST_KIND + 1]; this._temp_targets[NyARTargetStatus.ST_NEW] = new NyARTargetList(i_max_new); this._temp_targets[NyARTargetStatus.ST_IGNORE] = new NyARTargetList(this.MAX_NUMBER_OF_TARGET); this._temp_targets[NyARTargetStatus.ST_CONTURE] = new NyARTargetList(i_max_cont); this._temp_targets[NyARTargetStatus.ST_RECT] = new NyARRectTargetList(i_max_rect); //ソースリスト this._newsource = new SampleStack(i_max_new); this._igsource = new SampleStack(this.MAX_NUMBER_OF_TARGET); this._coordsource = new SampleStack(i_max_cont); this._rectsource = new SampleStack(i_max_rect); //ステータスプール this.newst_pool = new NyARNewTargetStatusPool(i_max_new * 2); this.contourst_pool = new NyARContourTargetStatusPool(i_max_rect + i_max_cont * 2); this.rect_pool = new NyARRectTargetStatusPool(i_max_rect * 2); //ターゲットプール this.target_pool = new NyARTargetPool(this.MAX_NUMBER_OF_TARGET); //ターゲット this._targets = new NyARTargetList(this.MAX_NUMBER_OF_TARGET); //ここ注意!マップの最大値は、ソースアイテムの個数よりおおきいこと! this._map = new DistMap(this.MAX_NUMBER_OF_TARGET, this.MAX_NUMBER_OF_TARGET); this._index = new int[this.MAX_NUMBER_OF_TARGET]; //定数初期化 this._number_of_new = this._number_of_ignore = this._number_of_contoure = this._number_of_rect = 0; }
// //update // private static void updateIgnoreStatus(NyARTargetList i_igliet, LowResolutionLabelingSamplerOut.Item[] source, int[] index) { NyARTarget d_ptr; //マップする。 NyARTarget[] i_ignore_target = i_igliet.getArray(); //ターゲットの更新 for (int i = i_igliet.getLength() - 1; i >= 0; i--) { d_ptr = i_ignore_target[i]; int sample_index = index[i]; //年齢を加算 d_ptr._status_life--; if (sample_index < 0) { //このターゲットに合致するアイテムは無い。 d_ptr._delay_tick++; continue; } d_ptr.setSampleArea(source[sample_index]); d_ptr._delay_tick = 0; } }
public void makePairIndexes(SampleStack igsource, NyARTargetList igtr, int[] index) { this.setPointDists(igsource.getArray(), igsource.getLength(), igtr.getArray(), igtr.getLength()); this.getMinimumPair(index); return; }
/** * Trackerの状態を更新します。 * @param i_source * @throws NyARException */ public void progress(NyARTrackerSource i_s) { //SampleOutを回収 LowResolutionLabelingSamplerOut sample_out = i_s.makeSampleOut(); NyARTargetList[] targets = this._temp_targets; NyARTargetList newtr = targets[NyARTargetStatus.ST_NEW]; NyARTargetList igtr = targets[NyARTargetStatus.ST_IGNORE]; NyARTargetList cotr = targets[NyARTargetStatus.ST_CONTURE]; NyARTargetList retw = targets[NyARTargetStatus.ST_RECT]; INyARVectorReader vecreader = i_s.getBaseVectorReader(); //ターゲットリストの振り分け NyARTarget[] target_array = this._targets.getArray(); newtr.clear(); igtr.clear(); cotr.clear(); retw.clear(); for (int i = this._targets.getLength() - 1; i >= 0; i--) { targets[target_array[i]._st_type].pushAssert(target_array[i]); } int[] index = this._index; //サンプルをターゲット毎に振り分け sampleMapper(sample_out, newtr, igtr, cotr, retw, this._newsource, this._igsource, this._coordsource, this._rectsource); //ターゲットの更新 this._map.makePairIndexes(this._igsource, igtr, index); updateIgnoreStatus(igtr, this._igsource.getArray(), index); this._map.makePairIndexes(this._newsource, newtr, index); updateNewStatus(newtr, this.newst_pool, this._newsource.getArray(), index); this._map.makePairIndexes(this._rectsource, retw, index); updateRectStatus(retw, vecreader, this.rect_pool, this._rectsource.getArray(), index); this._map.makePairIndexes(this._coordsource, cotr, index); updateContureStatus(cotr, vecreader, this.contourst_pool, this._coordsource.getArray(), index); //ターゲットのアップグレード for (int i = this._targets.getLength() - 1; i >= 0; i--) { switch (target_array[i]._st_type) { case NyARTargetStatus.ST_IGNORE: upgradeIgnoreTarget(i); continue; case NyARTargetStatus.ST_NEW: upgradeNewTarget(target_array[i], vecreader); continue; case NyARTargetStatus.ST_RECT: upgradeRectTarget(target_array[i]); continue; case NyARTargetStatus.ST_CONTURE: upgradeContourTarget(target_array[i]); continue; } } return; }