Dieser Artikel ist ein Relaisartikel von "2020 Neujahr Adventskalender TechConnect!" von Link Information System ist. TechConnect! Ist ein selbststartender Adventskalender, der von einer selbst erstellten Gruppe namens Engineer.hanzomon weitergeleitet wird. (Von Facebook hier des Linkinformationssystems)
Da das Thema kostenlos war, wird es ein kostenloser Artikel sein. (Die verwendete Technologie ist ernst.) Ich habe das Tutorial voll genutzt und mein Bestes getan, um das Bild zu erkennen.
Ein Programm zur Win / Lose-Beurteilung von Shadowverse (Steam-Version) wurde erstellt. (Der GIF-Bildschirm wird gezeichnet, um das Verlusturteil zu bestätigen. Das Urteil kann ohne Zeichnung erfolgen.)
Wie Sie sehen können, handelt es sich nur um einen Vergleich zwischen dem Win / Lose-Bild und dem Aufnahmebildschirm. "Bestimmen Sie in Echtzeit, ob ein bestimmtes Bild in der Erfassung einer bestimmten Anwendung angezeigt wird." Ich denke, es wird eine Referenz für diejenigen sein, die etwas tun wollen.
Informationen zur Installationsmethode finden Sie im folgenden Referenzartikel. Ich konnte es einfach mit Pip von einem Ende installieren, so dass nichts besonders verstopft war.
Ich habe mit PIL unter Bezugnahme auf den folgenden Artikel aufgenommen. [Python] [Windows] Screenshot in Python
from PIL import ImageGrab
import numpy as np
TARGET_NAME = 'Shadowverse'
handle = win32gui.FindWindow(None, TARGET_NAME)
while True:
rect = win32gui.GetWindowRect(handle)
img = ImageGrab.grab(rect)
ocv_im = np.asarray(img)
#Farbkonvertierung für OpenCV
ocv_im = cv2.cvtColor(ocv_im, cv2.COLOR_BGR2RGB)
#Auf dem Bildschirm zeichnen (zur Bestätigung)
cv2.imshow("images", ocv_im, )
#Wenden Sie Wait mit einer geeigneten Methode an (Sicherung der Zeichenzeit).
cv2.waitKey(10)
(Das Win / Lose-Bild wird vorab aus dem Screenshot ausgeschnitten.)
Lesen Sie die folgenden Artikel und führen Sie eine Anpassung der Funktionsmenge mit AKAZE durch. Anpassung der Funktionsmenge mit OpenCV 3 und Python 3 (A-KAZE, KNN)
def MatchResultCheck(ocv_img):
win_img = cv2.imread(WIN_IMAGE_PATH)
lose_img = cv2.imread(LOSE_IMAGE_PATH)
akaze = cv2.AKAZE_create()
kp2, des2 = akaze.detectAndCompute(ocv_img, None)
kp1_l, des1_l = akaze.detectAndCompute(lose_img, None)
kp1_w, des1_w = akaze.detectAndCompute(win_img, None)
is_win = False
is_lose = False
bf = cv2.BFMatcher()
if not des2 is None :
#Feature-Matching zwischen Verlustbild und aufgenommenem Bild
matches_l = bf.knnMatch(des1_l,des2, k=2)
#Funktionsübereinstimmung zwischen Win-Bild und aufgenommenem Bild
matches_w = bf.knnMatch(des1_w,des2, k=2)
#Das Urteil verlieren
good_l = []
for match1, match2 in matches_l:
if match1.distance < 0.75*match2.distance:
good_l.append([match1])
#Gewinnen Sie ein Urteil
good_w = []
for match1, match2 in matches_w:
if match1.distance < 0.75*match2.distance:
good_w.append([match1])
#Erstellen Sie ein Bild zur Bestätigung
akaze_matches = cv2.drawMatchesKnn(lose_img,kp1_l,ocv_img,kp2,good_l,None,flags=2)
#Auf dem Bildschirm zeichnen (zur Bestätigung)
cv2.imshow("match", akaze_matches, )
if len(good_l) > 20 :
print("is lose")
is_lose = True
if len(good_w) > 20 :
print("is win")
is_win = True
return is_win, is_lose
Die Entfernung (wie viel sie übereinstimmt) wird im Übereinstimmungsergebnis gespeichert. Schneiden Sie sie daher mit Entfernung ab.
#Das Urteil verlieren
good_l = []
for match1, match2 in matches_l:
#Extrahieren Sie nur Feature-Punkte mit einem bestimmten Abstand oder mehr
if match1.distance < 0.75*match2.distance:
good_l.append([match1])
Wenn nach dem Schnitt mehr als eine bestimmte Anzahl von Feature-Punkten vorhanden ist, wird beurteilt, dass das Win / Lose-Bild vorhanden ist.
if len(good_l) > 20 :
print("is lose")
is_lose = True
Um Fehlalarme zu unterdrücken, wird der Win / Lose-Bildschirm nur dann beurteilt, wenn er mehr als eine bestimmte Anzahl von Malen hintereinander als Win / Lose-Bild beurteilt wird. (Da ich Python verwende, denke ich, dass ich es einfacher schreiben kann ...)
is_win, is_lose = MatchResultCheck(ocv_im)
if is_lose :
cnt_lose_match += 1
if cnt_lose_match >= 4:
print("is lose match")
cnt_lose_match = 0
cv2.waitKey(1000)
else :
cnt_lose_match = 0
Lassen Sie uns den ersten Angriff / zweiten Angriff auf die gleiche Weise beurteilen! Ich dachte, ich könnte es nicht gut machen ... Im Gegensatz zu Win / Lose ist das Urteilsbild zu klein, und ich frage mich, ob das Kanji schmerzhaft ist. Ich werde mich weiterhin widmen.
Ich konnte feststellen, ob ein bestimmtes Bild in der Bildschirmaufnahme vorhanden war. Es wäre interessant, die Beurteilungsergebnisse in Echtzeit zeichnen zu können.
Das nächste Mal ist @ rysk001.
Recommended Posts