Autor Beitrag
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 01.06.08 13:33 
Hallo,

eine Frage an die Bildverarbeitungsprofi unter euch (*hust* user profile icondelfiphan *hust* ;-)): Wie kann ich auf einem per Webcam gemachten (und damit qualitativ eher schlechten) Bild einen Strichcode finden?

Da ich zurzeit für die Schule einen Roboter baue, der eine einfache Version des Brettspiels Dame spielen kann, habe ich schon eine Grundlage für dieses Problem: Ich nehme das Bild, wandle es in den HSV-Farbraum um und dann weiter in den - durch user profile icondelfiphan bezeichnete - XYZ-Farbraum (siehe: Farben zusammenfassen). Dadurch kommt also ein sehr gut zu verarbeitendes Bild heraus, was dafür sorgt, dass mein Dame-Roboter inklusive Min-Max-Algo auch funktioniert.

Kommen wir aber wieder zum aktuellen Problem zurück. Ich brauche in diesem Fall nur Schwarz und Weiß und bekomme dann in etwa so ein Bild wie im Anhang heraus (ist eine Fotomanipulation, weil ich die Webcam gerade nicht da habe). Ich habe den zu suchenden Strichcode im Bild rot umrandet (der Rahmen ist also in Wirklichkeit nicht vorhanden). Wie kann ich diesen nun Finden, auch wenn er z.B. gedreht oder verzerrt ist?

Aufbau des Strichcodes (16-stellig):

ausblenden Quelltext
1:
2:
3:
4:
5:
| |            |||            | |            |||
| |            |||            |||            | |

weiß         schwarz        oben weiß    oben schwarz
                          unten schwarz   unten weiß


Der Strichcode im Bild im Anhang bedeutet: 1132211333023302

Grüße
GTA-Place
Einloggen, um Attachments anzusehen!
_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)


Zuletzt bearbeitet von GTA-Place am So 01.06.08 13:59, insgesamt 2-mal bearbeitet
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 01.06.08 13:42 
öh.. bei der Bildgröße hast du dich ja nicht gerade überschlagen :wink:
Ich kann jedenfalls kaum was erkennen.

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 01.06.08 13:46 
Das ist zwar nur ein Ausschnitt, der ist aber Originalgröße, also einfach zoomen :-P

Habs mal 10fach vergrößert.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 01.06.08 13:55 
user profile iconGTA-Place hat folgendes geschrieben:
Das ist zwar nur ein Ausschnitt, der ist aber Originalgröße, also einfach zoomen :-P

Habs mal 10fach vergrößert.
Also bei mir ist es ziemlich winzig und ich kann auch weder zoomen noch sonstwie vergrößern.
Einloggen, um Attachments anzusehen!
_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 01.06.08 13:59 
Ich sag ja: Ich habs vergrößert. Siehe Anhang oben.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 01.06.08 17:53 
Geh doch einfach Zeilenweise durch. Ein Strich bzw. Zwischenraum im Sinne des Strichcodes hat eine bestimmte Dicke +/- Toleranz. Du nimmst dir also jweils eine Zeile, suchst weisse(W) und schwarze Striche (S), die innerhalb der Toleranz sind, sowie Bereich (*), die außerhalb der Toleranz sind.

Dann bekommst Du z.B. '*WSSSWWWSSWSW*' oder auch einfach '****W', oder '*', irgendwie sowas jedenfalls.

Anhand deines Alphabetes kannst du dann sehr einfach dekodieren. Wenn mehrere Zeilen hintereinander die gleiche Dekodierung hervorbringen (Achtung!, vielleicht mit Levenshtein prüfen!), kannst du den Code als 'verifiziert und gelesen' ausgeben.

Da hast ja soetwas wie einen 2D-Barcode, da wird die Sache dann nicht ganz so trivial, aber im Grunde genommen immer noch simpel (rudimentäre Mustererkennung): Du scannst nicht eine Zeile, sondern z.B. 4:

_________________
Na denn, dann. Bis dann, denn.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 01.06.08 17:56 
Wichtig wäre erst einmal, dass Du dir eine Markierung suchst, die man im Bild recht einfach finden kannn. Und davon dann ausgehend weitersuchen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 01.06.08 18:09 
So machen es auch normale Barcodes. Hier dient SWS als Anfangs-, End- und Mittenzeichen.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 01.06.08 19:05 
Ich könnte eventuell noch, wie das bei Eye of Judgement gemacht wird, unter den Strichcode einen durchgehenden schwarzen Balken zeichnen. Dann müsste ich erstmal nur nach sowas suchen. Schwieriger wird das aber IMHO wenn der Strichcode gedreht ist.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 01.06.08 19:55 
Linien-Erkennung ist mit digitaler Bild-Verarbeitung relativ einfach. Und dann zu prüfen, ob oberhalb oder unterhalb vom Strichcode was geschrieben ist, sollte ja nicht das Thema sein ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 01.06.08 20:15 
Ehm. Theoretisch könnte die Zahl ja auch 00000 sein, dann hast du ein weisses Bild... Wie soll da ein Algorithmus rausfinden, wo der Strichcode ist bzw. wo der Strichcode anfängt?

Ein Strichcode hat üblicherweise klare Start-Stop Sequenzen oder Orientierungsmuster und ist auf Maschinenlesbarkeit optimiert. Z.B. kann die "Taktfrequenz" in der Start/Stop-Sequenz festgehalten sein und die Zahl beinhaltet eine Prüfziffer und/oder ist redundant codiert. Ausserdem sollte ein Strichcode nicht über einen längeren Abschnitt ganz schwarz oder ganz weiss werden (zu mindest bei 1D). Es sollte da höchstens zwei oder drei vorgegebene Strichdicken/"Lückendicken".

Dein Strichcode geht schon fast Richtung 2D, was noch viel schwerer zu erkennen ist. Bei 1D kannst du den Code auch etwas schräg scannen, das spielt dann keine Rolle. Bei 2D muss die Ausrichtung ziemlich exakt bestimmbar sein. Bei deinem Strichcode dürfte das nicht ganz einfach sein.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 01.06.08 20:52 
user profile icondelfiphan hat folgendes geschrieben:
Ehm. Theoretisch könnte die Zahl ja auch 00000 sein, dann hast du ein weisses Bild... Wie soll da ein Algorithmus rausfinden, wo der Strichcode ist bzw. wo der Strichcode anfängt?

Deshalb könnte ich ja eine durchgehende Markierung darunter setzen. Dann ist klar: der Strichcode ist da, wo der dicke Strich ist.


EDIT: Mit Sobel schein ich weiterzukommen. Die Kanten werden zumindest schonmal schön dargestellt und den Drehwinkel weiß ich dadurch ja automatisch auch.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 02.06.08 17:30 
Hängt davon ab, wie fest das Bild verzerrt sein kann, wie hoch die Auflösung des Bildes ist und in wiefern du selbst bestimmen kannst, wie der Barcode aussieht und ob mehrere Barcodes in einem Bild vorkommen können.

1. Umriss ermitteln
Der Freiheitsgrad ist 8 (Position/Grösse/Rotation/Verzerrung), was sehr viel ist. Du musst alle 4 Eckpunkte relativ sicher erkennen können. Es ist daher schlecht, wenn ein Eckpunkt einfach weiss sein kann und du durch Extrapolation den Eckpunkt errechnen musst. Der zusätzliche Balken reicht noch nicht. Auch wenn du oberhalb des Codes noch einen Balken hast, kannst du die Zahlen 11111, 00000 und 22222 nicht wirklich voneinander unterscheiden. Wenn du oben und unten einen Balken hast, dann sieht die Sache schon besser aus. Aber selbst dann ist es nicht immer einfach, denn zwei Striche bedeutet ja 00000, egal ob die Striche nun parallel sind oder nicht (Verzerrung!). Wenn mehrere Barcodes im Bild sind, wird die Sache noch viel komplizierter.

Fazit: Ohne klare Merkmale wird's nicht einfach. Bei Eye of Judgement sorgen 4 hellgrüne Pfeile für die Positionsbestimmung. Da ein solches hellgrün sonst nirgends auf den Bildchen oder auf der Karte vorkommt funktioniert die Erkennung sehr gut. Bei dir sind die Bilder extrem klein und schwarzweiss.

2. Bild entzerren/drehen
siehe Algorithmus zum Kamerabilder entzerren

3. Decodieren
Das sollte dann relativ einfach sein. Die Codierung sollte eine Prüfsumme beinhalten oder die Daten redundant speichern.

Eine ganz andere Möglichkeit wäre sowas wie Digimarc zu implementieren.
GTA-Place Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mo 02.06.08 18:17 
user profile icondelfiphan hat folgendes geschrieben:
Hängt davon ab, wie fest das Bild verzerrt sein kann

Unverzerrt normalerweise. Direkte Draufsicht.

user profile icondelfiphan hat folgendes geschrieben:
wie hoch die Auflösung des Bildes ist

Das müsste 640x480 sein. Der zu beachtende Bereich ist aber im Moment etwa 260x290.

user profile icondelfiphan hat folgendes geschrieben:
und in wiefern du selbst bestimmen kannst, wie der Barcode aussieht

Den kann ich zu 100% selbt bestimmen, weil ich den auch erstelle :-P

user profile icondelfiphan hat folgendes geschrieben:
und ob mehrere Barcodes in einem Bild vorkommen können.

Jop.

user profile icondelfiphan hat folgendes geschrieben:
Bei Eye of Judgement sorgen 4 hellgrüne Pfeile für die Positionsbestimmung. Da ein solches hellgrün sonst nirgends auf den Bildchen oder auf der Karte vorkommt funktioniert die Erkennung sehr gut. Bei dir sind die Bilder extrem klein und schwarzweiss.

Grün oder andere Farben da reinzubringen wäre natürlich auch möglich.


Soweit danke schonmal.

Grüße
GTA-Place

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)