/** * super classの機能に、予測位置からの探索を追加します。 */ public override int getMatchTargetIndex(LowResolutionLabelingSamplerOut.Item i_item) { //1段目:通常の検索 int ret = base.getMatchTargetIndex(i_item); if (ret >= 0) { return(ret); } //2段目:予測位置から検索 NyARRectTargetStatus iitem; int min_d = int.MaxValue; //対角範囲の距離が、対角距離の1/2以下で、最も小さいこと。 for (int i = this._length - 1; i >= 0; i--) { iitem = (NyARRectTargetStatus)this._items[i]._ref_status; int d; d = i_item.base_area.sqDiagonalPointDiff(iitem.estimate_rect); if (d < min_d) { min_d = d; ret = i; } } //許容距離誤差の2乗を計算(対角線の20%以内) //(Math.sqrt((i_item.area.w*i_item.area.w+i_item.area.h*i_item.area.h))/5)^2 if (min_d < (2 * (i_item.base_area_sq_diagonal) / 25)) { return(ret); } return(-1); }
/** * @Override */ protected override void OnLabelFound(NyARRleLabelFragmentInfo iRefLabel) { //widthとheightの計算 int w = iRefLabel.clip_r - iRefLabel.clip_l; int h = iRefLabel.clip_b - iRefLabel.clip_t; //1*1(1bitPixelの5*5)以下の場合は、検出不能 //未実装部分:2*2(1bitPixelの8*8)以下の場合は、解像度1で再検出 //未実装部分:3*3,4*4(1bitPixelの12*12,16*16)以下の場合は、解像度2で再検出 if (w < 10 || h < 10) { //今のところは再検出機構なし。 return; } LowResolutionLabelingSamplerOut.Item item = current_output.prePush(); if (item == null) { return; } int pix = this._pix; item.entry_pos.x = iRefLabel.entry_x; item.entry_pos.y = iRefLabel.clip_t; item.base_area.x = iRefLabel.clip_l * pix; item.base_area.y = iRefLabel.clip_t * pix; item.base_area.w = w * pix; item.base_area.h = h * pix; item.base_area_center.x = item.base_area.x + item.base_area.w / 2; item.base_area_center.y = item.base_area.y + item.base_area.h / 2; item.base_area_sq_diagonal = (w * w + h * h) * (pix * pix); item.lebeling_th = this.current_th; }
//ターゲット操作系関数 //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); }
/** * Sampleの位置キーに一致する可能性の高い要素のインデクスを1つ返します。 * @param i_item * @return * 一致する可能性が高い要素のインデクス番号。見つからないときは-1 */ public virtual int getMatchTargetIndex(LowResolutionLabelingSamplerOut.Item i_item) { NyARTarget iitem; int ret = -1; int min_d = int.MaxValue; //対角範囲の距離が、対角距離の1/2以下で、最も小さいこと。 for (int i = this._length - 1; i >= 0; i--) { iitem = this._items[i]; int d; d = i_item.base_area.sqDiagonalPointDiff(iitem._sample_area); if (d < min_d) { min_d = d; ret = i; } } //許容距離誤差の2乗を計算(対角線の20%以内) //(Math.sqrt((i_item.area.w*i_item.area.w+i_item.area.h*i_item.area.h))/5)^2 if (min_d < (2 * (i_item.base_area_sq_diagonal) / 25)) { return(ret); } return(-1); }
/** * @Override */ public override int releaseObject() { int ret = base.releaseObject(); if (ret == 0 && this.current_sampleout != null) { this.current_sampleout.releaseObject(); this.current_sampleout = null; } return(ret); }
/** * ターゲットリストを参考に、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; }
/** * 状況に応じて矩形選択手法を切り替えます。 * @param i_vec_reader * サンプリングデータの基本画像にリンクしたVectorReader * @param i_source * サンプリングデータ * @param i_prev_status * 前回の状態を格納したオブジェクト * @return * @throws NyARException */ public bool setValueByAutoSelect(INyARVectorReader i_vec_reader, LowResolutionLabelingSamplerOut.Item i_source, NyARRectTargetStatus i_prev_status) { int current_detect_type = DT_SQDAILY; //移動速度による手段の切り替え int sq_v_ave_limit = i_prev_status.estimate_sum_sq_vertex_velocity_ave / 4; //速度が小さい時か、前回LineLogが成功したときはDT_LIDAILY if (((sq_v_ave_limit < 10) && (i_prev_status.detect_type == DT_SQDAILY)) || (i_prev_status.detect_type == DT_LIDAILY)) { current_detect_type = DT_LIDAILY; } //前回の動作ログによる手段の切り替え switch (current_detect_type) { case DT_LIDAILY: //LineLog-> if (setValueByLineLog(i_vec_reader, i_prev_status)) { //うまくいった。 this.detect_type = DT_LIDAILY; return(true); } if (i_source != null) { if (setValueWithDeilyCheck(i_vec_reader, i_source, i_prev_status)) { //うまくいった this.detect_type = DT_SQDAILY; return(true); } } break; case DT_SQDAILY: if (i_source != null) { if (setValueWithDeilyCheck(i_vec_reader, i_source, i_prev_status)) { this.detect_type = DT_SQDAILY; return(true); } } break; default: break; } //前回の動作ログを書き換え i_prev_status.detect_type = DT_FAILED; return(false); }
/** * 値をセットします。この関数は、処理の成功失敗に関わらず、内容変更を行います。 * @param i_src * セットするLowResolutionLabelingSamplerOut.Itemを指定します。関数は、このアイテムの参照カウンタをインクリメントします。 * @throws NyARException */ public void setValue(LowResolutionLabelingSamplerOut.Item i_src) { if (this.current_sampleout != null) { this.current_sampleout.releaseObject(); } if (i_src != null) { this.current_sampleout = (LowResolutionLabelingSamplerOut.Item)i_src.referenceObject(); } else { this.current_sampleout = 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_sampler_in * @param i_source * @param i_prev_status * @return * @throws NyARException */ public bool setValueWithDeilyCheck(INyARVectorReader i_vec_reader, LowResolutionLabelingSamplerOut.Item i_source, NyARRectTargetStatus i_prev_status) { VecLinearCoordinates vecpos = this._ref_my_pool._vecpos; //輪郭線を取る if (!i_vec_reader.traceConture(i_source.lebeling_th, i_source.entry_pos, vecpos)) { return(false); } //3,4象限方向のベクトルは1,2象限のベクトルに変換する。 vecpos.limitQuadrantTo12(); //ベクトルのマージ this._ref_my_pool._vecpos_op.MargeResembleCoords(vecpos); if (vecpos.length < 4) { return(false); } //キーベクトルを取得 vecpos.getKeyCoord(this._ref_my_pool._indexbuf); //点に変換 NyARDoublePoint2d[] this_vx = this.vertex; if (!this._ref_my_pool._line_detect.line2SquareVertex(this._ref_my_pool._indexbuf, this_vx)) { return(false); } //頂点並び順の調整 rotateVertexL(this.vertex, checkVertexShiftValue(i_prev_status.vertex, this.vertex)); //パラメタチェック if (!checkDeilyRectCondition(i_prev_status)) { return(false); } //次回の予測 setEstimateParam(i_prev_status); return(true); }
public NyARNewTargetStatus(INyARManagedObjectPoolOperater i_ref_pool_operator) : base(i_ref_pool_operator) { this.current_sampleout = null; }
/** * LowResolutionLabelingSamplerOut.Itemの値をを元に、sample_areaにRECTを設定します。 * @param i_item * 設定する値です。 */ public void setSampleArea(LowResolutionLabelingSamplerOut.Item i_item) { this._sample_area.setValue(i_item.base_area); }