/** * コンストラクタです。 * ファイルイメージからデータセットを生成します。 * @param i_iset * @param i_fset * @param i_freak_fset * @param i_freak_fset_page_id */ public NyARNftDataSet(NyARNftIsetFile i_iset, NyARNftFsetFile i_fset, NyARNftFreakFsetFile i_freak_fset, int i_freak_fset_page_id, double i_width_in_msec) { if (!Double.IsNaN(i_width_in_msec)) { scaling(i_iset, i_fset, i_freak_fset, i_freak_fset_page_id, i_width_in_msec); } this.surface_dataset = new NyARSurfaceDataSet(i_iset, i_fset); this.freak_fset = new KeyframeMap(i_freak_fset, i_freak_fset_page_id); }
/** * 現在の特徴点セットから、 * @param i_keymap * @param i_result * @return */ public bool kpmMatching(KeyframeMap i_keymap, NyARDoubleMatrix44 i_transmat) { FeaturePairStack result = new FeaturePairStack(kMaxNumFeatures); if (!this.query(this.mQueryKeyframe, i_keymap, result)) { return(false); } return(kpmUtilGetPose_binary(this._ref_cparam, result, i_transmat, this._result_param)); }
private bool query(FreakFeaturePointStack query_keyframe, KeyframeMap i_keymap, FeaturePairStack i_result) { // mMatchedInliers.clear(); HomographyMat H = this._H; InverseHomographyMat hinv = this._hinv; hinv = new InverseHomographyMat_O1(); int num_of_query_frame = query_keyframe.getLength(); //ワークエリアの設定 if (num_of_query_frame > this._tmp_pair_stack[0].getArraySize()) { this._tmp_pair_stack[0] = new FeaturePairStack(num_of_query_frame + 10); this._tmp_pair_stack[1] = new FeaturePairStack(num_of_query_frame + 10); } int tmp_ch = 0; int last_inliers = 0; foreach (KeyValuePair <int, Keyframe> i in i_keymap) { Keyframe second = i.Value; FreakMatchPointSetStack ref_points = second.getFeaturePointSet(); //新しいワークエリアを作る。 FeaturePairStack match_result = this._tmp_pair_stack[tmp_ch]; //ワークエリア初期化 match_result.clear(); //特徴量同士のマッチング if (this._matcher.match(query_keyframe, second, match_result) < this.mMinNumInliers) { continue; } // Vote for a transformation based on the correspondences if (!this.mHoughSimilarityVoting.extractMatches(match_result, second.width(), second.height())) { continue; } // Estimate the transformation between the two images if (!this.mRobustHomography.PreemptiveRobustHomography(H, match_result, second.width(), second.height())) { continue; } //ここでHInv計算 if (!hinv.inverse(H)) { continue; } // Apply some heuristics to the homography if (!hinv.checkHomographyHeuristics(second.width(), second.height())) { continue; } // Find the inliers this._find_inliner.extructMatches(H, match_result); if (match_result.getLength() < mMinNumInliers) { continue; } // // Use the estimated homography to find more inliers match_result.clear(); if (_matcher.match(query_keyframe, ref_points, hinv, 10, match_result) < mMinNumInliers) { continue; } // // Vote for a similarity with new matches if (!this.mHoughSimilarityVoting.extractMatches(match_result, second.width(), second.height())) { continue; } // // Re-estimate the homography if (!this.mRobustHomography.PreemptiveRobustHomography(H, match_result, second.width(), second.height())) { continue; } // Apply some heuristics to the homography if (!hinv.inverse(H)) { continue; } if (!hinv.checkHomographyHeuristics(second.width(), second.height())) { continue; } // // Check if this is the best match based on number of inliers this._find_inliner.extructMatches(H, match_result); //ポイント数が最小値より大きい&&最高成績ならテンポラリチャンネルを差し替える。 if (match_result.getLength() >= mMinNumInliers && match_result.getLength() > last_inliers) { //出力チャンネルを切り替え tmp_ch = (tmp_ch + 1) % 2; last_inliers = match_result.getLength(); } } //出力は last_inlines>0の場合に[(tmp_ch+1)%2]にある。 if (last_inliers <= 0) { return(false); } { FeaturePairStack match_result = this._tmp_pair_stack[(tmp_ch + 1) % 2]; FeaturePairStack.Item[] dest = match_result.getArray(); for (int i = 0; i < match_result.getLength(); i++) { FeaturePairStack.Item t = i_result.prePush(); if (t == null) { System.Console.WriteLine("Push overflow!"); break; } t.query = dest[i].query; t.ref_ = dest[i].ref_; } } return(true); }