Erkennen eines Objektes in einem Kamerabild in C#
Habe ich ein Bild, aufgenommen von einer live-webcam, und ich möchte in der Lage sein zu erkennen ob ein bestimmtes Objekt in der Bild-und Auszug, Teil davon zu tun, einige weitere Verarbeitung.
Speziell, das Bild wäre von einem Spielbrett, sagen wir, für die Zwecke dieser Frage, dass es ein Sudoku-Spiel Bord.
Mein Erster Ansatz war zu schauen, für gegensätzliche Bereiche und arbeiten Sie sich von dort aus, aber ich scheinen, um am Ende mit viel Potenzial Kanten (viele irrige) und keine wirkliche Ahnung, wie arbeiten Sie heraus, welche sind die, die ich eigentlich will!!!
Gibt es algorithmen, Bibliotheken, code-Beispiele oder auch nur Ideen gibt, wie ich gehen würde, über das finden und extrahieren der relevante Teil des Bildes?
Du musst angemeldet sein, um einen Kommentar abzugeben.
nutzen Sie die Kostenlose AForge.Net Bildverarbeitungs-Bibliothek für das. es gibt eine Tonne von coolen Sachen zu spielen.
Müssen Sie die Durchführung der Filter-Vorgang und Masken auf das Bild.
Ich denke es gibt keine einfache Möglichkeiten, nur abrufen Objekt aus dem Bild, müssen Sie die edge-detection-algorithmen, clipping, und legen Sie die Kriterien für gültige Objekte/Bild.
Können Sie auch image thresholding zu erkennen-Objekt. Sie möchten möglicherweise betrachten unter Image processing library.
Einer der (ich denke mal viele mögliche) Methoden:
Finden Sie einen filter, der "bekommt/berechnet" gerade Linien (Kanten, etc.) aus einem bestimmten Bild.
Haben Sie nun die Auflistung (array) aller Zeilen (xStart,yStart & xEnd,yEnd). Sie können ganz einfach berechnen Sie alle line-Längen aus den Koordinaten.
EDIT: Lösung/Programmierung diese Art von Problemen ist immer eine Herausforderung, ABER wirklich interessant ist, zur gleichen Zeit :).
Können Sie versuchen, die Hough-Transformation.
Würde ich beginnen mit einer Ecke-Detektor (Harris-Detektor arbeitet schön) zu finden, die Kreuzungen und Ecken des sudoku-raster.
Dann würde ich diese Punkte verwenden, um ein Bild Nachbesserung zu verwandeln, die das Bild in das raster rechtwinklig wie möglich. Nun sollten Sie keine Schwierigkeiten haben, jedes Quadrat zu tun OCR.
Bildentzerrung ist nicht einfach und beinhaltet sehr viel Mathematik.
Bereit sein, etwas zu Lesen 🙂
Wenn die Bilder der Spiel-boards sind bereits in der Nähe rechteckige natürlich können Sie überspringen die Berichtigung Teil und direkt verwenden, um die Eckpunkte zu finden, Ihre Plätze für OCR.
Eine Menge Leute haben vorgeschlagen, um die Verwendung von Neuronalen Netzen. Ich bin mir ziemlich sicher, dass das auslösen eines neuronalen Netzes auf dieses problem ist völlig unnötig. NNs sind (manchmal) gut, wenn Sie brauchen, um zu klassifizieren von Objekten, wo die definition des Objekts ist vage. "Finden Autos im Bild" ist ein problem, das auch gebrauchen könnten, für ein Neuronales Netz, da die Autos sehr unterschiedlich Aussehen können, haben aber einige features die gleichen. Also, wenn Sie genügend Daten haben, können Sie trainieren Sie Ihr NN zu erkennen Autos.
In diesem problem, das Sie haben, etwas, das sehr regelmäßig und sieht immer fast das gleiche, so ein NN wird nichts einfacher oder besser.
Verwenden aforge colorfiltering
Es gibt viele Filter-Methode zur Verfügung gestellt, die für c#, hauptsächlich bevorzuge ich aforge-Filter, für diesen Zweck haben Sie einige Filter, Sie sind
Siehe hier
Werfen Sie einen Blick auf:
https://github.com/dajuric/accord-net-extensions
Die Bibliothek "schließt sich der" freien AForge.NET und Accord.NET Bibliothek und fügt die Bild-Verarbeitungs-und Objekt-tracking-algorithmen.
Proben 🙂
Könnten Sie versuchen, als Erster die kühne Linie Kreuzungen und verwenden Sie Sie als Kennzeichen.
Wäre dies ein guter Anfang sein, denn:
Also:
* Eine komplexere Lösung wäre die Verwendung eines Neuronalen Netzes anstelle einer Maske zu erkennen, die Kreuzungen. Dies könnte sich lohnen, da Ihr wahrscheinlich sind zu verwenden, eine für die OCR der zahlen.
Ohne Ablehnung eine der anderen Ideen, Schritt 1 sollte wirklich der Erkennung des Bildes rotation. Sie können dies tun, durch die Bestimmung der lokalen Gradienten an jedem Punkt, und erstellen Sie ein Histogramm davon. Dieser wird von 4 wichtigen Komponenten, die in 90-Grad-offsets. Im Idealfall würden diese von 0, 90, 180 und 270, aber wenn Sie nicht Sie sollten drehen Sie Ihr Bild. E. g. im Beispielbild sollten Sie beginnen mit einer rotation über etwa 8 Grad. CW.
Sollten Sie google für CamShift oder Blob-tracking oder partikelfilter. Sie sind alle nützlich für Ihr problem. Und die meisten von Ihnen sind im Lieferumfang mit OpenCV und C# - wrapper AForge.NET. Sie finden einige schöne demos auf Youtube zeigt, wie Sie funktionieren.
Glück