Gostaria de comparar duas imagens e encontrar a posição do modelo dentro da segunda imagem, então a primeira imagem é esta:
Esta é a nossa imagem de modelo que deve ser comparada com a imagem a seguir:
Mas quando executo o código, obtive o seguinte resultado:
Como posso melhorar o resultado?
import cv2
import numpy as np
from imutils.object_detection import non_max_suppression
import matplotlib.pyplot as plt
template =cv2.imread("euro.jpg",cv2.IMREAD_COLOR)
template =cv2.resize(template,(99,99))
img =cv2.imread("euro_2024.jpg",cv2.IMREAD_COLOR)
img2 = img.copy()
# image =cv2.resize(image,(700,700))
h,w =template.shape[:2]
# 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()
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()
Isso significaria que a função de correspondência se concentra apenas na bola e não em qualquer ruído de fundo.
Mas você também deve converter o modelo em tons de cinza para torná-lo mais distinguível. Você pode ver isso feito em " Tutoriais OpenCV-Python/Processamento de imagens em OpenCV/Template Matching "
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
:.Em seguida, determine manualmente a caixa delimitadora da bola e recorte o modelo :
cropped_template = template_gray[y:y+h, x:x+w]
.OpenCVs
matchTemplate
podem usar uma máscara como argumento opcional , o que indica para considerar apenas as partes brancas da máscara durante o processo de correspondência.Assim você pode criar uma máscara para o modelo recortado, e passá-la
matchTemplate
para considerar apenas a bola durante o processo de correspondência:mask = np.zeros(cropped_template.shape, dtype=np.uint8)
Use
numpy.zeros
: `` Irá criar um array de zeros com as mesmas dimensões quetemplate_gray
(que representa a imagem do modelo convertida para tons de cinza ).Desenhe um círculo branco na máscara onde a bola está localizada:
cv2.circle(mask, (mask.shape[1]//2, mask.shape[0]//2), radius, 255, -1)
radius
deve ser definido com um valor que corresponda ao tamanho do objeto de interesse na imagem do modelo, e acircle
função preencherá o círculo com o valor255
, criando uma área branca na máscara.Seu código seria:
Novamente,
x, y, w, h
na seção de corte devem estar as coordenadas e o tamanho da bola dentro da imagem real do modelo.Você pode adicionar
non_max_suppression
se o modelo aparecer várias vezes na imagem de pesquisa:Concordo: a correspondência de modelos geralmente é adequada para padrões de imagens 2D que não mudam de perspectiva ou forma. Seria assumido que o modelo e a parte da imagem que está sendo pesquisada são orientados e dimensionados de forma semelhante.
Quando o objeto em questão é tridimensional, como uma bola de futebol, e as imagens o capturam de diferentes ângulos ou sob diferentes condições de iluminação, a aparência do modelo pode mudar devido a distorções de perspectiva, mudanças de iluminação e oclusões.
Você pode tentar uma combinação de correspondência de modelo em várias escalas e uma máscara, que seria mais robusta do que a simples correspondência de modelo, mas ainda não seria uma solução abrangente para combinar imagens de objetos 3D que podem parecer muito diferentes devido à rotação, perspectiva mudanças e outros fatores.
Ele
multi_scale_template_matching_with_mask
tentará encontrar o modelo na imagem de pesquisa em diferentes escalas enquanto usa uma máscara para focar a correspondência em características específicas do modelo (por exemplo, a bola).