示例#1
0
        /**
         * インスタンスの状態をリセットする。
         */

        /**
         * o_posの状況に対応して、candidateから候補IDを選択します。
         * @param candidate
         * @param prelog
         * @param o_pos
         * @param xsize
         * @param ysize
         * @return
         */
        public int ar2SelectTemplate(NyARSurfaceFeatures candidate, NyARFeatureCoordPtrList prelog, NyARSurfaceFeaturesPtr o_pos, NyARIntSize i_screen_size)
        {
            switch (o_pos.getLength())
            {
            case 0:
                return(select0(candidate, i_screen_size.w, i_screen_size.h));

            case 1:
                return(select1(candidate, i_screen_size.w, i_screen_size.h, o_pos.getItem(0)));

            case 2:
                return(select2(candidate, i_screen_size.w, i_screen_size.h, o_pos.getItem(0), o_pos.getItem(1)));

            case 3:
                return(select3(candidate, i_screen_size.w, i_screen_size.h, o_pos.getItem(0), o_pos.getItem(1), o_pos.getItem(2)));

            default:
                return(selectHistory(candidate, prelog));
            }
        }
示例#2
0
        /**
         * i_rasiterの画像から、i_surfaceにマッチするパターンを検出して、その理想座標と3次元座標セットを返す。
         * 検出した頂点セットは、o_pos2dとo_pos3dへ最大i_num個出力する。
         * @param i_raster
         * 現在の画像
         * @param i_surface
         * 検出すべきサーフェイスセット
         * @param i_trans
         * 現在の姿勢変換行列
         * @param o_pos2d
         * 出力パラメータ。画面上の理想点。
         * オブジェクトの配列を指定すること。
         * @param o_pos3d
         * 出力パラメータ。三次元サーフェイス座標。
         * オブジェクトの配列を指定すること。
         * @param i_num
         * 返却数。この数値は、コンストラクタに与えた最大数以下である必要がある。o_pos2dとo_pos3dは、この数値より大きい配列でなければならない。
         * @return
         * 検出した頂点セットの数。
         * @throws NyARException
         */
        public int tracking(INyARGrayscaleRaster i_raster, NyARSurfaceDataSet i_surface, NyARDoubleMatrix44 i_trans, NyARDoublePoint2d[] o_pos2d, NyARDoublePoint3d[] o_pos3d, int i_num)
        {
            //テンプレートドライバの更新
            INyARTemplateMatchingDriver tmd;

            if (this._last_raster != i_raster)
            {
                tmd = this._last_driver = new NyARTemplateMatchingDriver_INT1D(i_raster, 12, 12);
                this._last_raster = i_raster;
            }
            else
            {
                tmd = this._last_driver;
            }
            //射影変換行列の計算とログへの追加
            NyARSurfaceTransMatrixSet tlog = this._ctrans_log.preAdd();

            tlog.setValue(this._ref_cparam.getPerspectiveProjectionMatrix(), i_trans);


            //可視な候補を選択する。(一時リスト)
            this._feature_selector.extractVisibleFeatures(i_surface.fset, tlog, this._candidate, this._candidate2);
            PatchImagePositions pcpoints = this.__pcpoints;

            //load screen size.
            NyARIntSize s = this._ref_cparam.getScreenSize();

            //頂点選択クラス類の初期化
            NyARSurfaceFeatureIndexSelector index_selecter    = this.__index_selecter;
            NyARSurfaceFeaturesPtr          selected_features = this.__selected_features;

            selected_features.clear();
            //最大返却数の決定
            int max_feature = i_num > this.__selected_features.getArraySize() ? this.__selected_features.getArraySize() : i_num;

            int num = 0;
            NyARSurfaceFeatures current_candidate = this._candidate;

            for (int i = max_feature - 1; i >= 0; i--)
            {
                //高精度を優先して探索。なければ低精度に切り替える。切替は1度だけ。出力は座標集合。
                int k = index_selecter.ar2SelectTemplate(current_candidate, this._prev_selected_features, selected_features, s);
                if (k < 0)
                {
                    if (current_candidate == this._candidate2)
                    {
                        break;
                    }
                    current_candidate = this._candidate2;
                    //未選択なら終了
                    k = index_selecter.ar2SelectTemplate(current_candidate, this._prev_selected_features, selected_features, s);
                    if (k < 0)
                    {
                        break;
                    }
                }
                //候補kを確保
                NyARSurfaceFeatureItem cai = current_candidate.getItem(k);


                //可視な点について、トラッキングするためのパッチ画像を生成
                NyARTemplatePatchImage template_ = this.__template_patch;
                template_.makeFromReferenceImage((int)(cai.x + 0.5), (int)(cai.y + 0.5), tlog.ctrans, this._ref_cparam.getDistortionFactor(), i_surface.iset.items[cai.scale]);

                //パッチ画像の内容をチェック?
                if (template_.vlen * template_.vlen >= (template_.xsize) * (template_.ysize) * AR2_DEFALUT_TRACKING_SD_THRESH * AR2_DEFALUT_TRACKING_SD_THRESH)
                {
                    //射影変換行列ログから候補点を作る。
                    int number_of_point = pcpoints.makeCandidatePos(cai, this._ctrans_log);

                    //画像からテンプレートを検索
                    double sim = tmd.ar2GetBestMatching(template_, pcpoints.pos, number_of_point, o_pos2d[num]);
                    //類似値が一定以上なら、保存
                    if (sim > this.simThresh)
                    {
                        if (selected_features.push(cai) == null)
                        {
                            break;//最大値に達したら終わり
                        }
                        this._ref_cparam.getDistortionFactor().observ2Ideal(o_pos2d[num], o_pos2d[num]);
                        o_pos3d[num].x = cai.ref_feature.mx;
                        o_pos3d[num].y = cai.ref_feature.my;
                        o_pos3d[num].z = 0;
                        //選択した得量を記録
                        num++;
                    }
                }
                //選択された候補を取り外す。
                current_candidate.remove(k);
            }
            // 過去ログへ記録
            this._prev_selected_features.clear();
            for (int i = 0; i < selected_features.getLength(); i++)
            {
                this._prev_selected_features.push(selected_features.getItem(i).ref_feature);
            }
            return(num);
        }