Python

Kuvan tunnistaminen kuvasta

Etsitään kuvasta jokin toinen kuva. Helppoa, cv2:lla.

Se etsii template-nimisen kuvan image-nimisestä kuvasta käytännössä liu'uttamalla sitä image:n päällä. Lopuksi se palauttaa koordinaatit.

Numpy:n funktiolla unravel tulostetaan ne. Unravel on hieman erikoinen funktio. Alla on toinen, ehkä paremmin toimiva esimerkki.

Unravel:n ulostulon saa printattua helpolla:


for pt in np.unravel_index(result.argmax(), result.shape):
    print( pt )

mutta se on vähän monimutkainen;)


import cv2
import numpy as np
import pyautogui


pyautogui.keyDown('winleft')
pyautogui.press('d')
pyautogui.keyUp('winleft')

image = pyautogui.screenshot()
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)


pyautogui.keyDown('winleft')
pyautogui.press('d')
pyautogui.keyUp('winleft')


#Lue ikonin kuva (etsittävä kuva)
template = cv2.imread('ikoni.png')
w, h, null = template.shape  #Sen koko. Tarvitaan laatikon piirtämisessä


result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)


raja = 0.8
loc = np.where( result >=  raja )  

# Draw a rectangle around the matched region. 
for pt in zip(*loc[::-1]): 
    cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2) 

cv2.imshow('kuva', image)



Koodi näyttää työpöydän, ottaa kuvakaappauksen, vertaa sitä pikkukuvaan (template) ja etsii ne kohteet, joiden raja-arvo on suurempi kuin 0.8. Sen jälkeen se piirtää suorakaiteen löydettyjen ympärille ja vielä näyttää kuvan.

Alla on on toinen, joka toimivat joissain tapauksissa:, mutta ei aina koska se ei tarkista kuinka hyvin se vastasi alkuperäistä:


#Etsii suurimman ja pienimmän.
#min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

#top_left = max_loc
#bottom_right = (top_left[0] + w, top_left[1] + h)

#cv2.rectangle(image,top_left, bottom_right, 255, 2)

Tehtäviä

Etsi ikoni ruudulta.

Tuplaklikkaa ikonia aiemmilla opeillasi ja avaa ohjelma.

Etsi kaikki silmät kuvasta.