[OpenCV-Python] 24 modèles correspondants

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:

Image de modèle
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
Insérez la description de l'image ici

cv2.TM_CCOEFF_NORMED
Image de modèle

cv2.TM_CCORR
Image de modèle
cv2.TM_CCORR_NORMED   
Image de modèle
 
cv2.TM_SQDIFF    
Image de modèle

cv2.TM_SQDIFF_NORMED
Image de modèle
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:
    img

Pour plus d'informations, veuillez faire attention au compte officiel:
img

Je suppose que tu aimes

Origine blog.csdn.net/yegeli/article/details/113430971
conseillé
Classement