OpenCV 模板匹配

OpenCV 模板匹配

模板匹配是一种用于在较大图像中查找模板图像位置的技术。OpenCV提供了cv2.matchTemplates()函数来实现这个目的。它简单地滑动模板图像在输入图像上,并比较模板和输入图像下的区域。

有多种可用于比较的方法;我们将在后面的主题中讨论几种流行的方法。

它返回一个灰度图像,其中每个像素表示该像素邻域与输入模板匹配的数量。

OpenCV中的模板匹配

模板匹配包含以下步骤:

步骤1: 将实际图像转换为灰度图像。

步骤2: 选择模板作为灰度图像。

步骤3: 找到准确度匹配的位置。通过将模板图像滑动到实际图像上进行此操作。

步骤4: 当结果大于准确度水平时,将该位置标记为检测到的位置。

考虑以下示例:

import cv2   
import numpy as np   
# Reading the main image   
rgb_img = cv2.imread(r'C:\Users\DEVANSH SHARMA\rolando.jpg',1)  
# It is need to be convert it to grayscale   
gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)   
# Reading the template image   
template = cv2.imread(r'C:\Users\DEVANSH SHARMA\ronaldo_face.jpg',0)   
# Store width in variable w and height in variable h of template  
w, h = template.shape[:-1]   
# Now we perform match operations.   
res = cv2.matchTemplate(gray_img,template,cv2.TM_CCOEFF_NORMED)   
# Declare a threshold   
threshold = 0.8  
# Store the coordinates of matched location in a numpy array   
loc = np.where(res >= threshold)   
# Draw the rectangle around the matched region.   
for pt in zip(*loc[::-1]):   
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)   
# Now display the final matched template image   
cv2.imshow('Detected',img_rgb)  

输出:

OpenCV 模板匹配

使用多个对象的模板匹配

在上面的例子中,我们在图像中搜索仅出现一次的模板图像。假设在特定图像中某个对象出现多次。在这种情况下,我们将使用阈值处理,因为cv2.minMaxLoc()无法给出所有模板图像的位置。请考虑以下示例。

import cv2   
import numpy as np   
# Reading the main image   
img_rgb = cv2.imread(r'C:\Users\DEVANSH SHARMA\mario.png',1)  
# It is need to be convert it to grayscale   
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)   
# Read the template   
template = cv2.imread(r'C:\Users\DEVANSH SHARMA\coin1.png',0)   
# Store width in variable w and height in variable h of template  
w, h = template.shape[:-1]   
# Now we perform match operations.   
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)   
# Declare a threshold   
threshold = 0.8  
# Store the coordinates of matched region in a numpy array   
loc = np.where( res >= threshold)   
# Draw a rectangle around the matched region.   
for pt in zip(*loc[::-1]):   
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)   
# Now display the final matched template image   
cv2.imshow('Detected',img_rgb)  

输出:

OpenCV 模板匹配

在上述程序中,我们以流行的超级马里奥游戏图像作为主图像,并以硬币图像作为模板图像。硬币在主图像中多次出现。当它在图像中找到硬币时,会在硬币上绘制矩形。

模板匹配的限制

模板匹配存在一些限制,如下所示:

  • 对于中等到大型图像,计算模式相关图像是一个耗时的过程。
  • 模式的出现必须保持参考模板图像的方向性。
  • 模板匹配不适用于旋转或缩放版本的模板,因为形状/大小/剪切等发生了变化。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程