/** * インスタンスの状態をリセットする。 */ /** * 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)); } }
/** * 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); }