我试图在Android手机摄像头中抓取一张图片,使用此图片中的ROI定义模板,然后在抓取连续图像时,进行模板匹配以找到模板的新位置。
问题在于模板匹配似乎没有运行:maxVal
值始终为0.99左右,而maxLoc
恰好是模板的原始位置({{1} },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);
}
答案 0 :(得分:2)
我可能离这里很远,但我相信submat方法返回一个指向mGray子矩阵的指针。因此,您的模板会逐帧更改,因为mRgba始终复制到mGray,但mGray永远不会重新分配。在这种情况下,解决方案是制作mGray子矩阵的副本。在C ++中,这将是:
mGray.submat(Y-H/2, Y+H/2, X-W/2, X+W/2).copyTo(template);