/** * この関数は、現在の基準パターンと検査パターンを比較して、類似度を計算します。 * @param i_patt * 検査パターンを格納したオブジェクトです。このサイズは、基準パターンと一致している必要があります。 * @param o_result * 結果を受け取るオブジェクトです。 * @return * 検査に成功するとtrueを返します。 * @ */ public bool evaluate(NyARMatchPattDeviationBlackWhiteData i_patt, NyARMatchPattResult o_result) { Debug.Assert(this._ref_code_patt != null); int[] linput = i_patt.getData(); int sum; double max = 0.0; int res = NyARMatchPattResult.DIRECTION_UNKNOWN; for (int j = 0; j < 4; j++) { //合計値初期化 sum = 0; NyARMatchPattDeviationBlackWhiteData code_patt = this._ref_code_patt.getBlackWhiteData(j); int[] pat_j = code_patt.getData(); //<全画素について、比較(FORの1/16展開)/> int i; for (i = this._pixels - 1; i >= 0; i--) { sum += linput[i] * pat_j[i]; } //0.7776737688877927がでればOK double sum2 = sum / code_patt.getPow() / i_patt.getPow();// sum2 = sum / patpow[k][j]/ datapow; if (sum2 > max) { max = sum2; res = j; } } o_result.direction = res; o_result.confidence = max; return(true); }
/** * 現在セットされているコードとパターンを比較して、結果値o_resultを更新します。 * 比較部分はFor文を16倍展開してあります。 */ public bool evaluate(NyARMatchPattDeviationBlackWhiteData i_patt, NyARMatchPattResult o_result) { Debug.Assert(this._code_patt != null); int[] linput = i_patt.refData(); int sum; double max = 0.0; int res = NyARMatchPattResult.DIRECTION_UNKNOWN; for (int j = 0; j < 4; j++) { //合計値初期化 sum = 0; NyARMatchPattDeviationBlackWhiteData code_patt = this._code_patt.getBlackWhiteData(j); int[] pat_j = code_patt.refData(); //<全画素について、比較(FORの1/16展開)/> int i; for (i = this._pixels - 1; i >= 0; i--) { sum += linput[i] * pat_j[i]; } //0.7776737688877927がでればOK double sum2 = sum / code_patt.getPow() / i_patt.getPow();// sum2 = sum / patpow[k][j]/ datapow; if (sum2 > max) { max = sum2; res = j; } } o_result.direction = res; o_result.confidence = max; return true; }
/** * 現在セットされているARコードとi_pattを比較します。 */ public bool evaluate(NyARMatchPattDeviationColorData i_patt, NyARMatchPattResult o_result) { Debug.Assert(this._code_patt != null); // int[] linput = i_patt.refData(); int sum; double max = Double.MinValue; int res = NyARMatchPattResult.DIRECTION_UNKNOWN; int for_mod = this._optimize_for_mod; for (int j = 0; j < 4; j++) { //合計値初期化 sum = 0; NyARMatchPattDeviationColorData code_patt = this._code_patt.getColorData(j); int[] pat_j = code_patt.refData(); //<全画素について、比較(FORの1/16展開)> int i; for (i = this._rgbpixels - 1; i >= for_mod; i--) { sum += linput[i] * pat_j[i]; } for (; i >= 0;) { sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; } //<全画素について、比較(FORの1/16展開)/> double sum2 = sum / code_patt.getPow(); // sum2 = sum / patpow[k][j]/ datapow; if (sum2 > max) { max = sum2; res = j; } } o_result.direction = res; o_result.confidence = max / i_patt.getPow(); return(true); }
/// <summary> /// Initialize a new SquareDetectionListener. /// </summary> /// <param name="patternMatchers">The pattern matchers with the marker data.</param> /// <param name="cameraParameters">The camera calibration data.</param> /// <param name="colorPattern">The used color pattern.</param> /// <param name="patternMatchDeviationData">The pattern match deviation data.</param> public SquareDetectionListener(List<PatternMatcher> patternMatchers, NyARParam cameraParameters, INyARColorPatt colorPattern, NyARMatchPattDeviationColorData patternMatchDeviationData) { this.patternMatchers = patternMatchers; this.colorPattern = colorPattern; this.patternMatchDeviationData = patternMatchDeviationData; this.coordinationMapper = new Coord2Linear(cameraParameters.getScreenSize(), cameraParameters.getDistortionFactor()); this.matrixCalculator = new NyARTransMat(cameraParameters); this.points = NyARIntPoint2d.createArray(4); this.evaluationResult = new NyARMatchPattResult(); Reset(); }
/** * 現在セットされているARコードとi_pattを比較します。 */ public bool evaluate(NyARMatchPattDeviationColorData i_patt, NyARMatchPattResult o_result) { Debug.Assert(this._code_patt != null); // int[] linput = i_patt.refData(); int sum; double max = Double.MinValue; int res = NyARMatchPattResult.DIRECTION_UNKNOWN; int for_mod = this._optimize_for_mod; for (int j = 0; j < 4; j++) { //合計値初期化 sum = 0; NyARMatchPattDeviationColorData code_patt = this._code_patt.getColorData(j); int[] pat_j = code_patt.refData(); //<全画素について、比較(FORの1/16展開)> int i; for (i = this._rgbpixels - 1; i >= for_mod; i--) { sum += linput[i] * pat_j[i]; } for (; i >= 0; ) { sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; sum += linput[i] * pat_j[i]; i--; } //<全画素について、比較(FORの1/16展開)/> double sum2 = sum / code_patt.getPow();// sum2 = sum / patpow[k][j]/ datapow; if (sum2 > max) { max = sum2; res = j; } } o_result.direction = res; o_result.confidence = max / i_patt.getPow(); return true; }