Forum: Digitale Signalverarbeitung / DSP / Machine Learning Mustererkennung - könnt Ihr mir Tipps geben ( ggf. aus nur Stichworte zum Suchen)


von Tommy (Gast)


Lesenswert?

Folgendes Problem:



Ich möchte verschiedene Würfel in einer 2D-Ebene erkennen in welcher 
Reihenfolge die nebeneinander liegen.

Zur Vorstellung:
( also quasi Fussballfeld – ich schaue aus dem Tor und möchte Würfel die 
auf dem Platz stehen erkennen)

                /
                |
Kamera<         \
                |
                /

Jeder Würfel hat an allen vier Seiten eindeutige Strichcodes die ich 
auslesen kann.




Die Kamera (1 Pixel-Reihe) fährt nun einmal vertikal ab und ich habe 
alle Strichcodes in einem Array ( Würfel können NICHT überlappen, aber 
direkt nebeneinander stehen)

Mein Problem ist nun folgendes:

Über Kreuzkorrelation könnte ich eigentlich die Würfel einfach finden  - 
aber durch die Schrägstellung der Würfel gibt es eben Verzerrungen.


Wie würdet ihr das einfach machen ?  Mein Problem ist, dass ich nicht 
für jede „Schrägstellung“ einmal kreuzkorrelieren will ... das ist zu 
aufwändig  -  gibt es andere Ideen ?

Schönen Abend  -  Tommy

P.S.  es sind ca 1000 Würfel  -  daher brauche ich ne bessere Lösung als 
einfach nur Testen ;)

: Verschoben durch Admin
von Hans M. (hansilein)


Lesenswert?

Was für ein Code wird denn benutzt?
Also sind nur die schwarzen balken, oder auch die abstände dazwischen 
informationstragend?
Kannst Du im Barcode start- und endemarker unterbringen?
Es ist ja so, daß die verzerrung pro würfel konstant ist und wegskaliert 
werden kann.

von Karl H. (kbuchegg)


Lesenswert?

Ich würde mich mal schlau machen, wie eigentlich die Laserscanner an den 
Supermarktkassen den Barcode finden und auswerten. Das hat mich immer 
schon fasziniert, wie die die Striche an den Produkten ziemlich 
zuverlässig finden, ganz gleich in welcher Lage das Produkt über das 
Glas gezogen wird.

von Tommy (Gast)


Lesenswert?

Hi,

danke für die Antworten.

Ja, die Verzerrung ist linear -  also eine Stauchung oder Streckung
Anfangs und Endmarker sollen keine Vorhanden sein.
Der Code ist ein Strickcode -  das einlese ist problemlos möglich - geht 
auch schon  - habe nun die Werte im Array drin  -  das Problem ist jetzt 
das zuordnen  - von Hand geht das recht gut -  aber das soll jetzt die 
Maschine machen ;)

von Tommy (Gast)


Lesenswert?

Strichcode meinte ich ;)

von STK500-Besitzer (Gast)


Lesenswert?

>Ich würde mich mal schlau machen, wie eigentlich die Laserscanner an den
>Supermarktkassen den Barcode finden und auswerten.

Diese Barcodes haben Start- und Stop-Zeichen. Weiterhin ergibt der Code 
auch nur in eine Richtung Sinn.
Bei "Wetten Dass" waren mal ein paar Kinder, die den Strichcode lesen 
konnte...

In der MC waren zu Apple][-Zeiten Programme als Strichcode abgedruckt. 
Dazu konnte man dann auch einen Strichcode leser erwerben.
Die Information dieser Strichcodes lag nur in der Breite der Balken: 
dicker Balken "1", dünner Balken "0".

Leider hat Tommy noch nichts zum Aufbau seines Strichcodes 
geschrieben...
Einfachstes Prinzip:
Breite des ersten Balkens bestimmen.
Diese Breite als "Standard" definieren.
nächste Balkenbreite mit dem Standard vergleichen:
Ist die Breite (in etwa) gleich, dann handelt es sich um die gleichen 
Zeichen,
ist die Breite kleiner als der Standard, handelt es sich um eine 0,
ist sie größer handelt es sich um eine 1; Dann muss man noch die 
vorherigen Bits irgendwie modifizieren, da sich auch gleichzeitg der 
Standa geändert hat...
Man sollte also zu Beginn eines Strichcodes eine Art Synchronisationsbit 
haben...

von Tommy (Gast)


Lesenswert?

hi,

haltet euch bitte nicht so sehr an den "Strichcodes" auf  - war nur die 
einfachste Möglichkeit das Bildlich zu beschreiben:


Ich hab ein letztlich Array :

..00100101101000010101011110100101...

und will da ein Muster finden sagen wir 10101

*ist alles lang genug um Eindeutig zu sein  - macht hieraus bitte kein 
Problem*

das Problem ist aber durch die Schrägstellung wird das leicht verzerrt.

Peakbreite kann ich NICHT bestimmen, (sind quasi deltapeaks)  - aber den 
Zwischenraum.

Bsp:    10101  wird dann zu 1001001 -  klar  - aber ich finde eben 
keinen einfachen, schnellen Weg das durchzutesten  - weil hier sieht das 
übersichtlich aus -  nachher sind das ca 100.000 Werte  - wobei 10101 
eben einen Bereich von 5 Stellen oder 10.000 Stellen einnehmen kann  - 
also müsste ich alle Skalierungen testen  - so mache ich es auch gerade. 
Geht  - das ist aber eben sehr langsam....

Tommy

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Keine Ahnung wie Effizient das sit, aber hast du es mal mit Regulären 
AUsdrücken deiner Lieblingsprogrammiersprache versucht?

von lp85 (Gast)


Lesenswert?

Wenn du definierte Start und Endzeichen hast könntest du ja in einem 
ersten Durchlauf nur mal diese suchen. Da diese ja relativ kurz sein 
sollten im vgl. zum gesamten Strichcode sollte sich die Streckung in 
einem wesentlich kleineren Rahmen abspielen als du oben geschrieben 
hast. Dazu könntest du dann deinen jetzigen Algorithmus verwenden der 
dann aber meintwegen nur noch 100 Mögliche breiten durchlaufen muss.
Im 2. Schritt sind dir dann schon alle Objekte und deren Verzerrung 
bekannt und du kannst die jeweiligen Bereiche im Array mit der 
errechneten Streckung auswerten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.