35
Eckart Modrow [email protected] Der SQLsnap-Supermarkt Ein Projekt zur Demonstration der neuen Möglichkeiten für Snap! Status: 6. März 2014

Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

Eckart Modrow [email protected]

Der

SQLsnap-Supermarkt

Ein Projekt zur Demonstration der neuen

Möglichkeiten für Snap!

Status: 6. März 2014

Page 2: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 2 -

Eckart Modrow

SQLsnap-Beispiel „Supermarkt“

Wir stellen uns einen Supermarkt mit verschiedenen Abteilungen vor:

einer Scannerkasse (liest Barcodes auf den Produkten, liefert Artikelnummern und Rechnun-

gen)

eine Lagerverwaltung mit integrierter Datenbank (erhält Artikelnummern, liefert Preise und

bestellt, falls nötig, Produkte von den Lieferanten)

eine „intelligente“ Waage für Früchte (erkennt eine Frucht mithilfe einer Kamera, erzeugt

Barcodes)

eine Werbeabteilung (verantwortlich für Payback, Werbung, Sonderangebote, …)

eine Sicherheitsabteilung (verantwortlich für die Bezahlung der Parkgebühren, Kunden mit

Hausverbot, …)

Die Implementationen der einzelnen Abteilungen laufen auf verschiedenen Computern und kommu-

nizieren mithilfe von Textdateien auf einem Server. Und wir benutzen keine professionellen Verfah-

ren, sondern nur „naive“ Lösungen, die zu Verbesserungen durch die Lernenden herausfordern.

1. Die Scannerkasse

Der Schönheit halber nehmen wir ein Bild von einer Scannerkasse als neues Kostüm der Turtle, sen-

den diese an die richtige Position und erzeugen einen Abdruck. Dann stellen wir die Verbindung zu

einem geeigneten Server her. Die entsprechenden Anweisungen fassen wir im Block init zusammen.

Jetzt brauchen wir Barcodes. Wenn wir keine Ahnung davon haben, erfinden wir welche.

Erster Versuch: Wir zeichnen einige schwarze Balken auf die Bühne und versuchen, deren Breiten zu

ermitteln. Dann zeichnen wir ein neues Kostüm für die Turtle, einen „Laserpointer“ mit einem roten

Fleck vorne. Wir können nun fragen, ob der rote Fleck schwarze Balken berührt. Zusammen mit der

Position des Laserpointers erhalten wir die Breiten der Balken. Die sammeln wir in einer Liste widths.

Page 3: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 3 -

Aber zuerst schreiben wir zwei Methoden find next black pixel und find next white pixel.

Find next black pixel arbeitet richtig, aber find next white pixel macht das nicht. Warum? Wenn die

Spitze der „roten Nase“ des Laserpointers einen schwarzen Balken berührt, hält er an. Aber der Rest

der „Nase“ berührt immer noch den weißen Hintergrund. Wir müssen also den Laserpointer ein paar

Schritte nach rechts bewegen, bevor wir nach anderen weißen Pixeln fragen. Weiterhin soll der

Suchprozess am rechten Bildrand stoppen. Wir erhalten:

Es ist einfach, die Breiten aller schwarzen Balken zu erhalten: Wir erzeugen zwei Variable (eine Liste

widths und eine Zahl newWidth), messen die x-Positionen des linken und rechten Balkenrandes und

packen die Differenz in die Liste. Wegen des Anhaltens am rechten Bildrand ist der letzte Messwert

überflüssig und wird gestrichen.

Page 4: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 4 -

Jetzt brauchen wir einen Code, der anzeigt, was die Balken bedeuten. Wir wählen ein Dualsystem mit

vier Stellen, ein breiter Balken (width > 35) bedeutet „1“, ein schmaler (width < 25) bedeutet „0“. Wir

zeichnen einige Barcodes dieser Art als Kostüme der Bühne und testen das Skript. Um den numeri-

schen Wert unseres Barcodes zu erhalten, wiederholen wir vier Mal: Lies jeweils das letzte Listen-

element und rechne es auf die übliche Art um. Dann lösche dieses Element. Falls die Breite nicht im

gewählten Bereich ist, melde einen Fehler.

Wir senden den Wert des Barcodes an die Lagerverwaltung, um den aktuellen Preis zu erhalten. Dies

geschieht, indem wir den Wert in eine Textdatei newCode auf dem Server schreiben.

Der gesamte Prozess kann in einem Block zusammengefasst werden.

Die Lagerverwaltung muss diese Datei immer wieder

lesen und bei Bedarf den richtigen Preis und die

Bezeichnung des Artikels liefern, in einer Textdatei

namens newPrice. Danach setzt sie newCode wieder

auf -1. Die Scannerkasse liest die Datei newPrice im-

mer wieder und erhält irgendwann Preis und Bezeich-

nung, die zum Barcode gehören. Danach schreibt sie

nothing in diese Datei.

Page 5: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 5 -

Übungen:

1. Echte Barcodes nutzen auch die Lücken zwischen den schwarzen Balken: als weiße Balken.

Die Breite der weißen Balken hat die gleiche Bedeutung wie die der schwarzen. Ändern Sie

das Skript collect all black bar widths zu einem collect all bar widths, das die Breiten aller

schwarzen und weißen Balken bestimmt. (Der erste und der letzte Balken sind schwarz.)

Wenn vier schwarze Balken benutzt werden: welches ist die größte darstellbare Zahl?

2. Zeichnen Sie einige neue Kostüme für ein Druckersprite, das Barcodes auf die Bühne drucken

kann. Zuerst soll der Benutzer nach der darzustellenden Zahl gefragt werden.

3. Suchen Sie Informationen über Ihr nationales Barcodesystem. In Europe werden Sie EAN-

Codes finden. Verändern Sie das Druckersprite zu einem „nationalen Druckersprite“, das die-

se Codes druckt.

4. Wenn die Lagerverwaltung nicht antwortet, wartet das get new price-Skript bis in alle Ewig-

keit. Verändern Sie das Skript zu einer brauchbaren Version.

5. Wenn die Lagerverwaltung richtig arbeitet, erhält die Kasse Antworten der Form

<Preis>,<Bezeichnung>

Lassen Sie die Kasse Rechnungen für die Kunden produzieren, die Datum und Zeit sowie alle

gekauften Produkte mit Preisen und die Gesamtsumme enthalten. Steuern sollen so wie in

Ihrem Land üblich angegeben werden.

Page 6: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 6 -

2. Die Lagerverwaltung

Die Lagerverwaltung benutzt eine mySQL-Datenbank auf dem Server. In diesem Fall die

snapex_example Datenbank.

Dort finden wir drei Tabellen:

products(pnr,label,maxstock,minstock,stock)

distributors(dnr,name,zipcode,city,street)

prices(pnr,dnr,price)

Wir müssen antworten, wenn die Scannerkasse nach einem Preis fragt. Deshalb müssen wir dauernd

nach Änderungen in der Datei newCode sehen. Aber zuerst drucken wir ein Lagerverwaltungs-Bild

auf die Bühne, verbinden uns mit dem Server, wählen die snapex_example Datenbank und erzeugen

Variable für alle benutzten Größen: Tabellen und Tabellenspalten.

Eine Anfrage zum Finden des aktuellen Preises und der Produktbezeichnung ist einfach. Wir erzeugen

den Text der Anfrage, indem wir geeignete Variable im SELECT-Block anordnen. Die Anfrage wird

vom exec-SQL-command Block ausgeführt.

Page 7: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 7 -

Die unendliche Schleife ist im Block

answer new price gekapselt. Wir

sehen dort nach, ob sich die Datei

newCode geändert hat. Falls das

geschieht, fragen wir den SQL-

Server nach dem Preis und der Be-

zeichnung und schreiben diese in

die Datei newPrice - falls wir vom

Server die richtige Antwort be-

kommen haben.

Wenn dieses Skript in der Lagerverwaltungs-Instanz von SQLsnap läuft, liefert die Scannerkasse die

richtige Antwort.

Falls Sie Schreibrechte auf dem Server haben1, können Sie die Datenbank auch verwalten. Zuerst

müssen Sie den Bestand der Produkte ermitteln. Dazu brauchen Sie deren Code.

1 Falls nicht: installieren Sie mySQL auf dem Computer, auf dem die „Lagerverwaltungs-Instanz” von SQLsnap läuft. Verbinden Sie sich über localhost als Benutzer root. Sie haben dann Schreibrechte.

Page 8: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 8 -

In SQLsnap haben wir derzeit nur Blöcke für select-Kommandos. Deshalb benutzen wir den exec sql-

command Block direkt für ein Update-Kommando.

Wenn der Code ein Produktschlüssel ist, können wir beide Blöcke zu einem Update-Kommando kom-

binieren:

Page 9: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 9 -

Übungen:

1. Wenn einige Produkte verkauft worden sind, sinkt der Bestand stock unter den Minimalwert

minstock. Bestellen Sie neue Produkte, sodass der Maximalbestand maxstock wieder er-

reicht wird. Suchen Sie den Lieferanten mit dem niedrigsten Preis für dieses Produkt.

2. Der Supermarkt möchte ein „Bio Supermarkt“ werden. Ändern Sie die Lieferanten für alle

entsprechenden Produkte und passen Sie die Preise an.

3. Fügen Sie Bioprodukte mit deren Preisen zusätzlich zu den Billigprodukten in die Produktta-

belle ein – wenn das möglich ist.

4. Immer Samstagabend wird ein Aktualisierungsvorgang im Lager gestartet, weil sich die Preise

der Lieferanten geändert haben könnten. In diesem Fall müssen die Produktpreise angepasst

werden.

5. Der Supermarkt funktioniert gut, braucht aber mehr Geld. Erhöhen Sie alle Preise um 10%.

6. Die Lagerverwaltung benötigt Statistiken über die Verkäufe pro Monat und Jahr. Sammeln

Sie erforderlichen Daten und stellen Sie die Umsätze in geeigneten Diagrammen dar.

7. Schreiben Sie einen Block für update-Anweisungen für mySQL.

Syntax: UPDATE <tablename> SET column = value {,column = value} WHERE <condition>;

Beispiel: UPDATE products SET stock = 99 WHERE pnr = 11;

8. Schreiben Sie einen Block für insert-Anweisungen für mySQL.

Syntax: INSERT INTO <tablename> (column{,column}) VALUES (value{,value});

Beispiel: INSERT INTO prices (pnr,dnr,price) VALUES (1,2,3.45);

9. Schreiben Sie einen Block für delete-Anweisungen für mySQL.

Syntax: DELETE FROM <tablename> WHERE <condition>;

Beispiel: DELETE FROM distributors WHERE name = ‘Miller’;

Page 10: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 10 -

3. Die intelligente Früchtewaage

Zuerst versuchen wir einige Kriterien zu finden, mit denen man Früchte unterscheiden kann. Wir

zeichnen einen Apfel, eine Orange, eine Aprikose und eine Banane.

Die Unterschiede sind offensichtlich:

Apfel und Orange sind rund, die Banane ist lang

Orange, Aprikose und Banane sind orange-gelb, der Apfel ist (in diesem Fall) grün

Die Aprikose ist klein, die anderen sind größer

Aber was bedeuten „rund“, „lang“, „gelb“ und „grün“, „groß“???

Wir wissen es, aber der Computer nicht. Wir müssen es ihm beibringen.

Unterscheide rund, oval und lang

Wir bringen das Objekt in die Bühnenmitte und schi-

cken ein size-measuring-sprite von links nach rechts

und von unten nach oben. Wir messen die Größe des

Objekts auf diesen Strecken und berechnen das Ver-

hältnis der Ergebnisse. „Runde” Objekte sollten ein

Verhältnis nahe bei „1“ haben, „lange“ Objekte ande-

re. Für „ovale“ Objekte sollten wir eigentlich mehrere

Messrichtungen benutzen. Aber fürs Erste bedeutet

„oval“ für uns „nicht rund und nicht lang“.

Page 11: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 11 -

Der measure horizontal size Block liefert eine Liste

mit zwei Werten: linke und rechte Grenze. Ent-

sprechend liefert der measure vertical size Block

Unter- und Obergrenze des Objekts. Mit diesen

Ergebnissen können wir entscheiden, ob ein Objekt

rund, lang oder oval ist. Und wir kennen seine

Größe.

Page 12: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 12 -

Farben von echten Objekten

Normale Früchte haben unterschiedliche Farben. Deshalb

messen wir die durchschnittliche Farbe, indem wir 10 RGB-

Werte bestimmen: fünf auf dem horizontalen Schnitt und 5

auf dem vertikalen. (Deshalb mussten wir die Lage des Objekts

speichern.) Das ist einfach. Aber unsere RGB-Werte können

256 * 256 * 256 Farben darstellen, also 16.777.218. Das sind

etwas zu viele.

Wir benötigen ein Verfahren, um die Farbenzahl zu verringern.

Wir versuchen es so: Für jeden RGB-Kanal entscheiden wir, ob

der Farbwert „hoch oder „niedrig“ ist. Falls er hoch ist, setzen

wir ihn auf 255, sonst auf 0. Wir erhalten damit nur zwei mög-

liche Werte für jeden Kanal, also 2 * 2 * 2 = 8 mögliche Far-

ben. Mit diesem Verfahren probieren wir mal aus, ob wir

überhaupt noch etwas Sinnvolles sehen können – oder nicht.

Wir ändern die Bühnengröße auf 400 x 400 und laden einige

Früchtebilder als Kostüme der Bühne.

Page 13: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 13 -

Nun reduzieren wir die Farnanzahl wie beschrieben …

.. und finden, dass das reicht.

Aber funktioniert es in vertretbarer Zeit?

Page 14: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 14 -

Wenn wir das Skript color reduction ausführen, arbeitet es zwar, aber sehr langsam. Deshalb nutzen

wir zu Bildbearbeitung die Möglichkeiten zum code mapping von Snap. SQLsnap fügt JavaScript Code

zu einigen Blöcken der Paletten hinzu. Wir zeigen diesen Code mithilfe des code of Blocks an:

Wenn wir den Code direkt in JavaScript ausführen wollen, benutzen wir den entsprechenden exec

JScode of Block. Wenn wir ihn ausführen, erhalten wir das geänderte Bild innerhalb von einigen Se-

kunden.

Wir kapseln den exec JScode of Block mit dem eingebetteten

Code in einem neuen reduce colors Block und haben jetzt ei-

nen sehr schnellen Befehl zur Bildbearbeitung.

Jetzt berechnen wir die mittlere Farbe der

Frucht wie angegeben und reduzieren das

Ergebnis wieder. Wenn wir das bei einer

Orange machen, erhalten wir ein hübsches

Gelb.

Und unser zweiter Apfel ist natürlich rot.

Page 15: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 15 -

Der reduce color Block arbeitet wie beschrieben: er erhält eine Liste

mit RGB-Werten und liefert eine Liste mit der reduzierten Farbe.

Farbcodes:

Aus den reduzierten Farbwerten können wir Farbcodes ableiten: wenn

wir 255 als „1“ interpretieren und 0 als „0“ erhalten wir einen dualen

Code. Gelb ist „110“ (6) und Rot „100“ (4).

Page 16: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 16 -

Jetzt haben wir den vollen Werkzeugkasten zur optischen Früchtebestimmung zusammen:

1. Machen Sie ein Foto einer Frucht. Wählen Sie es als Hintergrundbild der Bühne oder „dru-

cke“ Sie es. (Dann landet es im darüber liegenden „Pentrails“-Bild.) Bilder kann man mit dem

Smartphone oder der Laptopkamera machen. Der Hintergrund sollte weiß sein.

2. Reduzieren Sie die Farben des Bildes.

3. Messen Sie Größe und Form der Frucht.

4. Messen Sie die mittlere Farbe der Frucht und reduzieren Sie auch diese.

5. Berechnen Sie den Farbcode der Frucht.

Die erhaltenen Daten Form, Größe und Farbcode

können als Spalten einer Datenbanktabelle benutzt

werden. Wir haben dann je drei unterschiedliche

Werte für Größe und Form sowie 8 mögliche

Farbcodes. Damit können wir 3 * 3 * 8 = 72 Früchte

unterscheiden.

Page 17: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 17 -

Aufgaben:

1. Erzeugen Sie eine Datenbanktabelle der folgenden Art für Früchte:

PNr label shape size color code

123 red apple round big 4

223 cherry round small 4

456 banana long big 6

… … … … …

2. Fügen Sie die Tabelle zu Ihrer Datenbank hinzu.

3. Ändern Sie die collect data Methode so, dass sie Bezeichnung und Preis der Frucht liefert.

Benutzen Sie dafür Datenbankbefehle.

4. Das Farbreduzierungsverfahren ist sehr grob. Erfinden Sie ein besseres.

5. Unser Früchteerkennungsverfahren arbeitet nur gut, wenn die Frucht in der Bühnenmitte

platziert und horizontal ausgerichtet ist. Wenn wir ein Sprite mit einem Früchtebild als Kos-

tüm ausstatten, können wir das Sprite in der Mitte zentrieren und ausrichten, bevor wir das

Kostüm drucken. Realisieren Sie das Verfahren.

6. Wenn wir einen detaillierteren Farbcode verwenden, können wir mehr Früchte unterschei-

den. Wäre das in allen Situationen ein Fortschritt?

7. Es könnte ja sein, dass der Hintergrund der Frucht nicht weiß ist. Können Sie helfen?

Page 18: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 18 -

4. Die Sicherheitsabteilung

Unsere Sicherheitsabteilung ist unter anderem für das Parkhaus verantwortlich. Um das Bezahlen der

Parkgebühren zu vereinfachen, installiert die Abteilung eine automatische Kennzeichenerkennung.

Registrierte Kunden müssen dann nicht mehr vor der Parkhausschranke halten – jedenfalls hoffen wir

das.

Autokennzeichen enthalten spezielle Zeichensätze, die die Zeichenerkennung durch Computer er-

leichtern. In Europa haben sie einen schwarzen Rand – und das ist gut für uns. Versuchen wir also,

die Zahlen auf dem Kennzeichen zu bestimmen. (Die anderen Zeichen überlassen wir Ihnen.) Glückli-

cherweise haben wir schon fast alle Werkzeuge für unser Vorhaben realisiert. Sie müssen nur die

Leute an der intelligente Früchtewaage fragen!

Wir versuchen, eine extrem einfache Methode zur Kennzeichenerkennung zu entwickeln. Das Ergeb-

nis ist sehr empfindlich gegen Änderungen in Lage und Größe der Kennzeichen. Aber diese Nachteile

können leicht korrigiert werden, indem ein detailliertes Messverfahren eingesetzt wird. Sehen Sie

sich mal die Übungsaufgaben an!

Page 19: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 19 -

Verschmutzte Kennzeichen

Normalerweise sind Autokennzeichen nicht sauber. Sie tragen Schmutz und manchmal ist ein Teil der

Farbe in der Waschanlage verschwunden. Was können wir dagegen tun?

Zuerst einmal benötigen wir ein Grau-

stufenbild. Dazu berechnen wir den

Mittelwert der drei Farbkanäle für je-

des Pixel und tragen das Ergebnis bei

allen drei Farben ein. Das Pixel wird

dann grau. Wir speichern das Ergebnis

im Bild der Bühne. Um die Sache zu

beschleunigen, benutzen wir den exec

JScode of Block und erhalten das trans-

formierte Bild nach einigen Sekunden.

Wir verpacken das Ganze in einem

Block change to grayscale.

Page 20: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 20 -

Der nächste Schritt ist die Erzeugung eines

Schwarz-Weiß-Bildes. Wir wählen einen

Schwellwert (in diesem Fall 50), um weiße

und schwarze Pixel zu unterscheiden. (Eigent-

lich sollten wir diesen Prozess gleich bei der

Grauwertbestimmung durchführen!) Wir

bauen einen change to black and white

Block.

Das Ergebnis:

Lücken schließen

Jetzt haben wir zwar ein Schwarz-Weiß-

Bild des Autokennzeichens, aber die Zei-

chen haben Lücken dort, wo der Schmutz

war. Diese Lücken sollen mit schwarzer

Farbe geschlossen werden. Dazu verdi-

cken wir die Zeichen durch Anfügen einer

schwarzen Schicht an alle schwarzen Teile

des Bildes. Als Schichtdicke wählen wir

„1“. Aber es gibt ein Problem: Wenn wir

die veränderten Pixel in das Originalbild

schreiben, werden die Änderungen bei

den nächsten Schritten des Prozesses

wieder gelesen. Wir brauchen also ein

zweites Bild für die veränderten Pixel –

und wir haben eins: wir lesen von der Bühne und schreiben auf die Pentrails. Wenn wir dann das

geänderte Bild wieder auf die Bühne kopieren (copy from pentrails to stage), kann das Verfahren

erneut angewandt werden, ohne dass es Kollisionen zwischen Original und Kopie gibt.

Page 21: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 21 -

Ergebnis eines Aufrufs von make chars

fatter:

Nach einigen Aufrufen der Sequenz

Erhalten wir:

Wir brauchen noch eine Methode make chars thinner, um eine schwarze Schicht abzuschaben – mit

demselben Problem wie oben und derselben Lösung (s. nächste Seite). Das Ergebnis nach einem Auf-

ruf ist:

Page 22: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 22 -

Wir können zwischen dem Anfügen und dem Abschaben

schwarzer Schichten wechseln. Es ist eine Art Hand-

werkskunst, die beste Kombination aus Wachstums- und

Schmelzprozessen zu finden. In jedem Fall ist das Ergeb-

nis viel kompakter als das Schwarz-Weiß-Original.

Zeichenerkennung

OCR (Optical Character Recognition) benutzt komplexe Methoden, oft mit Neuronalen Netzen, um

Zeichen zu erkennen. Wir erfinden hier ein einfacheres Verfahren, das dem der intelligenten Waage

ähnelt. Weil alle unsere Zeichen auf dem Nummernschild die gleiche Breite haben, können wir sie

leicht identifizieren, wenn wir die Grenzen des Nummernschildes gefunden haben. Bei der intelligen-

ten Waage können Sie sehen, wie das geschieht.

Page 23: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 23 -

Um die Sache etwas zu vereinfa-

chen, benutzen wir nur “saubere”

Schilder. Wir beginnen, indem wir

von links nach rechts vertikale

Linien an der Position x suchen,

auf denen sich schwarze Pixel

befinden. Wenn wir die erste

gefunden haben, haben wir auch

den Anfang des ersten Zeichens.

Danach suchen wir nach der ers-

ten vertikalen Linie ohne schwar-

ze Pixel. Deren x-Position ergibt

das Ende des ersten Zeichens. Wir

haben ein „Fenster“ mit dem ers-

ten Zeichen darin. Die nächste

Linie mit schwarzen Pixeln ergibt die Breite der Lücke zwischen den Zeichen. xpos ist eine globale

Variable, in der der Anfang des aktuell betrachteten Zeichens gespeichert wird.

Wie der Zeichencode gefunden wird, sehen wir später.

Page 24: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 24 -

Wir können ein rotes Rechteck über alle Zei-

chen bewegen, wenn wir zuerst die Zeichen-

breite und die Lücke zwischen den Zeichen

bestimmen. Das nächste Skript zeigt, wie das

geht.

Jetzt versuchen wir so etwas wie OCR. Als Ausgangspunkt nehmen wir die Zeichen mit dem Rechteck

rund herum.

Wir stellen uns ein “Sensorfeld” aus drei sich kreuzenden Linien vor. An den runden

Punkten messen wir die Farben. Wir nummerieren die Punkte wie gezeigt und sehen

uns die Resultate in Tabellenform an. (graue Felder: Ergebnis schwer vorherzusagen)

char P1 P2 P3 P4 P5 P6 P7 P8 Code(s)

0 00100100

1 01111110

2 01101010

3 01011100 01111100

4 11010001

5 00001100

6 0100100

7 01111010

8 00010100 01010100

9 00101100 00101110

P8

P4

P1

P2 P3

P5

5

P7 P6

Page 25: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 25 -

Bei den Zeichen „3”, „8“ und „9“ können Fehler auftreten, wenn die Punkte nicht sehr gut justiert

sind. Aber das macht nichts, denn wenn wir die Sensoren P2, P3 und P7 etwas verschieben, sodass

sie klare Werte liefern, können wir sogar auf die Sensoren P1, P2 und P8 (z. B.) verzichten und haben

trotzdem einen brauchbaren Code.

char P1 P2 P3 P4 P5 P6 P7 P8 code(s) value(s)

0 10010 18

1 11111 31

2 10101 21

3 11110 30

4 01000 8

5 00110 6

6 00010 2

7 11101 29

8 01010 10

9 10111 23

Ein mögliches Layout für die restlichen Sensoren wäre:

Also los!

Wir wählen ein Nummernschild mit allen zehn Zeichen als Kostüm für die Bühne.

Page 26: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 26 -

Wir müssen die Sensoren an geeigneten Stellen

platzieren (hier: (13|50), …), um dort die Farben von der

Bühne zu lesen und eine Codenummer aus den Farben,

interpretiert als dualer Code, zu bilden.

Wenn wir damit fertig sind, transformieren wir den

Code mit dem folgenden Skript zum richtigen Zeichen:

Wir haben grüne Punkte an den Sensorpositionen ge-

zeichnet und die roten Rechtecke um die gefundenen

Zeichen – und das Ergebnis ist wie gewünscht.

Page 27: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 27 -

Übungen:

1. In den Beispielen wird nur die horizontale Ausrichtung der Zeichen bestimmt. Suchen Sie

auch die vertikale. In den Beispielen werden die Sensorpositionen absolut in Pixeln angege-

ben („das 13. Pixel von rechts, gemessen vom Rand“, …). Adressieren Sie die Sensoren relati-

ve zur Größe des Zeichenrechtecks.

2. Die Zeichenerkennung in den Beispielen ist sehr einfach, aber sehr empfindlich gegen Ände-

rungen in Größe und Position des Nummernschildes. Benutzen Sie mehr Sensoren, um die

Zeichen sicherer zu erkennen.

3. Wenn man schmutzige Nummernschilder lesen will, findet man keine scharfen Zeichengren-

zen. Als Folge werden einige Sensoren Fehler produzieren. Verbessern Sie die Resultate in

solchen Fällen, indem Sie den „nächsten richtigen Code“ eines falschen Codes bestimmen.

4. Zeichenerkennungsprogramme können lernen. Falls das Skript keine erkennbaren Muster

findet, sollte es sein Ergebnis anzeigen und nach dem richtigen Zeichen fragen. Speichern Sie

die Muster und dazu gehörigen gelernten Zeichen in einer Datenbank-Tabelle. Benutzen Sie

Abfragen, um unbekannte Muster zu identifizieren.

5. Benutzen Sie ein Sensorfeld mit mehr Sensoren. Identifizieren Sie damit mehr Zeichen ihres

nationalen Zeichensatzes.

6. Die Sicherheitsabteilung benötigt eine Datenbank mit Nummernschildern und Fahrzeugbesit-

zern sowie deren Staus (Kunde, Betriebsmitglied, unerwünschte Person, externer Parker, …).

Können Sie helfen?

7. Die Nummernschilderkennung stellt sich als großer Erfolg der Sicherheitsabteilung heraus.

Alle ihre Mitglieder sind sehr stolz darauf und die anderen Betriebsmitglieder bewundern die

„Sheriffs“. Die Werbeabteilung möchte nun die Daten der Nummernschildtabelle nutzen, um

häufige Kunden als VIP-Kunden zu ehren. Diese erhalten spezielle Parkplätze in der Nähe des

Fahrstuhls. Schreiben Sie eine Anfrage, um VIP-Kunden zu finden.

8. Nach einiger Zeit sind die VIP-Parkplätze mit den Autos von Rentnern und Arbeitslosen be-

setzt. Deshalb erweitert die Werbeabteilung die Kriterien für VIP-Kunden um ein Minimum

an Umsatz bei deren Einkäufen. Weil fast alle Kunden Kreditkarten beim Bezahlen benutzen,

ist das auch kein Problem. Verbessern Sie die VIP-Kunden-Abfrage entsprechend.

9. Die Werbeabteilung stellt fest, dass es hilfreich wäre, nicht nur den Umsatz eines Kunden zu

kennen, sondern auch, was er gekauft hat. Wenn sie die Interessen der Kunden kennt, kann

sie diese mit speziellen Angeboten und Sonderpreisen versorgen. Bestimmen Sie die dafür

notwendigen zusätzlichen Tabellen und deren Spalten in der Datenbank. Schreiben Sie ge-

eignete Anfragen.

Page 28: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 28 -

10. Die Werbeabteilung möchte wissen, ob ihre Werbemaßnahmen erfolgreich sind. Erreicht sie

die Kunden? Versuchen Sie diese Fragen auf der Grundlage der gespeicherten Daten zu be-

antworten.

11. Auf deutschen Autobahnen wird die LKW-Maut mithilfe von Toll-Collect-Barken bestimmt,

die die Kennzeichen der passierenden Fahrzeuge lesen. Sie lesen ALLE Kennzeichen und lö-

schen anschließend die der PKWs. Ist dieses Vorgehen angemessen? Diskutieren Sie die Kon-

sequenzen, falls alle Fahrzeugnummern und deren Positionen gespeichert würden.

Page 29: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 29 -

5. Die Werbeabteilung

Die Werbeabteilung ist begeistert über die Möglichkeiten der Zeichenerkennung und möchte diesen

Bereich ausweiten: sie möchten wissen, wer sich im Supermarkt befindet. Mit einem Gesichtserken-

nungsprogramm sollen die Kunden identifiziert werden.

Gesichtserkennung

Wir versuchen dieses auf einem ähnlichen Weg wie bei der Fruchterkennung. Zuerst zeichnen wir

einige Gesichter (ähnlich wie auf Passfotos) und versuchen dann, sie zu erkennen.

Wir suchen Gesichter. Deshalb führen wir wieder eine

Farbreduzierung durch, aber etwas anders als bei den

Früchten. Wir ignorieren den Blau-Kanal der Pixel und

reduzieren die Rot- und Grünwerte auf drei Zahlen: 0,

128 und 255. Das Resultat dieser einfachen Transfor-

mation ist ziemlich gut: alle Gesichter haben jetzt die

gleiche Farbe.

Paul Peter Mary Hannah

Page 30: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 30 -

Der nächste Schritt besteht darin, alles außer den

Gesichtern zu löschen: alle anderen Farben werden

auf Weiß gesetzt. Wir ergänzen …

… und erhalten …

Wir haben jetzt zwar die Gesichter, aber wir

benötigen Parameter, um sie zu beschreiben. Dafür

benutzen wir Größenverhältnisse ähnlich wie bei den

Früchten. Wir messen den Augenabstand und deren

Abstand zum Mund, die Nasenlänge im Verhältnis zur

Breite des Gesichts, …

„Augen“ und „Mund“ sind Löcher im orangenen

Gesicht. Zuerst versuchen wir es mit den Augen. Das

linke sollte sich über der Mitte und links davon im

Passfoto befinden. Dort suchen wir weiße Pixel mit

mehreren Schichten weißer Pixel darum herum – so

ähnlich wie bei make chars fatter.

Page 31: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 31 -

Das rechte Auge wird auf die gleiche Weise

identifiziert. Nur die Start-Koordinaten sind

unterschiedlich. Genauso geht es mit dem Mund,

aber er sollte deutlich größer als ein Auge sein. Und

die Nase finden wir als erstes weißes Pixel über dem

Mund – wenn es das gibt.

Wir messen die Positionen von Augen, Nase und

Mund und berechnen die Abstände und

Zahlenverhältnisse zwischen ihnen. In find features

werden die Ergebnisse zusätzlich grün markiert.

Page 32: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 32 -

Ergebnisse:

Wenn sich keine richtige Nase auf dem Bild findet, sind die Ergebnisse natürlich falsch.

Page 33: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 33 -

Die Ergebnisse fassen wir in einer Datenbanktabelle zusammen.

Name noseToEyes mouthToEyes mouthToNose

Peter 1.22 0.91 0.74

Paul 1.59 0.59 0.39

Mary 0 1.04 0

Hannah 0.73 1.00 1.37

Wenn wir die Datenbank nach einer Person fragen,

… erhalten wir eine Antwort – wenn die Personendaten gespeichert wurden.

Page 34: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 34 -

Übungen:

1. Die vier Bilder des Beispiels sind sehr stark vereinfacht. Experimentieren Sie mit echten Bil-

dern. Versuchen Sie diese mit einem Bildverarbeitungsprogramm für die Gesichtserkennung

aufzubereiten oder reduzieren Sie den Farbraum geeignet.

2. Geben Sie weitere Parameter zur Gesichtserkennung an.

3. Die Sicherheitsabteilung unseres Supermarkts soll unerwünschte Personen (Diebe, Landstrei-

cher, …) abweisen. Wenn die Gesichtserkennung an den Eingängen „unerwünschte Perso-

nen“ registriert, gibt es ein Alarmzeichen im Aufenthaltsbereich der Sicherheitsleute und die-

se greifen ein. Manchmal bewirkt das lautstarke Proteste der Betroffenen. Deshalb sollen sie

etwas unauffälliger abgewiesen werden: die Parkhausschranke öffnet sich nicht, wenn uner-

wünschte Personen erkannt werden, der Fahrstuhl funktioniert nicht, Türen gehen nicht auf,

… Diskutieren Sie die Konsequenzen dieser Entscheidung.

4. Die Werbeabteilung hat auch nette Ideen. Da gibt es z. B. viele Leute im Supermarkt, die

entweder nichts oder nur sehr wenig kaufen. Andere kaufen schon, aber nur Billigprodukte

oder Sonderangebote. Diese werden jetzt auch als unerwünschte Personen betrachtet, weil

sie den VIP-Kunden den Platz wegnehmen. Diskutieren Sie die Konsequenzen dieser Ent-

scheidung.

5. Unerwünschte Personen müssen sich schon eine Weile im Supermarkt aufhalten, bevor sie

aufgrund ihres Verhaltens identifiziert werden können. Die Sicherheitsabteilung entwickelt

deshalb zusammen mit der Werbeabteilung Profile solcher Leute, damit man sie erkennt,

BEVOR sie den Supermarkt das erste Mal betreten. Beschreiben Sie solche Profile und disku-

tieren Sie die Konsequenzen dieser Entscheidung.

6. Die Werbeabteilung weiß von den Kassen, was die Kunden kaufen. Aber viele sehen sich Pro-

dukte an, ohne sie mitzunehmen. Deshalb soll der Weg der Kunden durch den Supermarkt

verfolgt werden. Das kann mit „Nummernschildern“ am Einkaufswagen, RFID-Chips an diesen

oder mithilfe von Gesichtserkennung geschehen. Jetzt weiß die Werbeabteilung, an welchen

Produkten ein Kunde interessiert ist, sie kennt seine unerfüllten Wünsche. Personalisierte

Werbung kann ihm direkt auf sein Smartphone geschickt werden oder seine Daten werden

an spezialisierte Läden verkauft. Diskutieren Sie die Konsequenzen dieser Entscheidung.

7. Das Supermarkt-Team möchte sich in Zukunft auf die VIP-Kunden konzentrieren. Es erkennt

Premiumkunden anhand von entsprechenden Profilen (Automarke, Wohnort, persönliche

Daten, die aus der Gesichtserkennung abgeleitet werden, Kaufverhalten in der Vergangen-

heit, …). Um Ärger mit den Normalkunden zu vermeiden, werden die weiter in den Super-

markt gelassen, aber es passieren denen immer wieder kleine Ärgerlichkeiten (der Fahrstuhl

klemmt, … s. Übung 3). Diskutieren Sie die Konsequenzen dieser Entscheidung.

Page 35: Der SQLsnap-Supermarktsnapextensions.uni-goettingen.de/beispielsupermarkt.pdf · Gelb ist „110 ^ (6) und Rot „100 ^ (4). - 16 - Jetzt haben wir den vollen Werkzeugkasten zur optischen

- 35 -

8. Gesichtserkennung ist überall verfügbar, wo sich eine Kamera befindet: auf Smartphones,

„intelligenten“ Brillen, Laptops, … Weil das Internet auch überall verfügbar ist, können die

Bilder mit erreichbaren Datenbanken verglichen werden, z. B. in sozialen Netzwerken. „Er-

reichbar” müssen die Datenbanken entweder für den Benutzer oder für andere sein, die bei

der Übermittlung ebenfalls Zugang zu den Daten haben. Jedenfalls können Personen auf die-

sem Weg überall in Echtzeit identifiziert werden. Diskutieren Sie die Konsequenzen dieser

Entwicklung in unterschiedlichen Kontexten.