Frage

Ich habe ein Bild, von einem Live-Webcam genommen, und ich möchte in die Lage sein ein bestimmtes Objekt im Bild zu erkennen und zu extrahieren, den Teil davon eine weitere Verarbeitung zu tun.

Insbesondere wird das Bild eines Spielbrett sein würde, wollen wir für die Zwecke dieser Frage sagen, dass es ein Sudoku Spielbrett ist.

Mein erster Ansatz war für kontrastreiche Bereiche zu suchen und es von dort aus arbeiten, aber ich scheine mit vielen Potential Kanten (viele fehlerhaften) und keine wirklichen Ahnung, um am Ende, wie die diejenigen, die sind, zu arbeiten, ich möchte wirklich!

Gibt es Algorithmen, Bibliotheken, Code-Beispiele oder auch nur gute Ideen gibt, wie ich über die Suche und Extrahieren der relevanten Teil des Bildes gehen würde?

War es hilfreich?

Lösung

Verwenden Sie die kostenlose AForge.Net Bildverarbeitungsbibliothek für diese. gibt es eine Tonne cooler Sachen zu spielen.

Andere Tipps

Sie müssen Filter Betrieb und Masken auf dem Bild auszuführen.

Ich denke, es gibt keine einfache Möglichkeiten, , um nur Objekt aus dem Bild zu holen, müssen Sie Kantenerkennungsalgorithmen verwenden, Clipping, und legen Sie die Kriterien für eine gültige Objekte / Bild.

Sie können auch Bild Schwellwertbildung verwenden, um Objekt zu erkennen. Sie können sich unter Bildverarbeitungs-Bibliothek suchen.

  1. Filter API für C, C ++, C #, Visual Basic .NET, Delphi, Python
  2. http://www.catenary.com/
  3. CIMG reicher als zuvor Bibliothek jedoch in C ++ geschrieben ist

Einer der (ich viele mögliche erraten) Ansätze:

  1. einen Filter findet, dass "bekommt / berechnet" geraden Linien (Kanten, etc.) aus einem gegebenen Bild.

  2. Jetzt haben Sie die Sammlung (Array) aller Linien (xStart, YStart & xEnd, yEnd). Sie können alle Leitungslängen von den Koordinaten leicht berechnen.

  3. Geben Sie nun bedenkt, dass man immer kann (!) „One-größte-Quadrat / Rechteck“ innerhalb des Bildes erwartet, wäre es ganz einfach, die wanted-Sudoku-Rechteck Region zu finden und zu berechnen und sie aus dem Bild beschneiden zu tun einige weitere Verarbeitung.

EDIT: Solving / Programmierung, die Art von Problemen ist immer eine Herausforderung, aber wirklich interessant zugleich.)

Sie könnten versuchen, die Hough Transformation.

Ich würde zunächst eine Ecke Detektor (The Harris Detektor schön funktioniert), um die Kreuzungen und Ecken des Sudoku zu finden.

Dann würde ich diese Punkte verwenden, um eine Bildentzerrung zu tun, um das Bild zu transformieren das Raster als rechteckig wie möglich zu haben. Jetzt sollten Sie keine Schwierigkeiten haben, jedes Quadrat zu finden, OCR zu tun.

Bildentzerrung nicht einfach und erfordert ziemlich viel Mathematik.

Seien Sie bereit, etwas zu lesen zu tun:)

Wenn die Bilder der Spielbretter sind schon nah Sie rechteckig kann natürlich die Berichtigung Teil überspringen und die Eckpunkte direkt verwenden, um Ihre Plätze für OCR zu finden.

Eine Menge Leute haben darauf hindeutet, Neuronale Netze zu verwenden. Ich bin ziemlich sicher, dass auf dieses Problem ein neuronales Netz zu werfen völlig unnötigen ist. NNs ist (manchmal) gut, wenn man Objekte müssen klassifizieren, wo die Definition des Objekts vage. „Finden Sie Autos in Bild“ ist ein Problem, das die Verwendung für ein neuronales Netz haben könnte, da Autos sehr unterschiedlich aussehen können, aber einige haben die gleichen Eigenschaften. Somit gegeben genügend Daten, können Sie Ihre NN Zugwaggons zu erkennen. In diesem Problem haben Sie etwas, das sehr regelmäßig und immer sieht fast gleich, so ein NN wird nichts einfacher oder besser machen.

Mit aforge colorfiltering

Es gibt viele Filterverfahren für c # vorgesehen, vor allem ziehe ich aforge Filter, für diesen Zweck sie einige Filter haben, sind sie

* ColorFiltering
* ChannelFiltering
* HSLFiltering
* YCbCrFiltering
* EuclideanColorFiltering

sehen Sie hier

Schauen Sie sich auf: https://github.com/dajuric/accord-net-extensions

Die Bibliothek „verbindet“ die freie AForge.NET und Accord.NET Bibliothek und fügt Bildverarbeitung und Objektverfolgung-Algorithmen. Die Proben enthalten:)

Sie könnten versuchen, zuerst die fette Linie Kreuzungen zu finden und sie als Passermarken verwenden.

Dies wäre ein guter Start, denn:

  • Sie sind ziemlich gleichmäßig geformt
  • Sie wissen, wie viele es sind
  • Sie wissen, wo (in etwa) sie in Bezug zueinander
  • sein sollten
  • Kann Skala Variationen tolerieren

So:

  1. Tragen Sie einen Kantenfilter
  2. Scan eine Maske * von dem, was die idealen + sollte über das Bild aussehen, alle Aufnahmen, die ein gutes Spiel sind
  3. Wählen Sie den Satz, der Ihre Erwartungen am besten entspricht, je nach Lage zueinander
  4. Sie wissen jetzt auch, wo sollten die Zahlen, so dass Sie sie leicht extrahieren.

* Eine anspruchsvollere Lösung wäre ein neuronales Netz anstelle einer Maske zu verwenden, um die Kreuzungen zu erkennen. Dies könnte sich lohnen, da your're wahrscheinlich ein für die OCR der Zahlen verwenden gehen.

Ohne keines der anderen Ideen zu verwerfen, Schritt 1 sollte wirklich die Erfassung der Bilddrehung sein. Sie können dies tun, indem Sie die lokalen Gradienten an jedem Punkt zu bestimmen und ein Histogramm davon zu schaffen. Dies wird 4 Hauptkomponenten bei 90 Grad Versatz aufweisen. Im Idealfall würde diese 0 sein, 90, 180 und 270, aber wenn sie es nicht sollten Sie Ihr Bild drehen. Z.B. in dem Beispielbild sollten Sie mit einer Drehung über etwa 8 Grad CW starten.

Sie sollten für Google CamShift oder Blob-Tracking oder Partikelfilter . Sie sind alle sehr nützlich für Ihr Problem. Und die meisten von ihnen sind mit OpenCV ausgeliefert und es ist C # Wrapper AForge.NET. Sie werden ein paar schöne Demos auf Youtube zeigt, wie sie funktionieren.

Viel Glück

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top