/** * i_indexのマーカーに対する変換行列を計算し、結果値をo_resultへ格納します。 直前に実行したdetectMarkerLiteが成功していないと使えません。 * * @param i_index * マーカーのインデックス番号を指定します。 直前に実行したdetectMarkerLiteの戻り値未満かつ0以上である必要があります。 * @param o_result * 結果値を受け取るオブジェクトを指定してください。 * @throws NyARException */ public void getTransmationMatrix(int i_index, NyARTransMatResult o_result) { NyARDetectMarkerResult result = this._square_detect.result_stack.getItem(i_index); // 一番一致したマーカーの位置とかその辺を計算 if (_is_continue) { _transmat.transMatContinue(result.square, this._offset[result.arcode_id], o_result, o_result); } else { _transmat.transMat(result.square, this._offset[result.arcode_id], o_result); } return; }
/** * この関数は、i_index番目に検出したマーカの、変換行列を計算します。 * 直前に実行した{@link #detectMarkerLite}が成功していないと使えません。 * @param i_index * 検出結果のインデックス番号を指定します。 * この値は、0から{@link #detectMarkerLite}関数の戻り値-1の数です。 * @param o_result * 結果値を受け取るオブジェクト * @ */ public void getTransmationMatrix(int i_index, NyARDoubleMatrix44 o_result) { Debug.Assert(o_result != null); NyARDetectMarkerResult result = this._square_detect.result_stack.getItem(i_index); // 一番一致したマーカーの位置とかその辺を計算 if (this._is_continue) { //履歴が使えそうか判定 if (result.ref_last_input_matrix == o_result) { if (this._transmat.transMatContinue(result.square, this._offset[result.arcode_id], o_result, result.last_result_param.last_error, o_result, result.last_result_param)) { return; } } } //履歴使えないor継続認識失敗 this._transmat.transMat(result.square, this._offset[result.arcode_id], o_result, result.last_result_param); result.ref_last_input_matrix = o_result; return; }
/** * 矩形が見付かるたびに呼び出されます。 * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。 */ public void detectMarkerCallback(NyARIntCoordinates i_coord, int[] i_vertex_index) { NyARMatchPattResult mr = this.__detectMarkerLite_mr; //輪郭座標から頂点リストに変換 NyARIntPoint2d[] vertex = this.__ref_vertex; vertex[0] = i_coord.items[i_vertex_index[0]]; vertex[1] = i_coord.items[i_vertex_index[1]]; vertex[2] = i_coord.items[i_vertex_index[2]]; vertex[3] = i_coord.items[i_vertex_index[3]]; //画像を取得 if (!this._inst_patt.pickFromRaster(this._ref_raster, vertex)) { return; } //取得パターンをカラー差分データに変換して評価する。 this._deviation_data.setRaster(this._inst_patt); //最も一致するパターンを割り当てる。 int square_index, direction; double confidence; this._match_patt[0].evaluate(this._deviation_data, mr); square_index = 0; direction = mr.direction; confidence = mr.confidence; //2番目以降 for (int i = 1; i < this._match_patt.Length; i++) { this._match_patt[i].evaluate(this._deviation_data, mr); if (confidence > mr.confidence) { continue; } // もっと一致するマーカーがあったぽい square_index = i; direction = mr.direction; confidence = mr.confidence; } //最も一致したマーカ情報を、この矩形の情報として記録する。 NyARDetectMarkerResult result = this.result_stack.prePush(); result.arcode_id = square_index; result.confidence = confidence; NyARSquare sq = result.square; //directionを考慮して、squareを更新する。 for (int i = 0; i < 4; i++) { int idx = (i + 4 - direction) % 4; this._coordline.coord2Line(i_vertex_index[idx], i_vertex_index[(idx + 1) % 4], i_coord, sq.line[i]); } for (int i = 0; i < 4; i++) { //直線同士の交点計算 if (!sq.line[i].crossPos(sq.line[(i + 3) % 4], sq.sqvertex[i])) { throw new NyARException();//ここのエラー復帰するならダブルバッファにすればOK } } }