Ejemplo n.º 1
0
        /**
         * この関数は、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;
        }
Ejemplo n.º 2
0
            /**
             * 矩形が見付かるたびに呼び出されます。
             * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。
             */
            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
                    }
                }
            }