Bilder vergleichen, um Unterschiede zu finden

8

Aufgabe: Ich habe eine Kamera am Ende unserer Montagelinie montiert, die Erfasst Bilder von produzierten Objekten. Sagen wir zum Beispiel, dass wir produzieren Tickets (mit einigen Text und Bildern auf ihnen). Also jeder Das produzierte Ticket wird fotografiert und als Image auf der Festplatte gespeichert. Jetzt ich Ich möchte diese gespeicherten Bilder auf Anomalien überprüfen (z. B. vergleichen sie zu einem Bild (eine Vorlage), das ist OK). Also wenn es ein Problem gibt mit einem Ticket an unserem Fließband (fehlendes Bild, ein Fleck, ...), mein Anwendung sollte es finden (weil sein Bild zu sehr von meinem unterscheidet Vorlage).

Frage: Was ist der einfachste Weg, Bilder zu vergleichen und zu finden? Unterschiede zwischen ihnen? Muss ich meine eigenen Methoden schreiben, oder kann ich? bestehende benutzen? Es wäre toll, wenn ich nur einen Toleranzwert einstelle (d. h. Bilder können sich um 1% unterscheiden), legen beide Bilder in eine Funktion und holen ein Rückgabewert von true oder false:)

Tools: C # oder VB.NET, Emgu.CV (.NET Wrapper für OpenCV) oder etwas ähnliches

    
sventevit 31.03.2010, 13:50
quelle

6 Antworten

2

Ich würde empfehlen, sich die AForge Imaging-Bibliothek anzusehen, da sie für diese Art von Funktionen sehr nützliche Funktionen enthält arbeiten.

Es gibt mehrere Methoden, die Sie verwenden könnten:

  1. Einfache Subtraktion (Vorlagenbild - aktuell) und sehen, wie viele Pixel unterschiedlich sind. Sie möchten wahrscheinlich die Ergebnisse schwenken, d. H. Nur Pixel einschließen, die sich um 10 oder mehr unterscheiden (zum Beispiel).
  2. Wenn sich die Tickets im Sichtfeld bewegen können, funktioniert Punkt 1) erst dann, wenn Sie das Ticket zuerst finden. Wenn das Ticket zum Beispiel weiß auf schwarzem Hintergrund ist, könnten Sie einen Schwellenwert für das Bild festlegen, und das würde Ihnen eine gute Vorstellung davon geben, wo das Ticket war.
  3. Eine andere Technik, die ich vorher benutzt habe, ist "Model Finding" oder "Pattern Matching", aber ich kenne nur eine kommerzielle Bibliothek Matrox Imaging Library (oder MIL), die diese Funktionen enthält, da sie nicht trivial sind.

Sie müssen auch sicherstellen, dass Sie wissen, welche Teile des Tickets wichtiger sind. Zum Beispiel denke ich, dass ein fehlendes Logo oder Wasserzeichen ein großes Problem ist. Einige Bereiche können jedoch variablen Text aufweisen, z. B. eine Seriennummer, und Sie sollten davon ausgehen, dass sie anders sind. Grundsätzlich müssen Sie einige Bereiche des Bildes möglicherweise anders behandeln als andere.

    
Matt Warren 01.04.2010, 09:32
quelle
3

Ich weiß nicht viel über OpenCV, aber ein bisschen über Bildverarbeitung.

Der Weg dorthin hängt von der Häufigkeit ab, mit der neue Bilder aufgenommen werden. Ein einfacher Ansatz wäre, ein Differenzbild Ihrer "guten" Vorlage und das Bild Ihres tatsächlichen Produkts zu berechnen.

Wenn die Bilder zu 100% identisch sind, sollte das resultierende Bild leer sein. Wenn Restpixel vorhanden sind, können Sie diese zählen und als Maß für die Abweichung von der Norm verwenden.

Allerdings müssen Sie die Ausrichtung (und wahrscheinlich die Skalierung) eines der Bilder anpassen, um die Ränder auszurichten, sonst funktioniert dieser Ansatz nicht.

Wenn Sie Timing-Einschränkungen haben, möchten Sie möglicherweise die Informationen in Ihren Bildern reduzieren, bevor Sie sie verarbeiten (z. B. eine Kantenerkennung und / oder Konvertierung in Graustufen oder sogar monochromatische Bitmap, wenn die Merkmale Ihres Produkts signifikant genug sind) / p>     

sum1stolemyname 31.03.2010 14:36
quelle
1

Ich kenne die Details nicht, aber ich weiß, dass in industriellen Situationen, in denen ein hoher Durchsatz notwendig ist, dies manchmal mit neuronalen Netzen geschieht. Sie verwandeln Millionen von Bits (Kamerapixel) in 1 (gut oder schlecht). Vielleicht hilft dir das bei deiner Suche.

    
Rene 31.03.2010 13:55
quelle
1

Ich bin nicht der Experte auf dem Gebiet, aber es klingt, als ob Sie so etwas brauchen

Ссылка

Und es scheint, dass OpenCV Unterstützung für das Template-Matching bietet. Ссылка

    
Ivan 31.03.2010 14:56
quelle
1

Es gibt sicherlich Anwendungen und Bibliotheken, die bereits das tun, was Sie zu tun versuchen, aber ich weiß es nicht. Offensichtlich könnte man die zwei Bilder vergleichen und vergleichen, aber das erwartet, dass die Dinge identisch sind und keinen Spielraum für Lichtunterschiede oder solche Dinge lassen.

Unter der Annahme, dass Sie die Objekte in den Bildern so gesteuert haben, dass sie identisch ausgerichtet und identisch positioniert sind, können Sie durch die Pixel jedes Bildes marschieren und die HSV-Werte für jedes Bild erhalten Also:

%Vor%

und mache einige Vergleiche mit diesen Werten. Das würde Ihnen erlauben, sie mit mehr Zuverlässigkeit zu vergleichen, als mit den RGB-Werten, zumal Sie einige Toleranzen in Ihren Vergleich einbeziehen wollen.

Bearbeiten:

Zum Spaß habe ich eine kleine Beispiel-App geschrieben, die meine obige Idee verwendet. Im Wesentlichen summierte sich die Anzahl der Pixel, deren H-, S- und V-Werte sich um einen bestimmten Betrag unterschieden (ich wählte 0.1 als meinen Wert) und fiel dann aus den Vergleichsschleifen heraus, wenn die H-, S- oder V-Zähler 38.400 oder 2% überschreiten die Pixel (0,02 * 1600 * 1200). Im schlimmsten Fall dauerte es ungefähr 2 Sekunden, um zwei identische Bilder zu vergleichen. Wenn ich Bilder verglich, bei denen man sich verändert hatte, um diesen 2% -Wert zu überschreiten, dauerte es im Allgemeinen einen Bruchteil einer Sekunde.

Offensichtlich wäre das wahrscheinlich zu langsam, wenn viele Bilder pro Sekunde produziert würden, aber ich fand es trotzdem interessant.

    
itsmatt 31.03.2010 14:37
quelle
1

Dieser Typ hier hat einen einfachen Java-Code für genau das gleiche Problem geschrieben. Es wird nicht schwer sein, es in C # umzuwandeln, denke ich. Es funktioniert gut, auch eine neuere und stärkere Version kann darin gefunden werden.

    
İsmet Alkan 20.05.2012 01:09
quelle