我正在使用OpenCV4Android在Android手机上试用模板匹配。基本上我正在做的是拍摄一些我想要检测的物体,裁剪它并将其保存为模板。
然后我使用我的Android相机和表面视图来不断从相机获取图像。然后我在每个图像上应用模板匹配,首先将图像转换为Mat。但是,在应用模板匹配时,我只能获得3-4 fps左右。
我基本上是这样做的:
mCameraMat = inputFrame.rgba();
int matchMethod = Imgproc.TM_CCOEFF_NORMED;
// mTemplateMat resized in terms of video size in prepareMediaRecorder.
// Very hacky solution so need to fix it!
int result_cols = mCameraMat.cols() - mTemplateMat.cols() + 1;
int result_rows = mCameraMat.rows() - mTemplateMat.rows() + 1;
mResult = new Mat(result_rows, result_cols, CvType.CV_32F);
// Move this to a new thread.
Imgproc.matchTemplate(mCameraMat, mTemplateMat, mResult, matchMethod);
Core.normalize(mResult, mResult, 0, 1, Core.NORM_MINMAX, -1, new Mat());
// Localizing the best match with minMaxLoc
MinMaxLocResult mmr = Core.minMaxLoc(mResult);
Point matchLoc;
if (matchMethod == Imgproc.TM_SQDIFF || matchMethod == Imgproc.TM_SQDIFF_NORMED) {
matchLoc = mmr.minLoc;
} else {
matchLoc = mmr.maxLoc;
}
// Draw a boundary around the detected object.
Imgproc.rectangle(mCameraMat, matchLoc, new Point(matchLoc.x + mTemplateMat.cols(),
matchLoc.y + mTemplateMat.rows()), new Scalar(TrackingActivity.r, TrackingActivity.g,
TrackingActivity.b, TrackingActivity.a), 2);
其中mTemplateMat是转换为Mat对象的模板位图图像。
瓶颈在线
Imgproc.matchTemplate(mCameraMat, mTemplateMat, mResult, matchMethod);
如果我删除该行,我会得到大约25 fps,这是更可接受的。对于13-14以上的任何东西我都没问题。我知道模板匹配是一个非常昂贵的过程,每一帧都这样做可能会很昂贵。我试图每20帧做一次,但它仍然会大大降低处理速度,并且结束视频看起来更糟糕,因为从平滑的fps显示到低fps显示的持续转换。
我在优化matchTemplate方面有哪些选择?任何提示都非常感谢。