Begleitendes Praktikum zur Vorlesung Mustererkennung WS14/15
Übersicht Kontakt Aufgaben Bibliotheken Hinweise zu C#
Kontakt Internet: http://cvpr.unimuenster.de/teaching/ws1415/me_praktikum/ Softwareumgebung: Dr. Michael Schmeing m.schmeing<at>uni-muenster.de Raum 602b (Nach Vereinbarung) Aufgaben: Prof. Dr. X. Jiang xjiang<at>uni-muenster.de Raum 601 (Nach Vereinbarung) Emailverteiler m.schmeing<at>uni-muenster.de
Termine Werden frei festgelegt Vorgesehen zur Bearbeitung der Aufgabe Verpflichtende Vorführung am Ende des Semesters
Aufgaben Werden später bekannt gegeben
Organisation Notwendig zum Bestehen der Veranstaltung: Teilnahme an der Klausur der Vorlesung Abgabe der Aufgabe Vorführung des Gesamtsystems Übungsgruppen mit 3 bis 4 Teilnehmern
Prüfungsanmeldung Ab jetzt möglich bis zum 15.12.2014 studium.uni-muenster.de Nachmeldung ist nicht möglich Bei Fragen jeglicher Art: Prüfungsamt
SOFTWAREUMGEBUNG
Dreamspark (früher MSDNAA) Zugänglich für alle Studenten der IVV5 Enthält Microsoft Software, u.a. Windows 7/8 Visual Studio Ultimate 2013 SQL Server Zugang: <kennung>@math.uni-muenster.de Passwort wird an <kennung>@uni-muenster.de geschickt Link: http://www.unimuenster.de/ivv5ws/docwiki/doku.php?id=public:zugri ff_auf_microsoft-software_im_rahmen_von_msdnaa
Visual Studio Wir benutzen Visual Studio Ultimate 2013 Komplette Entwicklungsumgebung für C# (u.a.)
Emgu.CV Wrapper auf OpenCV Wir benutzen Version 2.4.9-beta (http://sourceforge.net/projects/emgucv/files/emgucv/2.4.9-beta/) Besteht aus mehreren Teilen, u.a: Emgu.CV.dll: Kernbibliothek Computer Vision Emgu.CV.ML.dll: Machine Learning Emgu.CV.UI.dll: GUI-Elemente Emgu.CV.OCR: Tesseract Engine (benutzen wir nicht) Emgu.CV.GPU: GPU-Funktionen (benutzen wir nicht) Emgu.CV.Stitching: Image Stitching (benutzen wir nicht) Emgu.Util.dll: Zeugs www.emgu.com Mehr Informationen auf der Vorlesungswebsite
Installation Windows Installation von libemgucv-windows-universal-cuda-2.9.0.1922- beta.exe Installiert Bibliothek Installiert Debugger Visualizer in VS2013 Testprojekt auf Homepage
Math.NET Mathematikbibliothek Version 3.2.0 Download: http://mathnetnumerics.codeplex.com/releases/view/126119 Reine.NET-Bibliothek, d.h. ohne Einschränkungen lauffähig unter.net und Mono Installation (Windows + Linux): Einbinden der MathNet.Numerics.dll aus Ordner Net40 ins Projekt
Aufgabenstellung Projektgerüst wird veröffentlicht Hauptdatei: *.sln Windows: Projekt kann direkt benutzt werden Linux: Zielplattform auf.net 2.0 einstellen Projektverweise neu auf eigene Emgu.*.dll setzen Bitte Quellcode kommentieren
Aufgabenstellung Projekt besteht aus Program.cs: Hauptschleife (nichts ändern) WS14_GUI.cs: GUI WS14_Aufgabe.cs: Schnittstelle WS14_LoesungXXX.cs: Eure Implementation Bitte XXX durch Gruppennummer ersetzen (in Dateiname und Klasse) Gruppennummer: Die letzten drei Ziffern der Summe der Matrikelnummern der Gruppenteilnehmer Abgabe: Implementation der Schnittstelle (für vergleichende Tests) Eigene GUI
HINWEISE ZU C#
Programmiersprache Performance Zugänglichkeit Bibliothek GUI Linux + Windows MATLAB Java C/C++ C# Wir benutzen C#
Einführung in C# Programme laufen in Laufzeitumgebung (.NET CLR, entspricht JavaVM) Java Bytecode entspricht Common Interface Language Garbage Collection Managed Code (keine Zeiger) Ähnliche Syntax wie Java Umfangreiche Standardbibliothek Sehr gute IDE (Visual Studio 2013)
Syntax Beispiel: class Program { public static void Main() { System.Console.WriteLine("Hallo Welt!"); } } Sehr gute Einführungen / Quellen: de.wikipedia.org/wiki/sprachelemente_von_c-sharp (<- sehr gut) openbook.galileocomputing.de/visual_csharp/ www.java2s.com/book/csharp/catalogcsharp.htm
Syntax (2) /// <summary> /// Verschiebt das Bild in x- und y-richtung /// </summary> /// <param name="shiftx">betrag in x-richtung</param> /// <param name="shifty">betrag in y-richtung</param> /// <returns></returns> public Image<Bgr, byte> shift(int shiftx, int shifty) { int rows = image.rows; int cols = image.cols; //erstellt das zurückzugebende Bild Image<Bgr, byte> shiftimage = new Image<Bgr, byte>(cols, rows); //for-schleife über Zeilen, Spalten und Farbkanäle for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { for (int d = 0; d < 3; d++) { //Randbehandlung if (r - shifty >= 0 & r - shifty < rows && c - shiftx >= 0 && c - shiftx < cols) shiftimage.data[r, c, d] = image.data[r - shifty, c - shiftx, d]; } } } return shiftimage; }
Syntax: Emgu Image<Bgr, byte> image Bgr: BlueGreenRed : Farbkanäle Alternative: Gray byte: Farbtiefe: 256 Farben pro Kanel = 8-bit Bild Alternative: double, Int32 image.data[r,c,d] byte-array Liefert Intensitätswert in Zeile r, Spalte c, Kanal d Schnellerer Zugriff als image[r,c] Wichtig: x-koordinate entspricht Spalte, also (x,y) = (c,r)
Visual Studio: Visual Debugger Bietet die Möglichkeit, im Debugger, d.h. bei angehaltenem Progamm, Bilder zu inspizieren.
Visual Studio: Visual Debugger 2. Im Debug Modus ausführen 4. Visual Debugger aufrufen 5. Visual Debugger. Rechtsklick öffnet 3. Variablen inspizieren 6. erweitertes Menü 1. Breakpoint setzten
Visual Studio: Visual Debugger Aktuelle Funktionszeiger Funktionszeiger Verschiebbar Vor und zurück Code ist veränderbar Wird on-the-fly kompiliert. Danach kann das Debuggen fortgesetzt werden. Entwicklung im Debugger möglich
Visual Studio: Hinzufügen von Steuerelementen Emgu.UI.dll auswählen
HINWEISE ZU EMGU
Zugriff auf Bilder Image<Bgr, byte> Img = new Image<Bgr, byte>(400,300); Img[r,c]: Extrem langsam (nicht verwenden) Img.Data[r,c,*]. Schon besser. Aber: for (int r = 0; r < rows; r++) for (int c = 0; c < cols; c++) Img.Data[r,c,0] = 255; ist langsam. Besser: byte[,,] imgdata = Img.Data; for (int r = 0; r < rows; r++) for (int c = 0; c < cols; c++) imgdata[r,c,0] = 255; Zeigerzugriff ist noch schneller, aber fehleranfälliger
Klasse Image Image<Bgr, byte> Img = new Image<Bgr, byte>(400,300); Viele CV-Funktionen bietet die Klasse Image direkt an: Img.Canny() Img.Hough*() Img.Dilate/Erode() Img.Smooth*() Img.Sobel() Img.Threshold*()
CvInvoke Emgu ist ein Wrapper auf OpenCV Kapselt OpenCV-Funktionen (Klassen in Emgu) Wrappt OpenCV-Funktionen: In Klasse CvInvoke Mit der Klasse CvInvoke kann man (so gut wie) alle OpenCV-Funktionen benutzen (mehr als in Emgu) Beispiel: k-means Clustering: CvInvoke.cvKMeans2(..) Bilder werden als Pointer übergeben: Img.Ptr Arrays (generell: Daten) als Matrizen Vorsicht: Nicht mit (ungenerischen) MathNET Matrizen verwechseln.
CvInvoke: Beispiele Binärisierung per Otsu: CvInvoke.cvThreshold(inputImg.Ptr, outputimg.ptr, 0, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_OTSU); inputimg ist ein Image<Bgr, byte> Bild, outputimg ebenfalls k-means: CvInvoke.cvKMeans2(data.Ptr, 12, labels.ptr, new MCvT ermcriteria(0.0001), 200, IntPtr.Zero, 0, centers, In tptr.zero); data ist vom Typ Matrix<float> data = new Matrix<float>(rows, cols);
Fragen?