2012-07-31 110 views
2

我試圖在我的Android手機相機中抓取一個圖像,使用此圖像的ROI定義模板,然後在抓取連續圖像時執行模板匹配以查找模板的新位置。使用OpenCV進行模板匹配

的問題是,它似乎模板匹配沒有運行:所有的時間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); 
+0

不是答案,但模板匹配幾乎總是一個不好的解決方案來定位/跟蹤對象。 – Sam 2012-08-01 07:26:55

+0

@vasile,我知道,我只是想編寫一些快速而簡單的代碼......最終我花了大約4小時在這 – 2012-08-01 12:02:39

+0

@YanaiAnkri你能否提供一些關於[這個問題]的建議(http://stackoverflow.com/問題/ 29072000/opencv4android-template-matching-using-camera)? – 2015-03-16 08:02:51

回答

2

我可能是遙遠這裏,但我相信,子陣列方法返回一個指向mGray子矩陣的指針。因此,您的模板會逐幀更改,因爲mRgba總是被複制到mGray中,但mGray永遠不會被重新分配。在這種情況下,解決方案是製作mGray子矩陣的副本。在C++中,這將是這樣的:

mGray.submat(Y-H/2, Y+H/2, X-W/2, X+W/2).copyTo(template); 
+0

這項工作!謝謝!! – 2012-08-03 13:03:55