Esempio n. 1
0
        /**
         * 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);
        }
Esempio n. 2
0
        /**
         * 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);
        }
Esempio n. 3
0
        //ターゲット操作系関数

        //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);
        }
            /**
             * @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;
            }
        /**
         * @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);
        }
Esempio n. 6
0
 /**
  * ターゲットリストを参考に、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;
 }
Esempio n. 7
0
        /**
         * 状況に応じて矩形選択手法を切り替えます。
         * @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;
     }
 }
Esempio n. 9
0
        /**
         * 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;
            }
        }
Esempio n. 10
0
        /**
         * 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;
            }
        }
Esempio n. 11
0
        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;
            }
        }
Esempio n. 12
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);
        }
 /**
  * LowResolutionLabelingSamplerOut.Itemの値をを元に、sample_areaにRECTを設定します。
  * @param i_item
  * 設定する値です。
  */
 public void setSampleArea(LowResolutionLabelingSamplerOut.Item i_item)
 {
     this._sample_area.setValue(i_item.base_area);
 }
 /**
  * @param i_vecreader
  * @param i_sample
  * @return
  * @throws NyARException
  */
 public bool setValue(INyARVectorReader i_vecreader, LowResolutionLabelingSamplerOut.Item i_sample)
 {
     return(i_vecreader.traceConture(i_sample.lebeling_th, i_sample.entry_pos, this.vecpos));
 }
Esempio n. 15
0
 public NyARNewTargetStatus(INyARManagedObjectPoolOperater i_ref_pool_operator)
     : base(i_ref_pool_operator)
 {
     this.current_sampleout = null;
 }