2

Android 携帯カメラで 1 つの画像を取得し、この画像から ROI を使用してテンプレートを定義し、連続する画像が取得されたら、テンプレート マッチングを実行してテンプレートの新しい場所を見つけようとしています。

問題は、テンプレート マッチングが実行されていないように見えることです。maxVal値は常に約 0.99 であり、テンプレートの元の場所 ( 、以下)maxLocとまったく同じです。XY

私は何を間違っていますか?

フレームを取得するときのコードは次のとおりです。

protected Bitmap processFrame(VideoCapture capture) {  
    capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);  
    Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_BGRA2GRAY);  
    Mat corrMap = new Mat();  
    Imgproc.matchTemplate(mGray, template, corrMap, Imgproc.TM_CCOEFF_NORMED);  
    MinMaxLocResult locRes = Core.minMaxLoc(corrMap);  
    double maxVal = locRes.maxVal;  
    Point maxLoc = locRes.maxLoc;  
    Scalar c = new Scalar(255, 0, 0, 255);  
    Core.putText(mRgba, Double.toString(maxVal), new Point(100,100), 3, 1, c, 2);  
    Core.putText(mRgba, Double.toString(maxLoc.x), new Point(100,130), 3, 1, c, 2);  
    Core.putText(mRgba, Double.toString(maxLoc.y), new Point(100,160), 3, 1, c, 2);  
}

テンプレートを生成するコードは次のとおりです。

X = 100;  
Y = 100;  
H = 150;  
W = 200;  
template = mGray.submat(Y-H/2, Y+H/2, X-W/2, X+W/2);
4

1 に答える 1

2

私はここから遠く離れているかもしれませんが、submat メソッドは mGray の部分行列へのポインターを返すと信じています。したがって、mRgba は常に mGray にコピーされますが、mGray が再割り当てされることはないため、テンプレートはフレームごとに変更されます。この場合の解決策は、mGray サブマトリックスのコピーを作成することです。C++ では、次のようになります。

mGray.submat(Y-H/2, Y+H/2, X-W/2, X+W/2).copyTo(template);
于 2012-08-01T16:27:32.207 に答える