加快opencv4android中的模板匹配

时间:2016-11-19 16:18:44

标签: android opencv templates vision template-matching

我正在使用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方面有哪些选择?任何提示都非常感谢。

0 个答案:

没有答案