Android开发经验谈Android开发程序员

计算机视觉 OpenCV Android | 基本特征检测 之

2019-02-11  本文已影响25人  凌川江雪

模板匹配的 概述 以及 使用简介


准备的材料 以及 运行结果示图

下面我们准备好一个模板图像待检测的图像

模板图像 待检测的图像 则运行接下来的demo代码,检测结果将如下:(截图中蓝色箭头所指的红色方框即为程序所匹配并绘制的)




模板匹配知识 与 demo代码

OpenCV中支持的基于像素计算的模板匹配方法包括如下6种,具体如下表:

模板匹配API如下:

result处参数大小定义为(W-w+1)×(H-h+1)的原因:

  • 由下文的demo代码中Point maxloc = minMaxResult.maxLoc;   Point minloc = minMaxResult.minLoc;
    以及Imgproc.rectangle(dst, matchloc, new Point(matchloc.x+tpl.cols(), matchloc.y + tpl.rows()), new Scalar(0, 0, 255), 2, 8, 0);三行代码,
    我们可以知道,
    minMaxResult.maxLocminMaxResult.minLoc返回的Point对象
    是一个矩形(其实就是模板图像)左上角的坐标
  • 按照这个思路以及下面的示意图,我们便可以知晓result处参数大小定义为(W-w+1)×(H-h+1)意义

实现图像对象模板匹配的demo:

private void matchTemplateDemo(Mat src, Mat dst) {
  String tplFilePath = fileUri.getPath().replaceAll("lena", "tmpl");
  Mat tpl = Imgcodecs.imread(tplFilePath);
  int height = src.rows() - tpl.rows() + 1;
  int width = src.cols() - tpl.cols() + 1;
  Mat result = new Mat(height, width, CvType.CV_32FC1);

  // 模板匹配
  int method = Imgproc.TM_CCOEFF_NORMED;
  Imgproc.matchTemplate(src, tpl, result,method);
  Core.MinMaxLocResult minMaxResult = Core.minMaxLoc(result);
  Point maxloc = minMaxResult.maxLoc;
  Point minloc = minMaxResult.minLoc;
  Point matchloc = null;
  if(method == Imgproc.TM_SQDIFF || method == Imgproc.TM_SQDIFF_NORMED) {
    matchloc = minloc;
  } else {
    matchloc = maxloc;
  }

  // 绘制
  src.copyTo(dst);
  Imgproc.rectangle(dst, matchloc, new Point(matchloc.x+tpl.cols(), matchloc.y + tpl.rows()), new Scalar(0, 0, 255), 2, 8, 0);
  tpl.release();
  result.release();
}

代码的运行结果见上文《准备的材料 以及 运行结果示图》部分;

// 模板匹配代码模块的思路:(从API输出对象Mat result到表示模板图像左上角的坐标Point对象其简单的转换过程)




作者寄语,尚待研究

参考材料
上一篇 下一篇

猜你喜欢

热点阅读