Java Barcodes in Bildern erkennen - kurze Frage

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

ich habe mir einen Algorithmus gesucht und zusammengebastelt, mit dem man Barcodes in Bildern erkennen kann. Dann hab ich mir das JMF genommen und mir einen Webcam-Barcode-erkenner gebaut. Im Moment wird der Barcode erkannt, wenn er vor der Kamera zu sehen ist. Aber wenn keiner da ist wird manchmal auch ein Barcode erkannt.

Wie kann ich sicherstellen, dass auch ein Barcode vorgehalten wird? Also irgenwie muss ich prüfen, ob sich vor der Kamera ein Barcode befindet ... aber wie? Habt Ihr Ideen?

Vielen Dank für's lesen,
CPU
 
Dazu wären Infos zur bisherigen Herangehensweise/Algorithmus hilfreich. Wie soll man sonst helfen? :confused_alt:
 
meine idee für nen workaround wäre barcodes nur anzuerkennen wenn sie nicht nur einmal sondern mehrmals im gleichen bereich erkannt werden....

also wenn zufällig ein muster wo ist das als barcode erkannt werden könnte durch irgendein rauschen, dann wird das nicht lange genug auftreten
 
Hallo,

das Algorithmus funktioniert so: gegeben ist ein Bild, in dem ein Barcode erkannt wird. Nun geht er hin und entfern aus dem Bild in gleichmäßigen Abständen eine 1px hohe linie und wandelt die in ein Binärbild um (also wahr oder falsch). Nun wird versucht aus jeder dieser 30 Strichcodes einen gültigen auszulesen. Sollten Lücken auftreten, wird versucht diese mit anderen Bereichen aufzufüllen und am Ende kommt dann ein kompletter Barcode raus.

Mein Problem: Wenn ich dem Algorithmus ein Bild von der Kamera gebe wird manchmal ein Strichcode erkannt, wo garkeiner ist. Wie kann ich das unterbinden? Es geht also darum ein Maß/Wert herauszufinden, ab dessen Überschreitung man den Algorithmus auf das Bild los lässt. Dann muss man sich ziemlich sicher sein, dass da ein Barcode drin ist ...

Meine Ansatzpunkte wären:
* Irgendwie den Schwarzanteil prüfen und wenn der hoch ist, dann ist da ein Barcode ...
* Irgendwas mit Sobel ...

CPU
 
Ich würde vielleicht die Übergänge suchen..
Also eine Funktion was in dem Bild, auf der X Achse einen Pixel Übergang von schwarz auf weiß erkennt.
Wenn das vermehrt eintritt, dann handelt es sich um einen richtigen Barcode.

Nur nach Schwarz oder Weiß zu suchen, ist garantiert zu fehleranfällig.
 
1.
das Algorithmus funktioniert so: gegeben ist ein Bild, in dem ein Barcode erkannt wird. Nun geht er hin und entfern aus dem Bild in gleichmäßigen Abständen eine 1px hohe linie und wandelt die in ein Binärbild um (also wahr oder falsch). Nun wird versucht aus jeder dieser 30 Strichcodes einen gültigen auszulesen.

Also ganz verstanden hab ich das noch ned. Untersuchst du dein Bild zeilen-/spaltenweise, und versuchst du dann in einer solchen Scanline (Länge 30 pixel?) einen Barcode zu erkennen? Dieser Ansatz ist imho nicht rotations-invariant, wird also nur in den seltensten Fällen klappen. Es sei denn du findest einen Vorverarbeitungsschritt der das Bild immer korrekt transformiert. Dann die Umwandlung in ein Binärbild. Was machst du mit den Bildintensitäten die NICHT zum Strichcode gehören? Btw, was du hier machst ist eine Schwellwertsegmentierung (http://de.wikipedia.org/wiki/Schwellwertverfahren), und die ist nicht ganz trivial.

2.
Sollten Lücken auftreten, wird versucht diese mit anderen Bereichen aufzufüllen...

Welche Lücken? Wie können sie auftreten?

3.
Meine Ansatzpunkte wären:
* Irgendwie den Schwarzanteil prüfen und wenn der hoch ist, dann ist da ein Barcode ...
* Irgendwas mit Sobel ...
Schwarzanteil prüfen oder Sobel: Lies dir den Wiki-Artikel zur Schwellwertsegmentierung durch, und schau dir v.a. auch die Bilder an.
Der Sobel-Operator ist von der Theorie gar nicht so schlecht, ich bin mir aber nicht sicher ob du die Theorie dahinter kennst (Äquivalenz von Kante, Gradient und hohen Werten im Frequenzspektrum des Bildes), und dir der Problematik von Hochpass-Filtern bewusst bist. Es wäre deswegen, auch mal interessant, wenn du mal Bilder von deinem Barcode zeigst, dann kann ich dir vielleicht mehr sagen, sonst wird es hier viel zu allgemein... ;)
 
Also zunächst: auf dem Gebiet der Grafik bin ich kein Guru. Aber manchmal muss man sich halt durch solche Sachen durchkäpfen :) mit viel Sucherei im Internet und Google habe ich mir auch vielen "Codebrüchen" den Code zusammengebastelt ... *sehr viel Arbeit*

Gluehwurm schrieb:
Also ganz verstanden hab ich das noch ned. Untersuchst du dein Bild zeilen-/spaltenweise, und versuchst du dann in einer solchen Scanline (Länge 30 pixel?) einen Barcode zu erkennen?
Also: Bild mit Strichcode drauf. Dann werden 30 Linien gezogen von links nach rechts, sodass die Linien senkrecht zu dem Barcode liegen. Jede Linie ist 1px dick. Dann werden die Farben von jeder Linie in ein Binärarray (also boolean-Array) umgewandelt. Das geschieht so: farbige Linie mit 1px Breite, die über den gesamten Barcode geht wird nun in ein sw-Bild umgewandelt und dann mit dem Schwellenwertverfahren in das Binärarray umgewandelt. Dann wird das Binärarray halt ausgewertet :)

Gluehwurm schrieb:
Dieser Ansatz ist imho nicht rotations-invariant, wird also nur in den seltensten Fällen klappen.
Ja, genau! Wenn der Strichcode gedreht ist, kann man das vergessen! Aber eine forderung von mir ist, dass der Strichcode gerade gehalten wird vom Anweder. Außerdem war ich überascht, dass der Algorithmus noch für Abweitungen von 10° funktioniert (in beide Richtungen) ... von daher benötige ich das garnicht ... :p und wenn's der User nicht gerade hält ist das seine Schuld :)

Gluehwurm schrieb:
Welche Lücken? Wie können sie auftreten?
Es wird ja jetzt hingegangen und versucht aus jedem der 30 Binärarrays einen Strichcode zu lesen. Sollte nun an einigen Stellen eine Ziffer nicht lesbar sein und an anderen Stellen andere nicht lesbar sein, geht der Algorithmus hin und vergleicht per Mehrheitsentscheid jede einzelnen Stelle. So kann es z.B. sein, dass wenn die 3. Stelle nur in einem von den 30 Balken zu lesen war und sonst der Strichcode komplett gelesen werden konnte trotzdem der komplette Code herauskommt. Somit erhöht sich die Trefferwahrscheinlichkeit.

Gluehwurm schrieb:
Es wäre deswegen, auch mal interessant, wenn du mal Bilder von deinem Barcode zeigst, dann kann ich dir vielleicht mehr sagen, sonst wird es hier viel zu allgemein... ;)
Das sind ganz normale Barcodes, wie auf Büchern, Coladosen etc., die ich fotografiere, dem Algorithmus gebe und zurück die EAN-13-Nummer erhalte. Also der Algorithmus gibt die EAN-13-Nummer zurück ...
 

Ähnliche Themen

Zurück
Oben