Répertoire d'articles
OpenCV-Python: Traitement d'image IV dans OpenCV
24 modèles correspondants
Objectifs
Dans cette section, nous allons apprendre:
1. Utiliser la correspondance de modèle pour trouver une cible dans une image
2. Fonctions: cv2.matchTemplate (), cv2.minMaxLoc ()
Principe La
correspondance de modèle est utilisée pour rechercher et trouver un modèle dans une grande image La méthode de localisation de l'image. OpenCV nous fournit une fonction: cv2.matchTemplate (). Comme la convolution 2D, il utilise également l'image modèle pour glisser sur l'image d'entrée (grande image) et compare l'image modèle avec sa sous-région correspondante de l'image d'entrée à chaque position. OpenCV propose plusieurs méthodes de comparaison différentes (voir la documentation pour plus de détails). Le résultat renvoyé est une image en niveaux de gris et chaque valeur de pixel représente le degré de correspondance de cette zone avec le modèle.
Si la taille de l'image d'entrée est (LxH) et la taille du modèle est (lxh), la taille du résultat de sortie est (W-w + 1, H-h + 1). Après avoir obtenu cette image, vous pouvez utiliser la fonction cv2.minMaxLoc () pour trouver les positions des valeurs minimales et maximales. La première valeur est le point (position) du coin supérieur gauche du rectangle, (w, h) est la largeur et la hauteur du rectangle du modèle moban. Ce rectangle est la zone de modèle trouvée.
Remarque: Si la méthode de comparaison que vous utilisez est cv2.TM_SQDIFF, la position correspondant à la valeur minimale est la zone correspondante.
24.1 Correspondance de modèle dans OpenCV
Nous avons un exemple ici: nous recherchons le visage de Messi sur les photos de Messi. Nous devons donc créer le modèle suivant:
Nous essaierons d'utiliser différentes méthodes de comparaison afin de pouvoir comparer leurs effets.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
img2 = img.copy()
template = cv2.imread('messi_face.jpg',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
#exec 语句用来执行储存在字符串或文件中的 Python 语句。
# 例如,我们可以在运行时生成一个包含 Python 代码的字符串,然后使用 exec 语句执行这些语句。
#eval 语句用来计算存储在字符串中的有效 Python 表达式
method = eval(meth)
# Apply template Matching
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 使用不同的比较方法,对结果的解释不同
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right, 255, 2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle(meth)
plt.show()
Le résultat est le suivant:
cv2.TM_CCOEFF
cv2.TM_CCOEFF_NORMED
cv2.TM_CCORR
cv2.TM_CCORR_NORMED
cv2.TM_SQDIFF
cv2.TM_SQDIFF_NORMED
Nous voyons que l'effet de cv2.TM_CCORR n'est pas aussi bon que nous le pensions.
24.2 Correspondance de modèles multi-objets
Dans la partie précédente, nous avons recherché le visage de Messi sur la photo, et Messi n'est apparu qu'une seule fois sur la photo. Que faire si votre objet cible n'apparaît que plusieurs fois dans l'image? La fonction cv.imMaxLoc () ne donnera que les valeurs maximum et minimum. À ce stade, nous allons utiliser le seuil.
Dans l'exemple suivant, nous voulons trouver les pièces dans une capture d'écran du jeu classique Mario.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv2.imwrite('res.png',img_rgb)
résultat:
Pour plus d'informations, veuillez faire attention au compte officiel: