Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1516:interaktives_spiel_gegen_ki

Dies ist eine alte Version des Dokuments!


Interaktives Spiel mit Künstlicher Intelligenz

Einführung

Wer ist dabei?

  • Lea Nicolaus
  • bis 24.2.2016: Dominic van Deest

Projekidee

Die Idee ist einfach. Ein Computer spielt gegen dich Mühle. Auf dem Tisch liegt das Spielbrett vom Spiel Mühle. Der menschliche Spieler bewegt die Spielsteine per Hand, wobei die Künstliche Intelligenz von oben das Spielbrett beobachtet und seine Anweisungen für die Spielzüge auf dem Display anzeigt. Natürlich soll der Computer nicht leicht zu besiegen sein.

Hilfsmittel

Ausstattung

  • Kamera: PS3 Eye Camera
  • Stativ
  • Spielesammlung
  • Computer

Software

  • opencv Paket für Python

Planungsphasen

1. Bildinput verarbeiten

2. Spiel programmieren

3. Dem Computer das Spiel beibringen (KI erstellen)

4. Schnittstellen finden und zusammenfügen

Dokumentation

Phase 1

Kamera und Python

Die Schnitstelle zwischen Python und der Kamera haben wir mit dem Packet „OpenCV“ für Python gefüllt. Das Packet ermöglicht es Bilder von allen angeschlossenen und internen Kameras aufzunehmen, zu betrachten, zu speichern und weiterzuverarbeiten. Das Packet wird importiert mit import cv2 spielbrett = Ein Bild Aufnehmen: cv2.VideoCapture(#Kamera) Die Zählung der Kameras beginnt bei 0 wobei dies meistens die interne Kamera anspricht. Das aufgenommene Bild wird in eine Variable gelsen: bild = cv2.VideoCapture(#Kamera).read() Die variable „bild“ ist ein Tupel, die erste information ist „True“ und die zweite enthällt ein Array mit den Pixeldaten von dem Foto.

Das Bild wird folgendermaßen angezeigt:

cv2.imshow("Anzeige",bild[1])
cv2.waitKey(0)

waitkey ist dafür da, dass gewartet wird, während das Bild angezeigt wird.

Ein Bild Speichern:

cv2.imwrite("Dateiname.png", bild[1])

In Graustufen ändern:

cv2.cvtColor(bild[1], cv2.COLOR_BGR2GRAY)

Ecken im Bild finden

Damit der Computer auch etwas mit dem Bild anfangen kann muss es auf bestimmte Charakteristiker Untersucht werden. Wir haben uns entschieden zunächst die Ecken des Mühle Spielbretts ohne Spielfiguren finden zu lassen, damit es möglich ist ein GRundgerüst zu erstellen, also zu wissen wo die Felder sind. Dazu verwenden wir Eine Funktion von Open CV: Harris Corner DEtection. corner Harris(). Hinter dieser Funktion steht ein Mathematischer Algorythmus, welche einzelne Regionen (Die größen kann man vorgeben) auf Unterschiede in der Helligkeit. Diese Werden in einem Tupel (u,v)Dargestellt, der folgendermaßen berechnet wird:

Um Ecken aufzuspühren muss diese Fuktion maximiert werden. Die Maximierte Fuktion sieht ungefähr so aus:

wobei

Nun weden die Eigenwerte von M, λ_1 und λ_2 berechnet. Mithilfe dieser Werte kann nun bestimmt werden in welchem Bereich eines Bildausschnitts sich Ecken befinden und wo nicht. Folgende Grafik veranschaulicht dies:

Wir haben in unser Bild von dem Mühlespielbrett einmal alle gefundenen Ecken mit grünen Pixeln eingezeichnet:

Dies ist ein großer Erfolg, denn jetzt ist deutlich wo sich die Felder befinden und somit wo eine Spielfigur sein kann.

Quelle: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html

Beleuchtung

Die Beleuchtung des Spielbretts erschien uns eine Wichtige Komponente der Bilderkennung, also haben wir verschiedene Belichtungswinkel ausprobiert, um dann festzustellen, dass es nur einen sehr kleinen unterschied macht, wenn man das Brett separat belichtet oder mit der Raumbeleuchtung erhellt. Wichtig ist nur überhapt licht zu haben, so dass nicht zu hohe Kontraste entstehen, die als Ecken gedeutet werden könnten. Die beleuchtung spielte eine größerer Rolle, als wir dasa Bild von dem Brett, zur besseren Ecken Findung über den Schwellwert komplett auf Schwarz oder Weiß gebracht haben. Allerdings hat sich herrausgestellt, dass es besser ist wenn man das Bild in Graustufen betrachtet, um eben diesen Faktor der Beleuchtung auszuklammern.

Zwischzeitliches Abschließen des ersten Projektabschnitts

Da uns einiges Grundwissen aus der Linearen Algebra fehlt unterbrechen wir hier und fahren fort mit dem zweiten Teil des Projekts. Hier offen geblieben sind folgende Fragen:

  • Wie kann ich fafür sorgen, dass die Spielfelder als solche identifiziert werden und die einzelnen Positionen als Mittelpunkt der vielen Pixel in der Umgebung abspeicchern?
  • Wie erzeuge ich eine Funktion, die ein wenig Toleranz bezüglich der Position und des Kippwinkels der Kamera gibt, sodass die Brettstruktur immer wieder erkannt wird?
  • Wie erkenne ich Spielsteine im allgemeinem und wie Unterschiede ich im speziellem die Farbe der Spielsteine (Weiß oder Schwarz)?

Phase 2

Minimühle

Um es ersteinmal für die Kamera und die Rechenkraft des Computers einfach zu halten, entschieden wir uns für die kleine Version der Mühle mit nur 16 Feldern. Dies Musste jetzt samt Spielbrett und Spielregeln virtuell erzeugt werden. Hierbei ist es wichtig in kleinen Arbeitsschritten vorzugehen und nicht alles auf einmal programieren zu wollen, weil man sich dann zu sehr verzettelt, man sollte allerdings das Ziel im Auge behalten.

Ein Spielbrett

Das Spielbrett ist aufgebaut als Array. Jede Liste im Array steht für eine Zeile auf dem Spielbrett und jeder Listeneintrag in dem 'W','S' oder 'x' steht für ein Spielfeld. Die stellen an denen kein Spielfeld ist, sind mit „-“ oder „|“ gekennzeichnet, diese werden nie verändert.

[['W','-','S','-','W'],
['|','S','W','x','|'],
['S','S',' ','x','x'],
['|','W','x','x','|'],
['S','-','W','-','x']]

Planung und Protukol

ws1516/interaktives_spiel_gegen_ki.1462133744.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)