Beispiel #1
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;
 }
Beispiel #2
0
 /**
  * トラックターゲットリストから、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);
 }
Beispiel #3
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;
            }
        }
Beispiel #4
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;
            }
        }
Beispiel #5
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;
            }
        }
Beispiel #6
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;
        }
Beispiel #7
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;
            }
        }
Beispiel #8
0
 public void makePairIndexes(SampleStack igsource, NyARTargetList igtr, int[] index)
 {
     this.setPointDists(igsource.getArray(), igsource.getLength(), igtr.getArray(), igtr.getLength());
     this.getMinimumPair(index);
     return;
 }
Beispiel #9
0
        /**
         * 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;
        }