OpenCV与模板匹配和霍夫变换

© Fu Xianjun. All Rights Reserved

目录

一. 模板匹配的概念

二. 实战演练:印花检测

二.  霍夫变换的概念

四. 实战演练:车道检测

重点:模板匹配的方法、霍夫变换的方法
难点:模板匹配及霍夫变换的实战

1.模板匹配的概念

模板匹配是指在当前图像A内寻找与图像B最相似的部分,般将图像 A称为输入图像,将图像B称为模板图像。模板匹配的操作方法是将模板图像B在图像A上滑动,遍历所有像素以完成匹配。

例如,在图15-1中,希望在图中的大图像“lena” 内寻找左上角的“眼睛”图像。此时,大图像“lena”是输入图像,“眼睛”图像是模板图像。查找的方式是,将模板图像在输入图像内从左上角开始滑动,逐个像素遍历整幅输入图像,以查找与其最匹配的部分。

OpenCV与模板匹配和霍夫变换_第1张图片

在OpenCV内,模板匹配是使用函数ov2 machemplateQ实现的。该函数的语法格式为:result =  cv2.matchTemplate(image, templ, methodI, mask ) )

其中:

*image 为原始图像,必须是8位或者32位的浮点型图像

*templ 为模板图像。它的尺寸必须小于或等于原始图像,并且与原始图像具有同样的类

*method为匹配方法。该参数通过TemplateMatchModes实现

模板匹配的实现过程

模板匹配的操作方法是将模板图像B在图像A上滑动,遍历所有像素以完成匹配。
工作原理:在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,
匹配程度越大,两者相同的可能性越大

OpenCV与模板匹配和霍夫变换_第2张图片

局限性:
它只能进行平行移动,若原图像中的匹配目标发
生旋转或大小变化,该算法无效

matchTemplate

result = cv2.matchTemplate(image, template,method)
其中
Result为运行结果

Image为待处理图像

Template为模板图像

Method为要采取的方法

method:方法:有以下6种
差值平方和匹配                          CV_TM_SQDIFF
标准化差值平方和匹配                CV_TM_SQDIFF_NORMED
相关匹配                                    CV_TM_CCORR
标准相关匹配                             CV_TM_CCORR_NORMED
相关匹配                                    CV_TM_CCOEFF
标准相关匹配                             CV_TM_CCOEFF_NORMED

minMaxLocmotho

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(src)
其中
min_val为返回的最小值
max_val为返回的最大值
mothodmin_loc为最小值的位置
Max_loc为最大值的位置

1.1导入需要的库

OpenCV与模板匹配和霍夫变换_第3张图片

1.2读取模板图片

1.3读取检测图片

1.4获取模板的大小

1.5进行匹配

OpenCV与模板匹配和霍夫变换_第4张图片

OpenCV与模板匹配和霍夫变换_第5张图片

2.实战演练:印花检测

OpenCV与模板匹配和霍夫变换_第6张图片

OpenCV与模板匹配和霍夫变换_第7张图片

思考:如果要检测多个印花应该如何实现?

OpenCV与模板匹配和霍夫变换_第8张图片

OpenCV与模板匹配和霍夫变换_第9张图片

4.霍夫变换的概念

霍夫变换是种在图像中 寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由Paul Hough (雀夫)于1962年首次提出。最初的霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能够识别直线,还能识别其他简单的图形结构,常见的有圆、椭圆等

本章主要介绍霍夫直线变换和霍夫圆变换。霍夫直线变换用来在图像内寻找直线,霍夫圆变换用来在图像内寻找圆。在OpenCV 中,前者可以用函数cv2.HoughLines()和 函数cv2.HoughLinesP0实现,后者可以用函数cv2.HoughCircles0实现

OpenCV提供了函数cv2 HougLineSO和函数cv2.HoughLinesPO用来实现霍夫直线变换。本节首先介绍霍夫变换的基本原理,然后分别介绍这两个函数的基本使用方法

1.一条直线可由两个点A=(X1,Y1)和B=(X2,Y2)确定(图a 笛卡尔坐标系)
2.y=kx+q也可以写成关于(k,q)的函数表达式(图b 霍夫空间)

OpenCV与模板匹配和霍夫变换_第10张图片

3.三个点共线的情况
4. 霍夫变换的后处理的基本方式:选择由尽可能多直线汇成的点

OpenCV与模板匹配和霍夫变换_第11张图片

5.k=∞是不方便表示的,而且q怎么取值呢,这样不是办法。因此考虑将笛卡尔坐标系换为:

OpenCV与模板匹配和霍夫变换_第12张图片

霍夫变换的函数

lines = cv2.HoughLines(image, rho, theta, threshold)
其中 
image: 待处理图像
rho: (ρ,θ)中ρ的精度
theta: (ρ,θ)中θ的精度
threshold: 阈值,(ρ,θ)对应的最低投票数。>=threshold被检测为一条线

OpenCV与模板匹配和霍夫变换_第13张图片

直线检测

lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
其中 
image: 待处理图像。
rho: (ρ,θ)中ρ的精度。
theta: (ρ,θ)中θ的精度。
threshold: 阈值,(ρ,θ)对应的最低投票数。>=threshold被
检测为一条线。
minLineLength:最小长度
maxLineGap:共线线段之间的最小间隔

OpenCV与模板匹配和霍夫变换_第14张图片

圆检测

lines = cv2.HoughCircles(image, method, dp, minDist)
其中 
image: 待处理图像。
method: 定义检测图像中圆的方法,使用
cv2.HOUGH_GRADIENT
dp: 累加器分辨率与图像分辨率的反比
threshold: 阈值,(ρ,θ)对应的最低投票数。>=threshold被
检测为一条线
minDist:检测到的圆的中心,(x,y)坐标之间的最小距离

OpenCV与模板匹配和霍夫变换_第15张图片

4.实战演练:车道检测

OpenCV与模板匹配和霍夫变换_第16张图片

OpenCV与模板匹配和霍夫变换_第17张图片

你可能感兴趣的:(opencv)