it-swarm.com.de

Bildverarbeitung: Verbesserung des Algorithmus für die Erkennung von "Coca-Cola Can"

Eines der interessantesten Projekte, an denen ich in den letzten Jahren gearbeitet habe, war ein Projekt über Bildverarbeitung . Das Ziel war, ein System zu entwickeln, um Coca-Cola 'Dosen' erkennen zu können (beachten Sie, dass ich das Wort 'Dosen' betone, Sie werden in einer Minute sehen, warum). Unten sehen Sie ein Beispiel mit der Dose, die in grünes Rechteck mit Skalierung und Drehung erkannt wird.

Template matching

Einige Einschränkungen für das Projekt:

  • Der Hintergrund könnte sehr laut sein.
  • Die can kann eine beliebige Skala oder Drehung oder sogar eine Ausrichtung (innerhalb vernünftiger Grenzen) haben.
  • Das Bild könnte etwas unscharf sein (Konturen sind möglicherweise nicht ganz gerade).
  • Es könnte Coca-Cola-Flaschen im Bild geben, und der Algorithmus sollte nur das can!
  • Die Helligkeit des Bildes kann sehr unterschiedlich sein (Sie können sich also bei der Farberkennung nicht auf "zu viel" verlassen).
  • Das can könnte teilweise an den Seiten oder in der Mitte und möglicherweise teilweise hinter einer Flasche verborgen sein.
  • Es könnte kein can im Bild geben. In diesem Fall mussten Sie nichts finden und eine entsprechende Nachricht schreiben.

So könnten Sie mit kniffligen Dingen wie diesen enden (die in diesem Fall meinen Algorithmus total zum Scheitern gebracht hätten):

Total fail

Ich habe dieses Projekt vor einiger Zeit gemacht und hatte viel Spaß dabei und hatte eine anständige Implementierung. Hier sind einige Details zu meiner Implementierung:

Sprache: In C++ mit OpenCV library ausgeführt.

Vorverarbeitung: Für die Bildvorverarbeitung, d. H. Umwandlung des Bildes in eine rohere Form, um den Algorithmus zu erhalten, habe ich zwei Methoden verwendet:

  1. Ändern der Farbdomäne von RGB in HSV und Filtern basierend auf "rotem" Farbton, Sättigung oberhalb einer bestimmten Schwelle, um orangeähnliche Farben zu vermeiden, und Filtern von niedrigen Werten, um dunkle Töne zu vermeiden. Das Endergebnis war ein binäres Schwarzweißbild, bei dem alle weißen Pixel die Pixel darstellen würden, die diesem Schwellenwert entsprechen. Offensichtlich ist immer noch viel Mist im Bild, aber dies reduziert die Anzahl der Dimensionen, mit denen Sie arbeiten müssen.Binarized image
  2. Rauschfilterung mittels Medianfilterung (wobei der mittlere Pixelwert aller Nachbarn verwendet und das Pixel durch diesen Wert ersetzt wird), um das Rauschen zu reduzieren.
  3. Verwenden Sie Canny Edge Detection Filter , um die Konturen aller Elemente nach 2 vorherigen Schritten abzurufen .Contour detection

Algorithmus: Der Algorithmus, den ich für diese Aufgabe ausgewählt habe, stammt aus this awesome book über Feature-Extraktion und heißt Generalized Hough Transform (ziemlich verschieden von der regulären Hough-Transformation). Im Grunde sagt es ein paar Dinge:

  • Sie können ein Objekt im Raum beschreiben, ohne dessen analytische Gleichung zu kennen (was hier der Fall ist).
  • Es ist beständig gegen Bildverformungen wie Skalierung und Rotation, da es grundsätzlich für jede Kombination aus Skalierungsfaktor und Rotationsfaktor getestet wird.
  • Es verwendet ein Basismodell (eine Vorlage), das der Algorithmus "lernen" wird.
  • Jedes im Konturbild verbleibende Pixel stimmt für ein anderes Pixel ab, das angeblich der Mittelpunkt (in Bezug auf die Schwerkraft) Ihres Objekts ist, basierend auf dem, was es aus dem Modell gelernt hat.

Am Ende erhalten Sie eine Heat-Map der Stimmen. Zum Beispiel stimmen hier alle Pixel der Dosen-Kontur für ihr Gravitationszentrum ab. Sie haben also viele Stimmen in demselben Pixel, das dem entspricht in der Mitte und sehen einen Peak in der Heatmap wie folgt:

GHT

Sobald Sie das haben, können Sie mit einer einfachen schwellenwertbasierten Heuristik die Position des mittleren Pixels angeben, von der Sie die Skalierung und die Rotation ableiten und dann Ihr kleines Rechteck um es plotten können (die endgültige Skalierung und der Rotationsfaktor sind offensichtlich relativ zu Ihrem Originalvorlage). Zumindest theoretisch ...

Ergebnisse: Nun, während dieser Ansatz in den grundlegenden Fällen funktionierte, fehlte es in einigen Bereichen stark:

  • Es ist extrem langsam! Ich betone das nicht genug. Für die Verarbeitung der 30 Testbilder war fast ein ganzer Tag erforderlich. Offensichtlich hatte ich einen sehr hohen Skalierungsfaktor für Rotation und Translation, da einige Dosen sehr klein waren.
  • Es war völlig verloren, als Flaschen im Bild waren, und aus irgendeinem Grund fand die Flasche fast immer statt der Dose (vielleicht weil Flaschen größer waren, also mehr Pixel hatten, also mehr Stimmen)
  • Unscharfe Bilder waren auch nicht gut, da die Stimmen in zufälligen Positionen in der Mitte des Pixels landeten und mit einer sehr lauten Heatmap endeten.
  • Abweichungen bei der Translation und Rotation wurden erzielt, jedoch nicht in der Orientierung, was bedeutet, dass eine Dose, die nicht direkt auf das Kameraobjektiv gerichtet war, nicht erkannt wurde.

Können Sie mir helfen, meinen spezifischen - Algorithmus zu verbessern, indem Sie exklusiv OpenCV -Funktionen verwenden, um die vier spezifischen - Probleme zu lösen?

Ich hoffe, einige Leute werden auch etwas daraus lernen, schließlich denke ich, dass nicht nur Leute, die Fragen stellen, lernen sollten. :)

1485
Charles Menguy

Ein alternativer Ansatz wäre das Extrahieren von Features (Schlüsselpunkten) mithilfe der skalierungsinvarianten Feature-Transformation (SIFT) oder Beschleunigte robuste Features (SURF).

Es ist in OpenCV 2.3.1 implementiert.

Ein Nice-Codebeispiel finden Sie unter Verwendung von Features in Features2D + Homography, um ein bekanntes Objekt zu finden.

Beide Algorithmen sind unabhängig von Skalierung und Rotation. Da sie mit Features arbeiten, können Sie auch mit Okklusion arbeiten (sofern genügend Schlüsselpunkte sichtbar sind).

Enter image description here

Bildquelle: Tutorialbeispiel

Die Verarbeitung dauert einige hundert ms für SIFT, SURF ist etwas schneller, jedoch nicht für Echtzeitanwendungen geeignet. Der ORB verwendet FAST, was in Bezug auf die Rotationsinvarianz schwächer ist.

Die Originalpapiere

604
stacker

Um die Dinge zu beschleunigen, würde ich die Tatsache ausnutzen, dass Sie nicht gebeten werden, ein beliebiges Bild/Objekt zu finden, sondern speziell eines mit dem Coca-Cola-Logo. Dies ist wichtig, da dieses Logo sehr charakteristisch ist und im Frequenzbereich, insbesondere im Rotkanal von RGB, eine charakteristische, skalierungsinvariante Signatur aufweisen sollte. Das heißt, das abwechselnde Muster von Rot zu Weiß zu Rot, das von einer horizontalen Abtastlinie (die auf einem horizontal ausgerichteten Logo trainiert wird) angetroffen wird, hat einen bestimmten "Rhythmus", wenn es durch die Mittelachse des Logos verläuft. Dieser Rhythmus "beschleunigt" oder "verlangsamt" sich in verschiedenen Maßstäben und Ausrichtungen, bleibt jedoch proportional gleich. Sie können ein paar Dutzend solcher Scanlinien sowohl horizontal als auch vertikal durch das Logo und mehrere diagonal in einem Starburst-Muster identifizieren/definieren. Nennen Sie diese die "Signatur-Scan-Zeilen".

Signature scan line

Nach dieser Signatur im Zielbild zu suchen, ist eine einfache Angelegenheit, das Bild in horizontalen Streifen zu scannen. Suchen Sie im Rotkanal nach einer Hochfrequenz (die anzeigt, dass Sie von einer roten in eine weiße Region gewechselt sind) und prüfen Sie, ob einer der in der Trainingseinheit identifizierten Frequenzrhythmen darauf folgt. Sobald eine Übereinstimmung gefunden wurde, werden Sie sofort die Ausrichtung und Position der Scan-Linie im Logo erkennen (wenn Sie diese Dinge während des Trainings im Auge behalten), sodass es trivial ist, die Grenzen des Logos von dort aus zu identifizieren.

Es würde mich überraschen, wenn dies kein linear effizienter Algorithmus wäre oder beinahe. Es geht offensichtlich nicht um Ihre Diskriminierung bei Dosenflaschen, aber zumindest haben Sie Ihre Logos.

(Update: Für die Flaschenerkennung würde ich neben dem Logo nach Cola (der braunen Flüssigkeit) suchen - das ist innen die Flasche. Oder, im Falle einer leeren Flasche, würde ich suchen a Kappe die immer dieselbe Grundform, Größe und denselben Abstand zum Logo hat und normalerweise weiß oder rot ist. Suchen Sie nach einer einfarbigen eliptischen Form, in der eine Kappe sollte sein, relativ zum Logo. Natürlich nicht idiotensicher, aber Ihr Ziel sollte hier sein, die einfachen diejenigen schnellen zu finden.)

(Es ist ein paar Jahre her, seit ich mit der Bildverarbeitung begonnen habe. Ich habe diesen Vorschlag hochgradig und konzeptionell gehalten. Ich denke, er entspricht in etwa der Funktionsweise eines menschlichen Auges - oder zumindest der Funktionsweise meines Gehirns!)

362
kmote

Lustiges Problem: Als ich auf Ihr Flaschenbild blickte, dachte ich, es sei auch eine Dose. Aber als Mensch habe ich den Unterschied erkannt, dass ich dann auch gemerkt habe, dass es auch eine Flasche ist ...

Um Dosen und Flaschen zu unterscheiden, wie wäre es, wenn Sie zuerst nach Flaschen suchen? Wenn Sie eine finden, maskieren Sie das Etikett, bevor Sie nach Dosen suchen.

Nicht zu schwer zu implementieren, wenn Sie bereits Dosen machen. Der wahre Nachteil ist, dass sich Ihre Bearbeitungszeit verdoppelt. (Aber wenn Sie an reale Anwendungen denken, werden Sie sowieso Flaschen machen wollen ;-)

142
Darren Cook

Ist es nicht einmal für den Menschen schwierig, im zweiten Bild zwischen einer Flasche und einer Dose zu unterscheiden (vorausgesetzt, der transparente Bereich der Flasche ist verborgen)?

Sie sind fast gleich, abgesehen von einer sehr kleinen Region (dh die Breite am oberen Ende der Dose ist etwas klein, während die Umhüllung der Flasche überall die gleiche Breite hat, aber eine kleine Änderung, oder?)

Das erste, was mir in den Sinn kam, war, nach dem roten Flaschenverschluss zu suchen. Es ist jedoch immer noch ein Problem, wenn es kein Oberteil für die Flasche gibt oder wenn es teilweise verborgen ist (wie oben erwähnt).

Das zweite, was ich dachte, war über die Transparenz der Flasche. OpenCV bietet einige Arbeiten zum Finden von transparenten Objekten in einem Bild. Überprüfen Sie die untenstehenden Links.

Sehen Sie sich dies besonders an, um zu sehen, wie genau sie Glas erkennen:

Sehen Sie ihr Implementierungsergebnis:

Enter image description here

Sie sagen, es sei die Implementierung des Papiers "Ein geodätisches Active Contour Framework für das Finden von Glas" von K. McHenry und J. Ponce, CVPR 2006 .

In Ihrem Fall kann es hilfreich sein, , aber das Problem tritt erneut auf, wenn die Flasche gefüllt ist.

Ich denke, hier kann man zuerst nach dem transparenten Körper der Flaschen oder nach einem roten Bereich suchen, der seitlich mit zwei transparenten Objekten verbunden ist, was offensichtlich die Flasche ist. (Bei idealer Arbeit ein Bild wie folgt.)

Enter image description here

Jetzt können Sie den gelben Bereich, das heißt das Etikett der Flasche, entfernen und den Algorithmus ausführen, um die Dose zu finden.

Auf jeden Fall hat diese Lösung auch andere Probleme wie bei den anderen Lösungen.

  1. Es funktioniert nur, wenn Ihre Flasche leer ist. In diesem Fall müssen Sie nach dem roten Bereich zwischen den beiden schwarzen Farben suchen (wenn die Coca Cola-Flüssigkeit schwarz ist).
  2. Ein weiteres Problem, wenn der transparente Teil abgedeckt ist.

Wenn jedoch keines der oben genannten Probleme in den Bildern auftritt, scheint dies ein besserer Weg zu sein.

113
Abid Rahman K

Ich mag Darren Cooks und Stacker Antworten zu diesem Problem. Ich war gerade dabei, meine Gedanken in einen Kommentar zu diesen zu werfen, aber ich glaube, mein Ansatz ist zu antwortorientiert, um hier nicht zu gehen.

Kurz zusammengefasst haben Sie einen Algorithmus identifiziert, mit dem festgestellt werden kann, dass ein Coca-Cola-Logo an einer bestimmten Stelle im Weltraum vorhanden ist. Sie versuchen nun, für beliebige Ausrichtungen und beliebige Skalierungsfaktoren eine Heuristik zu bestimmen, mit der Coca-Cola -Dosen von anderen Objekten unterschieden werden können, einschließlich: Flaschen , Reklametafeln , Werbung und Coca-Cola Utensilien alle mit diesem ikonischen Logo verbunden. Sie haben in Ihrer Problemstellung nicht viele dieser zusätzlichen Fälle genannt, aber ich bin der Meinung, dass sie für den Erfolg Ihres Algorithmus von entscheidender Bedeutung sind.

Das Geheimnis hierbei ist, zu bestimmen, welche visuellen Merkmale eine Dose enthält oder durch den negativen Raum, welche Merkmale für andere Cola-Produkte vorhanden sind, die für Dosen nicht vorhanden sind. Zu diesem Zweck skizziert die aktuelle Top-Antwort einen grundlegenden Ansatz für die Auswahl von "Dose", wenn und nur wenn "Flasche" nicht identifiziert wird, entweder durch das Vorhandensein eines Flaschenverschlusses, einer Flüssigkeit oder eines ähnlichen visuelle Heuristik.

Das Problem ist, dass dies zusammenbricht. Eine Flasche könnte zum Beispiel leer sein und keinen Verschluss haben, was zu einem falschen Positiv führt. Oder es könnte sich um eine Teilflasche handeln , bei der zusätzliche Merkmale verstümmelt sind, was wiederum zu einer falschen Erkennung führt. Das ist natürlich weder elegant noch effektiv für unsere Zwecke.

Zu diesem Zweck scheinen die korrektesten Auswahlkriterien für Dosen die folgenden zu sein:

  • Ist die Form der Objektsilhouette wie Sie haben in Ihrer Frage skizziert korrekt? Wenn ja, +1.
  • Wenn wir das Vorhandensein von natürlichem oder künstlichem Licht annehmen, erkennen wir eine chrome Kontur auf der Flasche, die anzeigt, ob diese aus Aluminium besteht? Wenn ja, +1.
  • Stellen wir fest, dass die Spiegeleigenschaften des Objekts im Verhältnis zu unseren Lichtquellen korrekt sind ( illustrativer Videolink ein Lichtquellenerkennung )? Wenn ja, +1.
  • Können wir andere Eigenschaften des Objekts bestimmen, die es als Dose identifizieren, einschließlich, aber nicht beschränkt auf den topologischen Bildversatz des Logos, die Ausrichtung des Objekts, die Nebeneinanderstellung des Objekts (z. B. auf einer ebenen Oberfläche)? wie ein Tisch oder im Zusammenhang mit anderen Dosen) und das Vorhandensein einer Aufreißlasche? Wenn ja, jeweils +1.

Ihre Klassifizierung könnte dann folgendermaßen aussehen:

  • Zeichnen Sie für jedes Kandidatenspiel einen grauen Rahmen, wenn das Vorhandensein eines Coca-Cola-Logos festgestellt wurde.
  • Zeichnen Sie für jedes Match über +2 einen roten Rand.

Dies hebt für den Benutzer visuell hervor, was erkannt wurde, und hebt schwache Positive hervor, die korrekterweise als verstümmelte Dosen erkannt werden können.

Die Erkennung jeder Eigenschaft ist zeitlich und räumlich sehr unterschiedlich komplex, und für jeden Ansatz ist ein schneller Durchlauf http://dsp.stackexchange.com mehr als angemessen, um die korrektesten und am meisten zutreffenden zu ermitteln effizienter Algorithmus für Ihre Zwecke. Ich möchte hier lediglich betonen, dass das Erkennen , ob etwas eine Dose ist, indem ein kleiner Teil des Kandidatenerkennungsbereichs ungültig gemacht wird , nicht die robusteste oder effektivste Lösung ist In diesem Fall sollten Sie im Idealfall die entsprechenden Maßnahmen ergreifen.

Und hey, herzlichen Glückwunsch zu dem Hacker News Posting! Im Großen und Ganzen ist dies eine ziemlich großartige Frage, die der Werbung würdig ist, die sie erhalten hat. :)

48
MrGomez

Form betrachten

Nehmen Sie einen Blick auf die Form der roten Dose/Flasche. Beachten Sie, dass die Dose ganz oben etwas abgeschrägt ist, während das Flaschenetikett gerade ist. Sie können zwischen diesen beiden unterscheiden, indem Sie die Breite des roten Teils über die Länge vergleichen.

Blick auf Highlights

Eine Möglichkeit, Flaschen und Dosen zu unterscheiden, ist das Material. Eine Flasche besteht aus Kunststoff, während eine Dose aus Aluminiummetall besteht. In ausreichend gut beleuchteten Situationen wäre der Blick auf die Spiegelung eine Möglichkeit, ein Flaschenetikett von einem Dosenetikett zu unterscheiden.

Soweit ich das beurteilen kann, würde ein Mensch den Unterschied zwischen den beiden Etikettentypen unterscheiden. Wenn die Beleuchtungsbedingungen schlecht sind, besteht zweifellos eine gewisse Unsicherheit bei der Unterscheidung der beiden. In diesem Fall müssten Sie das Vorhandensein der durchsichtigen/durchscheinenden Flasche selbst feststellen können.

39
tskuzzy

Schauen Sie sich Zdenek Kalals Predator tracker an. Es erfordert etwas Übung, kann jedoch aktiv lernen, wie das verfolgte Objekt in verschiedenen Orientierungen und Maßstäben aussieht und dies in Echtzeit durchführt!

Der Quellcode ist auf seiner Website verfügbar. Es ist in MATLAB , aber vielleicht gibt es bereits eine Java-Implementierung, die von einem Community-Mitglied durchgeführt wurde. Ich habe den Tracker-Teil von TLD erfolgreich in C # implementiert. Wenn ich mich recht erinnere, verwendet TLD Ferns als Keypoint-Detektor. Ich verwende stattdessen entweder SURF oder SIFT (bereits von @stacker vorgeschlagen), um das Objekt erneut zu erfassen, falls es vom Tracker verloren ging. Das Feedback des Trackers macht es leicht, mit der Zeit eine dynamische Liste von Sift/Surf-Vorlagen zu erstellen, die es mit der Zeit ermöglichen, das Objekt mit sehr hoher Präzision zu erfassen.

Wenn Sie an meiner C # -Implementierung des Trackers interessiert sind, können Sie gerne nachfragen.

35
user1222021

Wenn Sie nicht nur auf eine Kamera beschränkt sind, die sich nicht in einer Ihrer Einschränkungen befand, können Sie einen Entfernungssensor wie die Xbox Kinect verwenden. Hiermit können Sie eine tiefe und farbbasierte angepasste Segmentierung des Bildes durchführen. Dies ermöglicht eine schnellere Trennung von Objekten im Bild. Sie können dann ICP-Abgleich oder ähnliche Techniken verwenden, um sogar die Form der Dose und nicht nur deren Umriss oder Farbe anzupassen. Wenn sie zylindrisch ist, kann dies eine gültige Option für jede Ausrichtung sein, wenn Sie einen vorherigen 3D-Scan des Ziels haben. Diese Techniken sind oft recht schnell, besonders wenn sie für einen bestimmten Zweck verwendet werden, der Ihr Geschwindigkeitsproblem lösen sollte. 

Ich könnte auch vorschlagen, nicht unbedingt auf Genauigkeit oder Geschwindigkeit, aber zum Spaß könnten Sie ein trainiertes neuronales Netzwerk auf Ihrem farbtonbildenden Bild verwenden, um die Form der Dose zu identifizieren. Diese sind sehr schnell und können oft bis zu 80/90% genau sein. Das Training wäre jedoch ein langer Prozess, da Sie die Dose in jedem Bild manuell identifizieren müssen. 

30

Ich würde rote Rechtecke erkennen: RGB -> HSV, Filter rot -> Binärbild, close (erweitern Sie sich dann ab, bekannt als imclose in matlab)

Schauen Sie sich dann die Rechtecke vom größten bis zum kleinsten an. Rechtecke mit kleineren Rechtecken an einer bekannten Position/Skala können beide entfernt werden (vorausgesetzt, die Flaschenproportionen sind konstant, das kleinere Rechteck wäre ein Flaschenverschluss). 

Dies würde Sie mit roten Rechtecken verlassen, dann müssen Sie die Logos irgendwie erkennen, um zu erkennen, ob sie ein rotes Rechteck oder eine Coladose sind. Wie OCR, aber mit einem bekannten Logo?

21
Alex L

Dies kann eine sehr naive Idee sein (oder überhaupt nicht funktionieren), aber die Abmessungen aller Koksdosen sind festgelegt. Wenn also dasselbe Bild sowohl eine Dose als auch eine Flasche enthält, können Sie sie nach Größenangaben unterscheiden (Flaschen werden größer). Aufgrund fehlender Tiefe (d. H. 3D-Mapping auf 2D-Mapping) ist es möglich, dass eine Flasche verkleinert erscheint und es keinen Größenunterschied gibt. Sie können einige Tiefeninformationen mit Stereo-Imaging wiederherstellen und dann die Originalgröße wiederherstellen. 

20
Sharad

Hmm, ich denke tatsächlich, ich bin auf etwas (das ist wie die interessanteste Frage überhaupt - also wäre es eine Schande, es nicht weiter zu versuchen finde die "perfekte" Antwort, obwohl eine akzeptable gefunden wurde) ...

Sobald Sie das Logo gefunden haben, sind Ihre Probleme zur Hälfte gelöst. Dann müssen Sie nur noch die Unterschiede zwischen around dem Logo herausfinden. Zusätzlich möchten wir so wenig wie möglich extra tun. Ich denke, das ist eigentlich dieser einfache Teil ...

Was steht um das Logo? Für eine Dose können wir Metall sehen, das sich trotz Lichteinwirkung in seiner Grundfarbe überhaupt nicht verändert. Solange wir den Winkel des Etiketts kennen, können wir erkennen, was direkt darüber liegt, und untersuchen den Unterschied zwischen diesen:

Hier ist das, was über und unter dem Logo ist, vollständig dunkel und farblich konsistent. In dieser Hinsicht relativ einfach.

Hier ist das, was oben und unten ist, hell, aber dennoch farblich konsistent. Es ist ganz aus Silber und ganz aus Silber, und Silberfarben im Allgemeinen scheinen eigentlich ziemlich selten zu sein. Darüber hinaus ist es dünn und nahe genug an dem bereits identifizierten Rot, sodass Sie seine Form über die gesamte Länge verfolgen können, um einen Prozentsatz dessen zu berechnen, was als Metallring der Dose angesehen werden kann. Eigentlich braucht man nur einen kleinen Bruchteil davon irgendwo auf der Dose, um zu erkennen, dass es sich um einen Teil handelt, aber man muss trotzdem eine Waage finden, die sicherstellt, dass es sich nicht nur um eine leere Flasche mit etwas Metall dahinter handelt.

Und zum Schluss der Knifflige. Aber nicht so schwierig, wenn wir erst einmal an dem vorbeigehen, was wir direkt über (und unter) der roten Hülle sehen können. Es ist transparent, was bedeutet, dass es zeigt, was sich dahinter befindet. Das ist gut, denn Dinge, die dahinter stecken, haben wahrscheinlich nicht die gleiche Farbe wie das silberne, kreisförmige Metall der Dose. Es könnte viele verschiedene Dinge dahinter geben, die uns sagen würden, dass es sich um eine leere (oder mit klarer Flüssigkeit gefüllte) Flasche handelt, oder eine einheitliche Farbe, was entweder bedeuten könnte, dass sie mit Flüssigkeit gefüllt ist oder dass sich die Flasche einfach vor einer befindet einfarbig. Wir arbeiten mit dem, was oben und unten am nächsten ist, und die Chancen, dass die richtigen Farben am richtigen Ort sind, sind relativ gering. Wir wissen, dass es sich um eine Flasche handelt, da sie nicht über das visuelle Schlüsselelement der Dose verfügt, was im Vergleich zu dem, was sich hinter einer Flasche befinden könnte, relativ simpel ist.

(das letzte war das Beste, was ich von einer leeren großen Coca-Cola-Flasche finden konnte - interessanterweise sind Kappe UND Ring gelb, was darauf hinweist, dass man sich wahrscheinlich nicht auf die Rötung der Kappe verlassen sollte

In dem seltenen Fall, dass sich ein ähnlicher Silberton hinter der Flasche befindet, auch nachdem der Kunststoff abgezogen wurde oder die Flasche irgendwie mit dem gleichen Farbton Silberflüssigkeit gefüllt ist, können wir auf das zurückgreifen, was wir ungefähr als das einschätzen können Form des Silbers - das wie gesagt kreisförmig ist und der Form der Dose folgt. Aber obwohl mir gewisse Kenntnisse in der Bildverarbeitung fehlen, klingt das langsam. Besser noch, warum nicht einmal die Seiten des Logos ableiten, um sicherzustellen, dass dort nichts von der gleichen silbernen Farbe ist? Ah, aber was ist, wenn hinter einer Dose derselbe Silberton steckt? Dann müssen wir in der Tat mehr auf Formen achten und wieder auf den oberen und unteren Teil der Dose schauen.

Abhängig davon, wie fehlerfrei dies alles sein muss, kann es sehr langsam sein, aber ich denke, mein Grundkonzept ist es, zuerst die einfachsten und engsten Dinge zu überprüfen. Gehen Sie die Farbunterschiede um die bereits übereinstimmende Form herum durch (was ohnehin der trivialste Teil davon zu sein scheint), bevor Sie die Form der anderen Elemente herausarbeiten. Um es aufzulisten, geht es:

  • Finden Sie die Hauptattraktion (roter Logo-Hintergrund und möglicherweise das Logo selbst zur Orientierung, obwohl Sie sich auf das Rote konzentrieren müssen, falls die Dose weggedreht wird)
  • Überprüfen Sie die Form und Ausrichtung noch einmal anhand der sehr ausgeprägten Rötung
  • Überprüfen Sie die Farben um die Form (da es schnell und schmerzlos ist)
  • Überprüfen Sie schließlich bei Bedarf die Form dieser Farben um die Hauptattraktion herum auf die richtige Rundheit.

Wenn Sie dies nicht tun können, bedeutet dies wahrscheinlich, dass der obere und der untere Teil der Dose abgedeckt sind. Die einzige Möglichkeit, mit der ein Mensch zuverlässig zwischen der Dose und der Flasche hätte unterscheiden können, ist der Verschluss und die Reflexion von der Dose, die ein viel schwerer zu verarbeitender Kampf wäre. Um jedoch noch weiter zu gehen, können Sie dem Winkel der Dose/Flasche folgen, um mithilfe der in den anderen Antworten erwähnten halbtransparenten Scan-Techniken zu prüfen, ob weitere flaschenähnliche Merkmale vorliegen.

Zu den interessanten zusätzlichen Albträumen könnte eine Dose gehören, die bequem in einem solchen Abstand hinter der Flasche sitzt, dass das Metall über und unter dem Etikett zu sehen ist, was immer noch scheitern würde, solange Sie über die gesamte Länge des Roten scannen Etikett - das ist eigentlich ein größeres Problem, da Sie keine Dose erkennen, an der Sie welche haben könnten, anstatt zu berücksichtigen, dass Sie tatsächlich eine Flasche erkennen, einschließlich der Dose aus Versehen. Das Glas ist dann halb leer!


Als Haftungsausschluss habe ich keine Erfahrung mit der Bildverarbeitung außerhalb dieser Frage und habe auch nie darüber nachgedacht, aber es ist so interessant, dass ich ziemlich tief darüber nachgedacht habe, und nachdem ich alle anderen Antworten gelesen habe, halte ich dies möglicherweise für richtig der einfachste nd effizienteste Weg, um es zu erledigen. Persönlich bin ich nur froh, dass ich nicht wirklich darüber nachdenken muss, dies zu programmieren!

EDIT

bad drawing of a can in MS Paint Schauen Sie sich auch diese Zeichnung an, die ich in MS Paint gemacht habe ... Sie ist absolut schrecklich und ziemlich unvollständig, aber allein aufgrund der Form und der Farben können Sie erraten, wie sie wahrscheinlich aussehen wird. Im Wesentlichen sind dies die einzigen Dinge, nach denen man suchen muss. Was könnte es sonst sein, wenn man sich diese sehr ausgeprägte Form und Kombination von Farben so genau ansieht? Das, was ich nicht gemalt habe, der weiße Hintergrund, sollte als "irgendetwas Inkonsistentes" betrachtet werden. Wenn es einen transparenten Hintergrund hätte, könnte es über fast jedes andere Bild gehen und man könnte es immer noch sehen.

19
Deji

Ich kenne OpenCV nicht, aber logischerweise sehe ich das Problem logisch. Ich denke, Sie könnten zwischen Flasche und Dose unterscheiden, indem Sie das Bild ändern, nach dem Sie suchen, d. H. Coca Cola. Sie sollten bis zum oberen Teil der Dose einarbeiten, da im Fall von Dose ein Silberfutter an der Oberseite von Coca Cola vorhanden ist und im Falle einer Flasche kein solches Silberfutter vorhanden ist.

Dieser Algorithmus versagt jedoch offensichtlich in Fällen, in denen der obere Teil der Dose verborgen ist. In diesem Fall kann jedoch auch kein Mensch zwischen den beiden unterscheiden (wenn nur die Coca Cola-Portion Flasche/Dose sichtbar ist)

15
techExplorer

Ich mag die Herausforderung und wollte eine Antwort geben, die das Problem löst, denke ich. 

  1. Extrahieren Sie Merkmale (Schlüsselpunkte, Deskriptoren wie SIFT, SURF) des Logos 
  2. Stimmen Sie die Punkte mit einem Modellbild des Logos ab (mithilfe von Matcher wie Brute Force).
  3. Schätzen Sie die Koordinaten des starren Körpers (PnP-Problem - SolvePnP)
  4. Schätzen Sie die Kappenposition anhand des starren Körpers ab 
  5. Machen Sie eine Rückprojektion und berechnen Sie die Bildpixelposition (ROI) des Flaschenverschlusses (ich nehme an, Sie haben die intrinsischen Parameter der Kamera)
  6. Prüfen Sie mit einer Methode, ob die Kappe vorhanden ist oder nicht. Wenn dort, dann ist dies die Flasche 

Das Erkennen der Obergrenze ist ein weiteres Problem. Es kann entweder kompliziert oder einfach sein. Wenn ich Sie wäre, würde ich einfach das Farbhistogramm im ROI überprüfen, um eine einfache Entscheidung zu treffen. 

Bitte geben Sie das Feedback, wenn ich falsch liege. Vielen Dank. 

13
edayangac

Sie benötigen ein Programm, das die Klassifizierungsgenauigkeit aus Erfahrung organisch lernt und verbessert. 

Ich werde tiefes Lernen vorschlagen, mit tiefem Lernen wird dies zu einem trivialen Problem. 

Sie können das Inception v3-Modell auf Tensorflow umschulen:

Wie man die letzte Ebene von Inception für neue Kategorien umschult .

In diesem Fall trainieren Sie ein neuronales Faltungsnetzwerk, um ein Objekt als Coca-Cola-Klassifizierung zu klassifizieren.

10
Nuelsian

Es gibt eine Reihe von Farbdeskriptoren, die zur Erkennung von Objekten verwendet werden. Das folgende Papier vergleicht viele von ihnen. Sie sind besonders leistungsstark, wenn sie mit SIFT oder SURF kombiniert werden. SURF oder SIFT alleine sind in einem Coca-Cola-Dosenbild nicht sehr nützlich, da sie nicht viele interessierende Punkte erkennen. Ich verwende BIC (Border/Interior Pixel Classi fi kation) mit SURF in einem Projekt.

Farbdeskriptoren für das Abrufen von Webbildern: eine vergleichende Studie

10

Ihre Frage gefällt mir, unabhängig davon, ob sie nicht Thema ist oder nicht: P

Ein interessanter beiseite; Ich habe gerade ein Fach abgeschlossen, in dem wir Robotik und Computer Vision behandelt haben. Unser Projekt für das Semester war dem von Ihnen beschriebenen unglaublich ähnlich.

Wir mussten einen Roboter entwickeln, der eine Xbox Kinect verwendete, um Colaflaschen und Dosen in einer beliebigen Ausrichtung bei verschiedenen Licht- und Umgebungsbedingungen zu erkennen. Unsere Lösung bestand in der Verwendung eines Bandpassfilters für den Farbtonkanal in Kombination mit der Hough-Circle-Transformation. Wir konnten die Umgebung ein wenig einschränken (wir konnten auswählen, wo und wie der Roboter und der Kinect-Sensor positioniert werden sollen), ansonsten würden wir die SIFT- oder SURF-Transformationen verwenden.

Über unseren Ansatz können Sie auf meinem Blogbeitrag zum Thema :) nachlesen.

9
aaronsnoswell

Ich bin ein paar Jahre zu spät bei der Beantwortung dieser Frage. Da der Stand der Technik in den letzten 5 Jahren durch CNNs an seine Grenzen gestoßen war, würde ich OpenCV jetzt nicht für diese Aufgabe verwenden! ( Ich weiß, dass Sie die OpenCv-Funktionen speziell in der Frage wollten ). Ich glaube, dass Objekterkennungsalgorithmen wie Faster-RCNNs, YOLO, SSD usw. dieses Problem mit einem beträchtlichen Abstand gegenüber OpenCV-Funktionen erreichen würden. Wenn ich dieses Problem jetzt angehen würde (nach 6 Jahren !!), würde ich definitiv Faster-RCNN verwenden.

8
Abhijit Balaji

Tiefes Lernen

Sammeln Sie mindestens ein paar hundert Bilder mit Coladosen, kommentieren Sie den Bounding-Box als positive Klassen, schließen Sie Cola-Flaschen mit ein und andere Cola-Produkte kennzeichnen sie als negative Klassen sowie als Zufallsobjekte. 

Wenn Sie kein sehr umfangreiches Dataset sammeln, sollten Sie den Trick der Verwendung umfangreicher Lernfunktionen für kleine Datensätze ausführen. Idealerweise eine Kombination von Support Vector Machines (SVM) mit tiefen neuronalen Netzen.

Wenn Sie die Bilder einem zuvor trainierten Deep-Learning-Modell (z. B. GoogleNet) zugeführt haben, verwenden Sie die Entscheidungsebene (letzte Schicht) des neuronalen Netzwerks nicht für Klassifizierungen.

OpenCV und Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV und SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

8
Semih Korkmaz

Als Alternative zu all diesen Nice-Lösungen können Sie Ihren eigenen Klassifikator trainieren und Ihre Anwendung fehleranfällig machen. Sie können beispielsweise Haar Training verwenden, um eine gute Anzahl von positiven und negativen Bildern Ihres Ziels bereitzustellen.

Es kann nützlich sein, nur Dosen zu entnehmen und kann mit der Erkennung von transparenten Objekten kombiniert werden.

6
madduci

Es gibt ein Computer-Vision-Paket namens HALCON von MVTec , dessen Demos gute Algorithmen liefern könnten. Es gibt viele Beispiele, die Ihrem Problem ähnlich sind, die Sie im Demo-Modus ausführen und dann die Operatoren im Code betrachten und sehen, wie sie von vorhandenen OpenCV-Operatoren implementiert werden. 

Ich habe dieses Paket verwendet, um schnell komplexe Algorithmen für Probleme wie diese zu prototypisieren und dann zu finden, wie sie mit vorhandenen OpenCV-Funktionen implementiert werden können. Insbesondere für Ihren Fall könnten Sie versuchen, in OpenCV die im Operator find_scaled_shape_model eingebettete Funktionalität zu implementieren. Einige Betreiber verweisen auf das wissenschaftliche Dokument zur Implementierung von Algorithmen, das helfen kann, herauszufinden, wie in OpenCV etwas Ähnliches zu tun ist. Hoffe das hilft...

2
Darien Pardinas

Die ersten Dinge, nach denen ich Ausschau halten würde, sind Farbe - wie ROT bei der Erkennung roter Augen in einem Bild - es gibt einen bestimmten Farbbereich, der zu erkennen ist, einige Eigenschaften, die die Umgebung und den Abstand zum anderen Auge berücksichtigen ist ja im Bild sichtbar.

1: Erstes Merkmal ist Farbe und Rot ist sehr dominant. Nach dem Erkennen des Coca-Cola-Rotes gibt es mehrere interessante Punkte 1A: Wie groß ist dieser rote Bereich (ist er ausreichend groß, um eine wahre Dose bestimmen zu können oder nicht - 10 Pixel reichen wahrscheinlich nicht aus), 1B: Enthält es die Farbe des Etiketts - "Coca-Cola" oder Welle. 1B1: Gibt es genug, um mit hoher Wahrscheinlichkeit davon auszugehen, dass es sich um ein Etikett handelt.

Punkt 1 ist eine Art Abkürzung - Vorverarbeitung, wenn dieser Snot im Bild vorhanden ist - weitergehen.

Wenn dies der Fall ist, kann ich dann dieses Bildsegment verwenden und ein wenig mehr aus dem fraglichen Bereich herauszoomen - im Grunde die umgebende Region/Kanten betrachten ...

2: Wenn die obige Bildbereichs-ID in 1 angegeben ist, überprüfen Sie die umgebenden Punkte [Kanten] des fraglichen Elements. A: Gibt es ein Dosenoberteil oder -unterteil - Silber? B: Eine Flasche mag transparent erscheinen, aber auch ein Glastisch - also gibt es einen Glastisch/-boden oder einen transparenten Bereich -, wenn dies möglich ist. Eine Flasche MÖCHTE eine rote Kappe haben, vielleicht nicht, aber sie sollte entweder die Form der Flaschenoberseiten/Gewindeschrauben oder eine Kappe haben. C: Auch wenn dies A und B fehlschlägt, kann es immer noch ein Dosenpartial sein .. Dies ist komplexer, wenn es teilweise ist, da eine partielle Flasche/ein partielles möglicherweise gleich aussieht, also einige weitere Verarbeitungsschritte Messung der roten Region von Rand zu Rand. kleine Flasche könnte in der Größe ähnlich sein.

3: Nach der obigen Analyse würde ich dann die Beschriftung und das Wellenlogo betrachten - weil ich meine Suche nach einigen Buchstaben in den Wörtern ausrichten kann. Da Sie möglicherweise nicht den gesamten Text haben, weil nicht alle vorhanden sind kann, die Welle würde sich an bestimmten Punkten an dem Text ausrichten (Abstand), sodass ich nach dieser Wahrscheinlichkeit suchen und wissen könnte, welche Buchstaben an diesem Punkt der Welle im Abstand x vorhanden sein sollten.

0
Ken

Dies ist ein altes Projekt, an dem ich gearbeitet habe. MAP-Bilder sind mit Javascript sehr einfach zu bedienen. Ich biete Ihnen das Objekt an, Sie lesen es und wissen, wie man es benutzt. Für die Verwendung von MAP-Images benötigen wir kein JQuery und keine anderen Systeme.

    //Copyright Cherif yahiaoui, by ELEBAN.FR

//variables de flottement.
var myInstOne = null;
var globalize = null;

var eleban_preload_images = function (name, imgs, url){
try{
    var oThis = this;
    this.images = new Array();
    this.imageshover = new Array();
    this.imagesNames = new Array(imgs.split(";"));


        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i] = new Image();
            this.imageshover[i] = new Image();
        }

    this.url = url;

    this.GetAbsoluteurl = function () {

    var img = new Image(); img.src = url;
    url = img.src; img = null; 
        this.url = url; 

    };

    this.Preload = function () {

        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i].src = this.url+("btn-"+this.imagesNames[0][i]+".png");
            this.imageshover[i].src = this.url+("btn-"+this.imagesNames[0][i]+"-hover.png");
        }

    };
    this.GetAbsoluteurl();
    this.Preload();
}
finally {return;}
}

var g_preloaderhover = new eleban_preload_images("loaderhover","menu;malette;reservation;cabine;facebook;map;amis","./images/");


//variable arret flottement
var g_stopflo = false;

var myObjfloater = function(name, idname, itop, differ ) {
var oThis = this; // création d'une référence vers l'objet courant
this.name = name;
this.id =idname;
this.xstep= 0.3;
this.itime = 30;
this.obj = null;
this.y = itop;
this.yadd = 0;
this.up = true;
this.pause = false;
this.differ = differ;
this.coordsimage = null;
this.objimg = null;
this.initimages = false;
this.compteur = 0;
this.over = false;
this.timeoutstop = null;
try{
this.initimage = function(){
var img = this.obj.getElementsByTagName('img')[0];
this.coordsimage = new Array(img.width, img.height);
this.objimg = img;
this.initimages = true;
};


this.myMethod = function() {
if(!g_stopflo){
    if(this.differ != 0){ 
this.differ=this.differ-0.1; 
}else{

if(this.obj){
if(this.over == false){
    this.yadd=this.yadd+0.1; this.itime = this.itime + 10;
this.obj.style.visibility = "hidden";
this.y = ((this.up)? this.y - this.yadd : this.y + this.yadd);
this.obj.style.marginTop = this.y +"%" ;
this.obj.style.visibility = "visible";

if (this.yadd > this.xstep){ 
    this.up = (this.up)? false : true;
    this.yadd = -0.1; this.itime=180;
}
}
}else{
    if (document){
        if(document.getElementById) {
         this.obj = document.getElementById(this.id); 
        //this.y = this.obj.offsetTop;
        }else{
        if(document.getElementByTagName) { this.obj = document.getElementByTagName(this.id); this.y = this.obj.offsetTop;}
        }

    }
}
}
this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}    
};

this.callDelayed = function() {
    // utilisation de la référence vers l'objet
if(!g_stopflo){
    this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}
};
}
finally {return;}
};

// special creation des zones AREA
function eleban_createallarea(){
try{
var measur = new Array("w", "h");
measur["w"] = new Array(330,570,185,300,115,390,225);
measur["h"] = new Array(460,570,295,450,100,190,115);
var ititle = new Array("Voir les menus  et nos suggestions","Repas &agrave; emporter","R&eacute;servation d&rsquo;une table","Nous contacter","Nous rejoindre sur FaceBook","Calculer votre trajet","liste des amis");
var ihref = new Array("menus.html","emporter.html","reservation.html","contact.html","likebox.html","google.html","amis.html");
var b_map = new Array(0,1,2,3,4,5,6);
b_map[0] = "71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38";
b_map[1] = "66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92";
b_map[2] = "19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90";
b_map[3] = "60,0,216,1,226,20,225,403,168,421,42,410,45,10";
b_map[4] = "31,7,72,10,82,18,88,45,88,71,76,81,29,80,17,68,16,18";
b_map[5] = "91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94";
b_map[6] = "6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65";

if (document.getElementById){
for (var i=0; i<b_map.length;i++){
var obj = document.getElementById("pc_menu"+i);
    if(obj){
    var ct = '<img class=\"pc_menu\" src=\"'+g_preloaderhover.images[i].src+'\" alt=\"\" width=\"'+measur["w"][i]+'\" height=\"'+measur["h"][i]+'\" usemap=\"#MAP_INDEX'+i+'\" \/>';
    ct+='<map name=\"MAP_INDEX'+i+'\">';
    ct+='<area shape=\"poly\" coords=\"'+b_map[i]+'\" title=\"'+ititle[i]+'\" href=\"'+ihref[i]+'\" \/>';
    ct+='<\/map>';
    obj.innerHTML = ct;
    }
}
}
}
finally {return;}
}

//preload, creation et gestion de tous les evenements


var image_resizer = function(g_layer){


    b_org_Elm = new Array("w",  "h");
    b_org_Elm["w"] = new Array(330,570,185,300,115,390,225);
    b_org_Elm["h"] = new Array(460,570,295,450,100,190,115);

    b_map = new Array(0,1,2,3,4,5,6);
    b_map[0] = new Array(71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38);
    b_map[1] = new Array(66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92);
    b_map[2] = new Array(19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90);
    b_map[3] = new Array(60,0,216,1,226,20,225,403,168,421,42,410,45,10);
    b_map[4] = new Array(31,6,70,10,78,18,84,23,88,44,88,70,78,80,75,81,33,82,23,76,18,69,16,22,21,13);
    b_map[5] = new Array(91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94);
    b_map[6] = new Array(6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65);


    b_layer = g_layer;

//gere mouseover
    this.mouseover = function(e){
        if (!e) var e = window.event;
        var tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                var divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.imageshover[ii].src;
                                }
                        }
                    }
                }
            }
    };

//gere mouseout
    this.mouseout = function(e){
        if (!e) var e = window.event;
        tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.images[ii].src;
                                }
                        }
                    }
                }
            }
    };

//ajout evenements entree sortie à la page web lors du chargement de la page
    this.init = function () {

        for(var i=0; i<b_org_Elm["w"].length;i++){
            w = document.getElementById("pc_menu"+i).offsetWidth;
            h = document.getElementById("pc_menu"+i).offsetHeight;

            xa = w/parseFloat(b_org_Elm["w"][i]);
            ya = h/parseFloat(b_org_Elm["h"][i]);

            area = document.getElementById("pc_menu"+i).getElementsByTagName('area')[0];

            b_map2 = area.coords.split(",");
            yswitch = true;
                for(m=0; m<b_map2.length;m++){
                b_map2[m] = Math.round(parseFloat(b_map[i][m]) * ((yswitch)? xa: ya));
                yswitch = (yswitch)? false :  true;
                }
            area.coords = b_map2.join(',');
        }
    }; 


    this.resize = function () {
    clearTimeout(myInstOne.timeoutstop);
    g_stopflo=true;

    globalize.init();
    g_stopflo=false;
    myInstOne.obj = null;
    myInstOne.callDelayed();
    };


    nar = document.getElementsByTagName('area').length;

        for(var i=0; i<nar;i++){
            var elem = document.getElementsByTagName('area')[i];
            if (elem.addEventListener){
                    elem.addEventListener("onmouseover",this.mouseover,true);
                elem.addEventListener("onmouseout",this.mouseout,true);
            }else if (elem.attachEvent) {
                    elem.attachEvent("onmouseover", this.mouseover);
                    elem.attachEvent("onmouseout", this.mouseout);
            }else{
                    elem["onmouseover"] = this.mouseover;
                    elem["onmouseout"] = this.mouseout;
            }
        }

            window.onresize = this.resize;
        window.onmouseover = this.mouseover;
        window.onmouseout = this.mouseout;
}


//permet de temporiser et éviter les erreurs de chargement des objets
function temporise_Init(Lastdiv){
if(document.getElementById){
    if(document.getElementById(Lastdiv)){

    eleban_createallarea();

    myInstOne = new myObjfloater('b_menumap11', 'pc_menu1', 1, 0);

    globalize = new image_resizer(document.getElementById('pc_redim'));
    globalize.init();
        globalize.resize();



    }else{
    setTimeout(temporise_Init(Lastdiv), 30);
    }
}
}


window.onload = function () {
temporise_Init("pc_bandeau");
}
0
Cherif

Wenn Sie daran interessiert sind, dass es sich um Echtzeit handelt, müssen Sie einen Vorverarbeitungsfilter hinzufügen, um festzustellen, was mit dem Hochleistungs-Scanner gescannt wird. Ein guter, sehr schneller Vorverarbeitungsfilter, der es Ihnen ermöglicht, Dinge zu scannen, die wahrscheinlich eher eine Coca-Cola-Dose sind als zuvor, bevor Sie sich mit mehr faulen Dingen beschäftigen von Farbe, die eine gewisse Toleranz von der sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) Ihrer Coca-Cola-Dose entfernt sind. Beginnen Sie mit einer sehr strengen Farbtoleranz und arbeiten Sie sich auf mildere Farbtoleranzen hin. Wenn Ihr Roboter nicht mehr genügend Zeit hat, um den aktuellen Frame zu verarbeiten, verwendet er die aktuell gefundenen Flaschen für Ihre Zwecke. Bitte beachten Sie, dass Sie die RGB-Farben in sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) anpassen müssen, um sie richtig einzustellen.

Auch das ist wirklich sehr dumm, aber haben Sie beim Compilieren des C-Codes unbedingt -oFast Compiler-Optimierungen aktiviert?

0
user7892745

Vielleicht zu viele Jahre zu spät, aber trotzdem eine Theorie, um es auszuprobieren.

Das Verhältnis des Begrenzungsrechtecks ​​der roten Logo-Region zur Gesamtgröße der Flasche/Dose ist unterschiedlich. Im Falle von Can sollte es 1: 1 sein, während es sich bei Flaschen (mit oder ohne Verschluss) unterscheiden wird. Dies sollte es leicht machen, zwischen den beiden zu unterscheiden.

Update: Die horizontale Krümmung der Logo-Region unterscheidet sich je nach Größenunterschied zwischen Dose und Flasche. Dies kann besonders nützlich sein, wenn Ihr Roboter Dose/Flasche aufnehmen muss und Sie den Griff entsprechend festlegen.

0
K B