AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OCR, Barcodes - Wie fängt man an?

Ein Thema von Prototypjack · begonnen am 11. Jul 2009 · letzter Beitrag vom 16. Jul 2009
Antwort Antwort
Seite 1 von 3  1 23      
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#1

OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 14:09
Moin,

Kurz zu meinem Vorhaben, damit mit mir nachher keiner nachsagt ich würde hier Captchas lesen wollen oder etwas ähnliches. Was ich vorhabe ist folgendes: Ich will mittels Photos Barcodes auf bestimmten Dingen (vorzugsweise CDs, DVDs, Bücher, etc.) erkennen und auslesen. Was die Interpretation der Codes anbelangt, werde ich vorerst nur EAN implementieren, aber darum geht es mir jetzt noch nicht.

Mein Problem ist folgendes: Ich habe keine Ahnung wie ich da anfangen soll. Gibt es irgendwelche Denkansätze / Techniken, die das Auslesen erleichtern bzw. ermöglichen?

Ich bin momentan so weit, dass ich das Bild (in Farbe) umrechne auf Schwarz & Weiß (keine Graustufen, also lediglich 255, 255, 255 bzw. 0, 0, 0!). Dadurch kann ich den Barcode gut von Störungen (durch das Scannen der Kamera bzw. des Scanners) befreien. Jetzt müsste ich irgendwie das Rechteck mit dem Barcode identifizieren können und dann muss ich den Code irgendwie lesen. Bei beidem kommt noch erschwerend hinzu, dass der Code sehr wohl gedreht sein kann.

Könnt ihr mir ein paar Ansätze geben?

Danke & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 14:47
Stell dir vor, du nimmst einen "Lesestrahl" (Bruder des Laserstrahls) und führst ihn quer über dein Bild.
Jedes Pixel wird ausgelesen, und die Information Hell oder Dunkel einem Helligkeitsarray abgelegt.
Dann wird diese Array analysiert und versucht, daraus die einzelnen Symbole eines Barcodes zu gewinnen.
Das war der grobe Ablauf.

Jetzt zum Auslesen der Pixel:
du brauchst dazu den Bresenham-Algorithmus.
Pro Bild würde ich mehrere Schnitte in Winkeln 0, 15, 30, 45, 60, 75, 90 machen.
Die Schnittlinien sollten nicht nur durch den Bildmittelpunkt gehen, sondern jeweils nochmal "links" und "rechts" deneben.
Am leichtesten findet man die geeingneten Schnittlinien mit Papier, Lineal und Bleistift.

Jeder Schnitt erzeugt ein Array mit Schwarz/weiss Werten.
Das Array wird nun verdichtet.
Man zählt die Anzahl der gleichen Bit und schreibt die Werte in ein neues Timing-Array.
Beispiel:
Code:
Helligkeitsarray:
111111000011111111100000000001101

6|4|9|10|2|1|1
Das untere Array is so zu verstehen 6 Mal Hell, 4 Mal dunkel,....
Es beginnt und endet immer mit Farbe Weiss.

Das Timing-Array wird sowohl vorwärts als auch rückwärts ausgewertet (Funktion ReverseArray() schreiben)
und versucht daraus einen Barcode zu extrahieren.

Du siehst, du hast einen ganz weiten Weg vor dir.
Das frühe Wandeln in ein Schwarz/Weiss Bild ist übrigens eher ungünstig -
besser man trifft die Entscheidung ob ein Punkt Schwarz oder Weiss ist entlang der Schnittlinie.
Dazu sollte man im Helligkeitsarray nicht Schwarz und Weiss, sondern den Graustufenwert ablegen.
fork me on Github
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#3

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 15:05
Moin,

Ok, es kann natürlich sein, dass ich dich falsch verstanden habe, aber ich denke deine Methode arbeitet eher dann günstig, wenn nur der Barcode auf dem Bild zu sehen ist, aber bei mir ist da ja noch wesentlich mehr (Teile des Covers, etc.) zu sehen. Dies erschwert aber dann im Timing-Array das finden des Barcodes.

Ich werde diese Methode auf jeden Fall implementieren und damit herumexperimentieren, aber wäre es nicht günstiger, wenn ich erst einmal das Rechteck, in welchem sich der Barcode befindet, finde?

Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 16:37
Hallo,
ich hab da eine kleine Idee.
Vorraussetzung dafür ist, dass der Barcode das größte zusammenhängende Objekt, das zu sehen ist, ist.
Dann nehme ich das Bild und lasse es(in Schwarz-Weiß) immer unschärfer werden. Bis alles, was nahe beieinander gelegen ist(Barcodestriche) zusammen zu einem schwarzen Rechteck wird. Jetzt suchst du das größte schwarze Rechteck(darf ja auch gedreht sein) heraus und hast die Position des Barcodes. Das kopierst du dann aus dem Original Bild in ein neues und nimmst dabei die Drehung vor. Barcodes sind im Normalfall ja auch um 180° gedreht lesbar.

Einfacher wäre das ganze natürlich, wenn du statt zu fotographieren einen Barcodescanner nimmst. Sind bei Conrad auch recht billig.

Viele Grüße,
Benjamin
Benjamin
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 16:42
Die Hough Transformation könnte hier auch recht hilfreich werden.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#6

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 17:02
Zitat von BenjaminH:
Hallo,
ich hab da eine kleine Idee.
Vorraussetzung dafür ist, dass der Barcode das größte zusammenhängende Objekt, das zu sehen ist, ist.
Dann nehme ich das Bild und lasse es(in Schwarz-Weiß) immer unschärfer werden. Bis alles, was nahe beieinander gelegen ist(Barcodestriche) zusammen zu einem schwarzen Rechteck wird. Jetzt suchst du das größte schwarze Rechteck(darf ja auch gedreht sein) heraus und hast die Position des Barcodes. Das kopierst du dann aus dem Original Bild in ein neues und nimmst dabei die Drehung vor. Barcodes sind im Normalfall ja auch um 180° gedreht lesbar.

Einfacher wäre das ganze natürlich, wenn du statt zu fotographieren einen Barcodescanner nimmst. Sind bei Conrad auch recht billig.

Viele Grüße,
Benjamin
Die Voraussetzungen sind aber leider fast nie gegeben. Alleine bei meinen zwei Beispielen, die ich hier habe (PC-Spiele), sehen die Kästen mit den Systemvoraussetzungen genauso aus, wie das vom Barcode, ganz zu schweigen von störenden Hintergrundbildern etc. In der Tat ist bei meinem Beispiel der Hintergrund bis auf die Kästen mit Voraussetzungen und Barcode und wenige andere Stelle komplett schwarz, was noch erschwerend hinzukommen dürfte.
Außerdem gibt es bei der Methode an sich bereits ein Problem: Das Verwischen tut nämlich genau das, was es tun soll: Verwischen. Ich bin mir fast zu 100% sicher, dass gerade durch dieses Verwischen der Grenzen eine genaue Feststellung der Position unmöglich wird, wodurch das Problem nur unzufriedenstellend gelöst werden kann.
Ach ja, schlussendlich stellt sich immer noch ein Problem: Angenommen das Verwischen funktioniert, wie stellst du dann die Position des größten schwarzen Rechtecks fest?

Bezüglich der Drehung gibt es auch noch etwas zu sagen: Natürlich sind Barcodes (bis auf die Start- und Stoppcodes, die länger sind, wenn ich nicht falsch liege) beidseitig lesbar, aber das ist ja auch nicht das Problem. Ich fürchte eher, dass mir gerade 10° Drehungen (und Ähnliche) ein Ei legen (und solche Winkel dürften bei Photos relativ häufig vorkommen).

Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 17:05
Erscheinen die Barcodes auf allen Fotos gleich groß?
Wegen der Drehung:
Wenn du die Position einmal hast, dann findest du ja leicht heraus, welches die längere Seite ist und um wieviel sie von der horizontalen Abweicht. Dann sollte eine Drehung ja leicht möglich sein.(Soweit ich mich erinnere gibt es sowas auch in der CL).
Benjamin
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#8

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 17:12
Zitat von BenjaminH:
Erscheinen die Barcodes auf allen Fotos gleich groß?
Wegen der Drehung:
Wenn du die Position einmal hast, dann findest du ja leicht heraus, welches die längere Seite ist und um wieviel sie von der horizontalen Abweicht. Dann sollte eine Drehung ja leicht möglich sein.(Soweit ich mich erinnere gibt es sowas auch in der CL).
Wegen der Größe: Leider nein. Nicht einmal im Verhältnis, da es scheinbar auch dünnere (also kürzere) Version des Barcodes-Kästchens gibt. Konstant dieselbe Größe ist sowieso nicht möglich, da ich im Endeffekt ein Buch, dass vor eine Webcam gehalten wird, erkennen will und dieses wird mal näher und mal weniger nah sein.

Zu letzterem: Stimmt, so dürfte das gehen, danke für den Ansatz . Aber ich knabbere immer noch an dem Eingrenz bzw. Findungs-Problem.

Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: OCR, Barcodes - Wie fängt man an?

  Alt 11. Jul 2009, 17:52
Evt. hilft dir das hier weiter
Diplomarbeit von Tobias Hermann (OCR)

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

Re: OCR, Barcodes - Wie fängt man an?

  Alt 12. Jul 2009, 17:47
Zitat von Prototypjack:
aber wäre es nicht günstiger, wenn ich erst einmal das Rechteck, in welchem sich der Barcode befindet, finde?
Nein, ein Barcode hat gegenüber dem störenden Rest so eine eindeutige Signatur, dass sich dieser Aufwand meiner Meinung nach nicht lohnt.
Es gibt ja auch Laserscanner die ein Gitter aus schrägen Linien projezieren und nur mit dem empfangenen Helligkeitssignal arbeiten. (z.B. Scannerkassen im Supermarkt, Scanner im Paketverteilzentrum)
Die Erkennungsraten sind gut bis sehr gut, weil ein Barcode mehrmals gelesen wird und Fehler so minimiert werden.
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz