Ermitteln eines Objekts in einem Kamerabild in C # [geschlossen]

8

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?

    
Jon Grant 31.07.2009, 10:09
quelle

11 Antworten

8

Verwenden Sie dazu die kostenlose AForge.Net Bildverarbeitungsbibliothek. es gibt eine Menge coole Sachen mit denen man spielen kann.

    
Mladen Prajdic 31.07.2009, 10:38
quelle
3

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.

    
chsh 31.07.2009 13:02
quelle
3

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.

  1. Filter API für C, C ++, C #, Visual Basic .NET, Delphi, Python
  2. Ссылка
  3. CIMG ist reicher als die obige Bibliothek, ist jedoch in C ++ geschrieben
Sun 31.07.2009 10:18
quelle
1

Einer der (ich schätze viele möglichen) Ansätze:

  1. Suchen Sie einen Filter, der gerade Linien (Kanten usw.) von einem gegebenen Bild erhält / berechnet.

  2. Jetzt haben Sie die Sammlung (Array) aller Zeilen (xStart, yStart & amp; xEnd, yEnd). Sie können einfach alle Linienlängen aus den Koordinaten berechnen.

  3. Nun, wenn man bedenkt, dass man immer (!) "ein-größtes Quadrat / Rechteck" innerhalb des Bildes erwarten kann, wäre es ziemlich einfach, die gewünschte Sudoku-Rechteck-Region zu finden und zu berechnen und sie aus dem Bild zu schneiden mach etwas weiter.

EDIT: Das Lösen / Programmieren dieser Art von Problemen ist immer herausfordernd, aber gleichzeitig sehr interessant:).

    
sabiland 31.07.2009 10:35
quelle
1

Sie können versuchen, die Hough-Transformation zu verwenden.

    
plinth 31.07.2009 14:17
quelle
1

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.

    
Hannes Ovrén 02.08.2009 07:59
quelle
1

Verwenden Sie aforge colorfiltering

Es gibt viele Filtermethoden für c #, hauptsächlich bevorzuge ich Aforge-Filter, zu diesem Zweck haben sie wenige Filter, sie sind

%Vor%

Siehe hier

    
xfill 24.12.2010 14:36
quelle
1

Sehen Sie sich an: Ссылка

Die Bibliothek "verbindet" die freie AForge.NET- und Accord.NET-Bibliothek und fügt Bildverarbeitungs- und Objektverfolgungsalgorithmen hinzu. Proben enthalten:)

    
dajuric 06.08.2014 00:22
quelle
0

Sie könnten zuerst versuchen, die fettgedruckten Linienschnittpunkte zu finden und sie als Passmarken zu verwenden.

Das wäre ein guter Anfang, weil:

  • Sie sind ziemlich einheitlich geformt
  • Sie wissen, wie viele es sind
  • Sie wissen, wo (grob) sie in Beziehung zueinander stehen sollten
  • Kann Maßstabsschwankungen tolerieren

Also:

  1. Wenden Sie einen Kantenfilter an
  2. Scannen Sie eine Maske *, wie das ideale + über das Bild hinweg aussehen soll, und zeichnen Sie alles auf, was gut passt
  3. Wählen Sie das Set, das am besten zu Ihren Erwartungen passt, je nach Standort
  4. Sie wissen jetzt auch, wo die Zahlen sein sollten, damit Sie sie leicht extrahieren können.

* 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.

    
pufferfish 31.07.2009 11:12
quelle
0

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.

    
MSalters 11.08.2009 14:50
quelle
0

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

    
Matthias 03.05.2013 14:02
quelle