[PYTHON] Beurteilung des Sieges oder der Niederlage von Shadova anhand der Bilderkennung


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.

Was wurde gemacht

Ein Programm zur Win / Lose-Beurteilung von Shadowverse (Steam-Version) wurde erstellt. ダウンロード.gif (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.

Was ich benutzt habe

Informationen zur Installationsmethode finden Sie im folgenden Referenzartikel. Ich konnte es einfach mit Pip von einem Ende installieren, so dass nichts besonders verstopft war.

Weise

  1. Bildschirmaufnahme des Spielbildschirms
  2. Vergleichen Sie das aufgenommene Bild mit dem Win / Lose-Bild
  3. Schneiden Sie die Feature-Punkte mit Distanz ab. Wenn die Feature-Punkte über einem bestimmten Level liegen, wird dies als Gewinn / Verlust gewertet.
  4. Wenn die Win / Lose-Beurteilung mehr als eine bestimmte Anzahl von Malen kontinuierlich ist, wird sie als Win-Bildschirm / Lose-Bildschirm beurteilt.

Bildschirmaufnahme des Spielbildschirms

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)

Vergleichen Sie das aufgenommene Bild mit dem Win / Lose-Bild

(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

Urteil gewinnen / verlieren

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

Bildschirm gewinnen / Bildschirmurteil verlieren

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

Was ich nicht konnte

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.

Zusammenfassung

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

Beurteilung des Sieges oder der Niederlage von Shadova anhand der Bilderkennung
Beurteilung des Endes von Mahjong durch Kombinationsoptimierung
Holen Sie sich das Bild von "Suzu Hirose" von Google Bildersuche.
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Anwendung der CNN2-Bilderkennung
Bilderkennung von Früchten mit VGG16
[Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT
Python: Grundlagen der Bilderkennung mit CNN
Python: Anwendung der Bilderkennung mit CNN
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Analyse des Röntgenmikrotomographiebildes durch Python
Maschinelles Lernen: Bilderkennung von MNIST mithilfe von PCA und Gaussian Native Bayes
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.