2

我试图在我的 Android 手机摄像头中抓取一张图像,使用该图像中的 ROI 定义一个模板,然后在抓取连续图像时,进行模板匹配以找到模板的新位置。

问题是模板匹配似乎没有运行:maxVal值一直在 0.99 左右,而maxLoc正是模板的原始位置(X下面的Y)。

我究竟做错了什么?

这是抓取帧时的代码:

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 回答