Ich habe ein Bild von einer Live-Webcam, und ich möchte in der Lage sein, ein bestimmtes Objekt im Bild zu erkennen und den Teil davon zu extrahieren, um weitere Bearbeitungen vorzunehmen.
Genauer gesagt würde das Bild von einem Spielbrett sein, sagen wir für die Zwecke dieser Frage, dass es ein Sudoku-Spielbrett ist. Hier ist ein Beispielbild .
Meine anfängliche Herangehensweise war, nach kontrastierenden Bereichen zu suchen und sie von dort aus zu erarbeiten, aber ich scheine mit vielen möglichen Kanten zu enden (viele fehlerhafte) und keinen wirklichen Hinweis darauf, wie man herausfinden soll, welche die richtigen sind Ich will wirklich!
Gibt es Algorithmen, Bibliotheken, Codebeispiele oder einfach nur gute Ideen, wie ich den relevanten Teil des Bildes finden und extrahieren könnte?
Verwenden Sie dazu die kostenlose AForge.Net Bildverarbeitungsbibliothek. es gibt eine Menge coole Sachen mit denen man spielen kann.
Dies ist die Funktion eines Coding4Fun-Blogeintrags , den Sie finden könnten hilfreich. Dies bedeutet auch eine zweite Abstimmung für die AForge-Bibliothek, da der Autor sie im Beispiel verwendet.
Sie müssen Filteroperationen und Masken auf dem Bild durchführen.
Ich denke, es gibt keine einfachen Möglichkeiten, nur Objekte aus dem Bild zu holen. Sie müssen Kantenerkennungsalgorithmen, Clipping und die Kriterien für gültige Objekte / Bilder verwenden.
Sie können die Bildschwelle auch verwenden, um ein Objekt zu erkennen. Hier ist Artikel und Algorithmus von Stanford Uni.
Sie können unter der Bibliothek für die Bildverarbeitung nachsehen.
Einer der (ich schätze viele möglichen) Ansätze:
Suchen Sie einen Filter, der gerade Linien (Kanten usw.) von einem gegebenen Bild erhält / berechnet.
Jetzt haben Sie die Sammlung (Array) aller Zeilen (xStart, yStart & amp; xEnd, yEnd). Sie können einfach alle Linienlängen aus den Koordinaten berechnen.
EDIT: Das Lösen / Programmieren dieser Art von Problemen ist immer herausfordernd, aber gleichzeitig sehr interessant:).
Ich würde mit einem Eckendetektor beginnen (der Harris-Detektor funktioniert gut), um die Schnittpunkte und Ecken des Sudoku-Gitters zu finden.
Dann würde ich diese Punkte verwenden, um eine Bildentzerrung durchzuführen, um das Bild so zu transformieren, dass das Raster so rechteckig wie möglich ist. Jetzt sollten Sie keine Probleme mehr haben, jedes Quadrat für OCR zu finden.
Die Bildentzerrung ist nicht einfach und erfordert ziemlich viel Mathematik.
Seien Sie bereit, etwas zu lesen:)
Wenn die Bilder der Spielbretter bereits fast rechteckig sind, können Sie natürlich den Entzerrungsteil überspringen und direkt die Eckpunkte verwenden, um Ihre Quadrate für die OCR zu finden.
Viele Leute haben vorgeschlagen, Neuronale Netze zu verwenden. Ich bin mir ziemlich sicher, dass es völlig unnötig ist, ein neurales Netzwerk auf dieses Problem zu werfen. NNs sind (manchmal) gut, wenn Sie Objekte klassifizieren müssen, bei denen die Definition des Objekts vage ist. "Autos im Bild zu finden" ist ein Problem, das für ein Neuronales Netzwerk nützlich sein könnte, da Autos sehr unterschiedlich aussehen können, aber einige Funktionen die gleichen haben. Wenn Sie also genügend Daten haben, können Sie Ihr NN trainieren, um Autos zu erkennen. Bei diesem Problem hast du etwas, das sehr regelmäßig ist und immer fast gleich aussieht, also macht ein NN nichts leichter oder besser.
Sie könnten zuerst versuchen, die fettgedruckten Linienschnittpunkte zu finden und sie als Passmarken zu verwenden.
Das wäre ein guter Anfang, weil:
Also:
* Eine ausgeklügeltere Lösung wäre, ein Neuronales Netz anstelle einer Maske zu verwenden, um die Schnittpunkte zu erkennen. Dies könnte sich lohnen, da Sie wahrscheinlich einen für die OCR der Zahlen verwenden werden.
Ohne die anderen Ideen abzulehnen, sollte Schritt 1 wirklich die Erkennung der Bilddrehung sein. Sie können dies tun, indem Sie an jedem Punkt den lokalen Gradienten bestimmen und ein Histogramm erstellen. Dies wird 4 Hauptkomponenten bei 90 Grad Offsets haben. Idealerweise wären dies 0, 90, 180 und 270, aber wenn nicht, sollten Sie Ihr Bild drehen. Z.B. im Beispielbild sollten Sie mit einer Drehung über 8 Grad CW beginnen.
Sie sollten nach CamShift oder Blob-Tracking oder Partikelfilter suchen. Sie sind alle nützlich für Ihr Problem. Und die meisten von ihnen sind mit OpenCV ausgeliefert und es ist C # Wrapper AForge.NET. Sie werden auf Youtube einige nette Demos finden, die zeigen, wie sie funktionieren.
Viel Glück
Tags und Links .net c# image-processing edge-detection