Etikettiermaschine für Lippenetiketten - Erweitern Sie die Zylinderverzerrung programmgesteuert

In unserer Anwendung gibt es eine Funktion wie den Sohn der Freundin vivino meiner Mutter - die Definition von Wein auf einem Foto. Unter der Haube - die Nutzung von Drittanbieter-Diensten, Tineye -, um das am besten geeignete Etikett, Google Vision, zu bestimmen, um den Text darauf zu lesen. Letzteres ist notwendig, um das richtige Produkt zu klären, weil Bei der Bildsuche wird die Bedeutung einiger Regionen in der Regel nicht berücksichtigt - dies sind Textinformationen - Jahr und Art des Weins.

Die Genauigkeit beider Dienste wird jedoch aufgrund der Tatsache, dass das Etikett durch eine zylindrische Oberfläche verzerrt ist, merklich verringert.

Dies macht sich insbesondere bei Google Vision bemerkbar: Jeder Text außerhalb des zentralen Teils des Etiketts ist praktisch unlesbar, obwohl eine Person ihn leicht erkennt. In diesem Artikel werde ich beschreiben, wie Verzerrungen umgekehrt und die Genauigkeit der Produkterkennung erhöht werden können.



Überlegen Sie zunächst, was Verzerrung ist.



Das rechteckige Etikett hat beim Aufkleben auf den Zylinder die charakteristische Form eines Zylinders (b in der obigen Abbildung). Die ABC-Kurve ist in diesem Fall in ziemlich guter Näherung eine Ellipse, weil Wir sehen einen Kreis (Zylinderabschnitt) in einem Winkel. Die vielen horizontalen Linien des Etiketts verwandeln sich ebenfalls in viele Ellipsen auf dem Foto.

Das Interessanteste ist, dass Sie zum Erweitern des Etiketts nur 6 Marker (ABCDEF) angeben:



Erstellen Sie mit ihnen ein vollständiges Oberflächengitter:



Mit einem Oberflächengitter können wir jede Kachel separat erweitern und die ursprüngliche Oberfläche erhalten:



Der Bibliothekscode ist auf dem Github verfügbar . Der Vorteil dieser Methode besteht darin, dass die Eingabeparameter für die inverse Transformation visuell definierte Merkmale des Etiketts sind (Winkel und obere, untere Punkte), wodurch Sie den Prozess vollständig automatisieren können.

Im nächsten Teil geht es um das Definieren von Markern. Der Arbeitscode ist in der Verzweigung auf dem Github nur teilweise verfügbar Eine wirklich funktionierende Lösung wird von Hacks und Schamanismus abgedeckt, so dass das Gewissen einfach nicht zulässt, dass eine solche Dose auf einen Github hochgeladen wird.

Stufe eins - Konvertieren Sie das Bild in Schwarzweiß.

Dann müssen Sie die Konturen der Flasche mit dem Etikett erhalten. Dazu verwenden wir die Sobel-Transformation . Kurz gesagt, dieser Filter verwischt zuerst das Bild und subtrahiert es dann vom Original. Infolgedessen bleiben auch Bereiche dunkel und Kanten (Änderungen) hell.



Als nächstes müssen Sie die beiden auffälligsten vertikalen Linien identifizieren, die, wenn Sie Glück haben, die Ränder der Flasche sind. In diesem Fall ist dies der Fall, aber wenn Sie eine Flasche neben anderen Flaschen fotografieren, ist dies nicht mehr der Fall.

Verwenden Sie die Hough-Transformation, um diese Linien zu bestimmen. Das Wesentliche der Technik ist, dass wir viele Linien über den gesamten Bildschirm ziehen und den Durchschnittswert der Pixel berücksichtigen (z. B. Linien, die vom oberen Bildrand nach unten verlaufen). Wir übertragen diese Werte auf die neue Koordinatenebene und erhalten so etwas wie eine Wärmekarte. Auf dieser Heatmap suchen wir nach zwei Extrema - sie sind die Seitenlinien.

Das folgende Diagramm zeigt, wie die linke Linie zu einem Punkt auf der neuen Koordinatenebene führt:



Mit Ellipsen ist es etwas komplizierter, aber da wir wissen, dass die Hough-Transformation auf alle mathematisch definierten Kurven angewendet werden kann, werden wir diese Methode erneut verwenden, aber dieses Mal werden wir nach vielen elliptischen Kurven suchen.

Aber zuerst müssen Sie das Problem in eine zweidimensionale Form bringen. Da wir wissen, dass die Flasche zentral symmetrisch ist, nehmen wir die Mittelachse für die Y-Koordinate und eine Seite für X. Für die Werte auf der neuen Koordinatenebene nehmen wir viele Ellipsen, die zwischen der Mittelachse und der Seite aufgebaut sind. Dies ist möglich, weil ein beliebiger Punkt auf der Seite und der Mittelachse nur eine Verbindungsmethode hat. Vielleicht ist dies auf den ersten Blick nicht sehr offensichtlich, aber es ist viel einfacher zu verstehen, wenn wir uns der Parameterformel der Ellipse zuwenden:

x = a * cos (t)
y = b * sin (t)



Genauso finden wir die beiden gesuchten Extreme, die zwei Markierungsellipsen definieren (Kurven AB, FE). Nachdem wir alle erforderlichen Beschriftungsparameter (Seitenkurven sowie obere und untere Ellipsen) haben, können wir den Algorithmus aus dem ersten Teil des Artikels anwenden und die inverse Transformation durchführen.

Was kann verbessert werden. Erstens berücksichtigt der Algorithmus nicht die Verzerrung der Perspektive der Ellipse selbst, so dass die Seitenfragmente des Etiketts etwas stärker gedehnt werden, als sie sollten. Um eine Korrektur vorzunehmen, müssen Sie den tatsächlichen Betrachtungswinkel der Kamera kennen oder zumindest den für das Telefon typischen verwenden (Sie können empirisch auswählen).

Zweitens arbeitet die Hough-Transformation unter schwierigen Bedingungen ziemlich instabil - beispielsweise wenn benachbarte Flaschen in den Rahmen fallen und die Ränder der interessierenden Flasche möglicherweise nicht richtig erkannt werden.

Drittens, wenn die Beschriftung keine rechteckige Form hat (z. B. elliptisch), werden die Markierungen falsch erkannt und die Transformation verzerrt das Bild nur stärker.

In der Praxis ist es viel interessanter, ein neuronales Netzwerk zur Identifizierung von Markern zu verwenden, weil Es kann anhand komplexer Beispiele trainiert werden, so dass der Algorithmus zumindest keine Transformation durchführt, wenn Marker nicht bestimmt werden können. Aber bis jetzt habe ich nicht versucht, Neuron für diese Aufgabe zu verwenden, also wird dies vielleicht das Thema eines separaten Artikels sein :)

Source: https://habr.com/ru/post/de424151/


All Articles