Infoseite zu dem Bildverarbeitungspraktikum "Funktionale Programmierung" (Mi 10 - 14 Uhr) im SoSe 2013
Ablauf des Praktikums:
Ziel des Praktikums ist die Entwicklung einer Bildverarbeitungssoftware mit Hilfe der funktionalen Programmiersprache Racket sowie der Anbindung der VIGRA-Bildverarbeitungsbibliothek über die VigRacket-Schnittstelle. Hierbei sind folgende Themengebiete als Ideen bzw. Anregungen vogegeben:
- Objekterkennung / Klassifikation von Bildinhalten,
- Image Retrieval (Bildersuche),
- Erweiterung der VigRacket (z.B. um eine bessere GUI oder weitere Funkionalitäten) und
- Interaktive Eingabemethoden über Anbindung der Webcam oder der Kinect.
Die gewählten Teilprojekte werden in Kleingruppen bearbeitet, die aus jeweils 2 bis 3 Personen bestehen.
Wichtige Termine:
- 10. April 2013
Die Bildung der Teams sollte abgeschlossen sein. - 17. April 2013
Die Teams sollten ihr zu verwirklichendes Thema gewählt, sowie die Aufgabenverteilung geklärt haben. - 24. April 2013
Vorstellung und Abgabe des Grobentwurfs und des Pflichtenhelftes. Darin sollten folgende Punkte enthalten sein:- Das Team, also alle Mitglieder mit Namen und Matrikelnummern.
- Das Thema, mit dem ihr Euch beschäftigen wollt.
- Der Leistungsumfang der Software, die Ihr entwickeln möchtet.
- Rahmenbedinungen, die erfüllt sein müssen, damit das Programm erfolgreich arbeiten kann.
- 22. Mai 2013
Abgabe des Feinentwurfes des Programms. Dieser sollte folgendes umfassen:- Die Schnittstellen,
- die Paketstruktur und
- die verschiedenen Module der Software.
- 10. Juli 2013 (letze Sitzung)
- Präsentation der Software auf dem vorläufigen endgültigen Stand
- bis spätestens 15. August 2013!
Endgültiger Praktikumsabschluss- Fertige Software liegt vor
- Abgabe der Entwickler- und Anwender-Handbücher
04.07.13: Verwenden der vigracket-Bibliothek unter Linux (z.B. Ubuntu)
Weiter unten stand bereits, dass sich die vigracket-Bib auch für Linux gut nutzen lässt. Allerdings muss man hierzu die C-Schnittstelle zwischen der C++-Bibliothek VIGRA und der Sprache Racket von Hand kompilieren. Dazu benötigt man zunächst einmal die beiden Abhängigkeiten, nämlich die VIGRA (v. >= 1.9) und die OpenCV-Bibliothek (v. >= 2.0). Falls das Paketverwaltungssystem nur zu alte Versionen anbietet, kann man die Bibliotheken auch selbst kompilieren.
Für die VIGRA folgt beispielsweise:
git clone git://github.com/ukoethe/vigra.git cd vigra mkdir build cd build cmake .. make sudo make install cd ../.. rm -r -f vigra
Ganz analog folgt für die OpenCV-Bibliothek:
git clone git://code.opencv.org/opencv.git cd opencv mkdir build cd build cmake .. make sudo make install cd ../.. rm -r -f opencv
Ist das erledigt, muss die vigra_c-Bibliothek hier heruntergeladen werden. Die zip-Datei nun nur noch entpacken, und in das entsprechende Verzeichnis wechseln. Hier ist jetzt noch folgendes zu tun:
make cd bin cp libvigra_c.so RACKET_COLLECTS_VIGRACKET
Wobei RACKET_COLLECTS_VIGRACKET das Verzeichnis meint, in dem die VigRacket liegt. Diese könnt ihr hier herunterladen. Beachtet allerdings, dass die Racket-Anbindung nur dann unter Linux läuft, wenn die libvigra_c.dylib im o.g. Paket gelöscht wird, und an dessen Stelle die selbst kompilierte libvigra_c.so rückt. Ansonsten sind Mac- und Linux-Versionen aber identisch!
19.06.13: Ausschneiden von Objekten aus Bildern!
Die Präsentation zur heutigen praktischen Demonstration der Freistellung von Objekten in Bildern kann hier heruntergeladen werden. Bitte beachtet, dass zum Ausführen der Demo die aktualisierte Racket-Version (weiter unten) benutzen müsst, da in der vorigen einige Funktionen fehlten!
19.06.13: Subversion Einführung
Die einführende Präsentation in die Versionsverwaltung mit Subversion kann hier heruntergeladen werden: Subversion-Einführung. Außerdem ist hier auch noch einmal das SVN-Handout hinterlegt, welches die wichtigsten Basisbefehle zusammenfasst.
ACHTUNG: Neue Version der VigRacket (mit diversen kleinen Bugfixes)!
Beim Ausprobieren einiger Dinge ist mir aufgefallen, dass sich noch insgesamt zwei kleine Fehler in der VigRacket befunden haben. Diese habe ich nun beseitigt. Zusammen mit dem kleinen Bug im Camera-Grabber steht somit nun eine neue Version zur Verfügung. Außerdem wurden die Racket(s) auf den iMacs auf Version 5.3.5 geupdatet. Auch dies wird mit dieser Version berücksichtigt. Diese kann hier für die iMacs im Pool heruntergeladen werden.
Die Installation besteht im Entpacken des Verzeichnisses in den Order "~/Library", so dass eine Verzeichnisstruktur "~/Library/Racket/5.3.5/collects/vigracket/" entsteht. Nach der Installation kann man durch Aufruf der enthaltenen Beispiele (Doppelklick auf "examples.rkt") die Funktionalität testen.
Anleitung: Benutzung von 2htdp/image und vigracket zusammen!
Die Benutzung beider Pakete zusammen verursacht im Quelltext einen Fehler, weil einige Symbole doppelt sind. Dies kann man umgehen, indem man entweder die vigra oder die plt-Scheme-Symbole bei "require" umbenennt. In diesem Beispiel benenne ich daher die 2htdp/image-Namen um. So lief es dann zum Beispiel bei mir:
#lang racket (require vigracket) (require (rename-in 2htdp/image (save-image save-plt-image) (image-width plt-image-width) (image-height plt-image-height))) (require 2htdp/universe)
ACHTUNG: FEHLER IM KAMERA-GRABBER!
Das Camera-Grabbing-Modul enthält leider einen Fehler, der dazu führt, dass keine Bilder von einer (Web-)Cam gegrabbt werden können. Dies betrifft die VigRacket-Datei "grab.rkt", die im Unterordner "~/Library/Racket/5.3.3/collects/vigracket" liegt. Bitte ersetzt diese durch die hier herunterzuladene Datei. In den Download-Links weiter unten auf dieser Seite wurde diese Datei bereits ausgetauscht.
Bitte bedenkt auch, dass das Kamera-Grabbing momentan nur unter Mac OS X zur Verfügung steht. Falls Bedarf besteht, dass dies auch von den Windows-Bindings aus unterstützt wird, schreibt mir eine Mail. Ich werde sehen, was ich tun kann.
Auf den iMacs kann nun (mit der neuen "grab.rkt"-Datei) wie folgt ein Bild img von der Kamera abgeholt werden:
#lang racket (require vigracket) ;;Initial die Kamera öffnen: (define camera (start-camera-capture 0)) ;;Bild abholen und in der Konsole anzeigen: (define img (grabimage camera)) (image->plt-image img) ;; Später dann, Kamera wieder freigeben: (stop-camera-capture cameara)
Ausgeteilte Materialien:
24.04.2013 - Verteilte Spieleprogrammierung
Zu diesem Termin wurde von Susanne Germer eine von mir programmierte Netzwerk-basierte Variante des bekannten TicTacToe-Spiels vorgestellt. Die dazugehörigen Dateien können hier heruntergeladen werden:
- Die Universe-Datei zum Spiel, die den Server-Teil und die Logik beinhaltet.
- Die World-Datei zum Spiel, die den Spieler-Bildschirm und die Maus-Interaktion beinhaltet.
Die beiden Dateien sind im Moment so vorkonfiguriert, dass sie auf einem Rechner lokal ausgeführt werden können. Soll das Spiel wirklich über Netzwerk-Multiplayer erfolgen, so sind folgende Dinge zu tun bzw. in Erfahrung zu bringen:
- IP-Adresse des Hosts (auf diesem Rechner wird die "universe.rkt"-Datei ausgeführt).
Diese bekommt man z.B. durch Öffnen eines Terminals und der Eingabe von "ifconfig" heraus (inet: XXX.XXX.XXX.XXX) - Datei "universe.rkt" auf dem Host starten. Auf diesem kann natürlich auch ein Spieler spielen.
- Die Datei "world.rkt" an alle Spieler verteilen.
- In der Datei "world.rkt" in der Funktion "(create-world n)" (ganz unten):
"LOCALHOST" durch die herausgefundene IP-Adresse des Universe-Hosts ersetzen - In der Datei "world.rkt" (ebenfalls ganz unten) den Ausdruck "(create-many-worlds ... )" durch "(create-world "X")" ersetzen. Hierbei ist "X" der String, mit dem sich der Spieler identifiziert und seine Marke auf das 3x3-Feld setzt.
- Auf jedem Rechner, an dem ein Spieler sitzt, die "world.rkt" ausführen. Warten, bis alle Spieler da sind und spielen!
10.04.2013 - Bildverarbeitungsübungen (Teil 2)
03.04.2013 - Bildverarbeitungsübungen (Teil 1)
Die praktischen Übungseinheiten zur Bildverarbeitung mit Racket der ersten Termine können hier heruntergeladen werden. Diese geben nur eine Anregung, was mit der Bildverarbeitungsbibliotheck VigRacket möglich ist, weitere Beispiele finden sich im Handbuch der VigRacket. Dieses ist im Installationsverzeichnis im Unterordner "doc" zu finden.
Allgemeine Materialien:
Racket
Das aktuelle Racket kann man unter http://racket-lang.org herunterladen. Es steht für nahezu jeden Betriebssystem bereit. Auf den Pool Rechnern ist z.Zt Racket 5.3.3 (64-bit) installiert.
Eine gelungene Einführung in die Programmiersprache findet sich unter der offiziellen Dokumentation, die auch in Racket unter Hilfe (F1) verfügbar ist.
Bildverarbeitung mit Racket: VigRacket
die Bildverarbeitungsanbindung, mit der wir die Aufgaben der Bildverarbeitung innerhalb des Praktikums lösen werden, kann hier für die iMacs im Pool heruntergeladen werden. Die Installation besteht im Entpacken des Verzeichnisses in den Order "~/Library", so dass eine Verzeichnisstruktur "~/Library/Racket/5.3.3/collects/vigracket/" entsteht. Nach der Installation kann man durch Aufruf der enthaltenen Beispiele (Doppelklick auf "examples.rkt") die Funktionalität testen.
VigRacket unter Windows benutzen
Befolgt man folgende Schritte, so lässt sie die VigRacket-Erweiterung auch unter Windows benutzen:
- Herunterladen der aktuellen 32bit Version von DrRacket unter http://racket-lang.org.
- Installieren der Version in einem Verzeichnis (z.B. C:\Programme (x86)\Racket)
- Herunterladen der VigRacket Erweiterung für Windows 32bit.
- Enpacken und kopieren des vigracket-Ordners in cas collects-Verzeichnis (z.B. C:\Programme (x86)\Racket\collects)
- Hinzufügen des VigRacket-Ordners (z.B. C:\Programme (x86)\Racket\collects\vigracket) zu PATH-Umgebungsvariable:
- Rechtsklick auf Arbeitsplatz/Computer, Anklicken von "Einstellungen"
- Anklicken von "Erweiterte Systemeinstellungen"
- Anklicken von "Umgebungsvariablen..."
- Bei Systemvariablen die Variable "Path" bearbeiten.
- Ans Ende das Verzeichnis anfügen (z.B. ...;C:\Programme (x86)\Racket\collects\vigracket)
Fehlerhandling in Racket
Manche Funktionen der VigRacket-Bibliothek werfen Fehler, die nicht fein differenziert werden, und die die Auswertung stoppen. Dies lässt sich zum Beispiel für die load-image Funktion durch die Installation eines anderen Event-Handlers beheben:
(define (safe-load-image file) (if (file-exists? file) (with-handlers ((exn:fail? (lambda (e) #f))) (load-image file)) "not existent"))
Somit wird der Fehler zu einem FALSE, außer die Datei existiert nicht, was zu einem Ergebnistyp String führt.