xml地图|网站地图|网站标签 [设为首页] [加入收藏]

智能家电

当前位置:美高梅游戏网站 > 智能家电 > 计算机视觉 OpenCV Android | 基本特征检测 之 模板匹

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

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-10-03 12:39
  • 模板匹配是最简单的模式识别算法之一,其在图像处理中经常用于从一副未知图像中,根据预先定义好的模板图像寻找模板图像相同或者高度相似子图像区域

  • 所以模板匹配需要两个输入,一个是模板图像,另一个是待检测的目标图像

  • 模板匹配使用的是基于图像像素相似度的计算方法,很容易受到光照强度、对象几何畸变的影响而降低准确性,只有在亮度和分辨率恒定以及无几何畸变的情况下才会得到比较高的准确率

  • 霍夫圆变换霍夫直线变换原理类似,也是将圆上的每个点转换到霍夫空间

  • 其转换的参数方程如下:图片 1

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

图片 2模板图像图片 3待检测的图像则运行接下来的demo代码,检测结果将如下:(截图中蓝色箭头所指的红色方框即为程序所匹配并绘制的)图片 4OpenCV中支持的基于像素计算的模板匹配方法包括如下6种,具体如下表:图片 5

  • 对于圆来说,θ的取值范围在0~360°,这样就有了三个参数另外两个参数圆心半径γ

  • 这里的霍夫空间便是一个三维空间,所以如果还是跟之前的累积计算一样,计算量就会大大增加,这样显然不利于快速计算与检测

  • 所以在OpenCV中,霍夫圆检测不是基于二值图像或者边缘检测的结果,而是基于灰度图像的梯度来找到候选区域,然后基于候选区域实现霍夫圆检测,这样就会大大减少计算量,提高程序的执行速度与性能,但是基于梯度实现霍夫圆检测也带来了另外一个问题,那就是结果特别容易受到噪声影响,对图像中的噪声特别敏感,所以在OpenCV中使用相关API实现霍夫圆检测的时候,首先需要通过模糊操作对图像进行噪声抑制处理。一般来说,常见的均值、高斯、中值模糊图像噪声的抑制已经比较有效,但是在霍夫圆检测中有时候还会用到边缘保留滤波抑制平坦区域噪声,以便在进行梯度计算的时候能够更好地得到候选区域

  • 如果计算模板匹配时使用的模板匹配方法平方不同或者归一化平方不同,则值越小表示子区域与模板匹配度越高
  • 其他四个方法则是值越高表示图像子区域与模板匹配度越高
  • 使用模板匹配的时候,首先要根据模板图像输入图像计算得到输入图像的每个像素点模板的匹配程度值,然后根据使用的计算方法求得最小值或者最大值,得到最终的模板匹配子图像矩形区域

霍夫圆检测的API:

模板匹配API如下:

  • HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)``image:8位单通道的灰度图像。circles:输出的三个向量的数组,圆心与半径。method:唯一支持的方法就是基于梯度霍夫变换——HOUGH_GRADIENT。dp:图像分辨率,注意dp越大,图像就会相应减小分辨率;当dp等于1时,其跟原图的大小一致;当dp=2时,其为原图的一半。minDist:表示区分两个圆的圆心之间最小的距离,如果两个圆之间的距离小于给定的minDist,则认为是同一个圆,这个参数对霍夫圆检测来说非常有用,可以帮助降低噪声影响。param1:边缘检测Canny算法中使用的高阈值。param2:累加器阈值,值越大,说明越有可能是圆。minRadius:检测的最小圆半径,单位为像素。maxRadius:检测的最大圆半径,单位为像素。
  • matchTemplate(Mat image, Mat templ, Mat result, int method)``image:表示输入图像,大小为W×Htempl:表示模板图像,大小为w×hresult:表示计算输出的结果,结果大小必须为×单通道的浮点数method:表示计算方法,取值为上表所支持的 6种方法之一

使用API实现灰度图像圆检测:

result处参数大小定义为×的原因:

  • 由下文的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处参数大小定义为×意义图片 6
private void houghCircleDemo(Mat src, Mat dst) { Mat gray = new Mat(); Imgproc.pyrMeanShiftFiltering(src, gray, 15, 80); Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY); Imgproc.GaussianBlur(gray, gray, new Size; // detect circles Mat circles = new Mat(); dst.create(src.size(), src.type; Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1, 20, 100, 30, 10, 200); for(int i=0; i<circles.cols { float[] info = new float[3]; circles.get(0, i, info); Imgproc.circle(dst, new Pointinfo[0], info[1]), info[2], new Scalar(0, 255, 0), 2, 8, 0); } circles.release(); gray.release();}

本文由美高梅游戏网站发布于智能家电,转载请注明出处:计算机视觉 OpenCV Android | 基本特征检测 之 模板匹

关键词:

上一篇:TypeScript联合类型

下一篇:没有了