Ariadne Ein Projekt für die Vorlesung ” Graphische Datenverarbeitung“
Ariadne Ein Projekt für die Vorlesung ” Graphische Datenverarbeitung“
Ariadne Ein Projekt für die Vorlesung ” Graphische Datenverarbeitung“
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Ariadne</strong><br />
<strong>Ein</strong> <strong>Projekt</strong> <strong>für</strong> <strong>die</strong> <strong>Vorlesung</strong> <strong>”</strong> <strong>Graphische</strong> <strong>Datenverarbeitung“</strong><br />
Christopher Auer und Martin Wegerer<br />
Wintersemester 2004/05<br />
1
Inhaltsverzeichnis<br />
1 <strong>Ein</strong>führung 3<br />
1.1 Kurzbeschreibung des <strong>Projekt</strong>s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.2 Der Name <strong>”</strong> <strong>Ariadne</strong>“ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
1.3 Der Unterschied zwischen <strong>”</strong> Labyrinth“ und <strong>”</strong> Irrgarten“ . . . . . . . . . . . . . . . . . . . . 3<br />
2 Benutzeranleitung 3<br />
3 Technische Beschreibung 5<br />
3.1 Allgemeines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
3.2 Bildsegmentierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
3.2.1 <strong>Ein</strong>führendes Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
3.2.2 Die Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.2.3 Der Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
A Übersetzen von <strong>Ariadne</strong> 10<br />
B <strong>Ein</strong>stellungen zur Bildaufbereitung 11<br />
C Aufgabenverteilung 11<br />
2
1 <strong>Ein</strong>führung<br />
1.1 Kurzbeschreibung des <strong>Projekt</strong>s<br />
2 BENUTZERANLEITUNG<br />
Mit dem Programm <strong>Ariadne</strong> kann <strong>für</strong> verschiedene Irrgärten (bzw. auch Labyrinthe) ein Weg von einem<br />
Start- zu einem Zielpunkt ermittelt werden. Der Start- und der Zielpunkt sind frei durch den Benutzer<br />
festlegbar. Der ermittelte Weg wird graphisch in dem Irrgarten (bzw. Labyrinth) dargestellt. Als Wegfindungsalgorithmus<br />
stehen der Dijkstra-Algorithmus (kürzester Weg) und der Backtracking-Algorithmus<br />
(zuerst gefundener Weg) zur Verfügung. Außerdem bietet <strong>Ariadne</strong> <strong>die</strong> Möglichkeit, über verschiedene<br />
Aufbereitungsoptionen, das Bild vor <strong>für</strong> <strong>die</strong> Wegfindung vorzubereiten.<br />
1.2 Der Name <strong>”</strong> <strong>Ariadne</strong>“<br />
<strong>Ariadne</strong>, eine aus der griechischen Mythologie entstammende Vegetationsgöttin, half ihrem Liebsten<br />
Theseus im Labyrinth des menschenfressenden Minotaurus (siehe Titelblatt): Sie gab ihm einen roten<br />
Faden (den <strong>”</strong> Faden der <strong>Ariadne</strong>“), mit dem Theseus immer wieder zur ihr zurückfinden konnte und<br />
somit nicht der Gefahr ausgesetzt war sich zu verirren. Theseus tötete (angeblich mit bloßer Hand) den<br />
Minotaurus und kehrte zu <strong>Ariadne</strong> mit Hilfe des Fadens zurück. Der <strong>”</strong> Algorithmus“, mit dem Theseus<br />
dabei arbeitete war, der <strong>”</strong> Backtracking“-Algorithmus.<br />
1.3 Der Unterschied zwischen <strong>”</strong> Labyrinth“ und <strong>”</strong> Irrgarten“<br />
Die Internetseite http://www.einlabyrinthimirrgarten.de/ gibt zu Labyrinth und Irrgarten folgende<br />
Definitionen an:<br />
Labyrinth In einem Labyrinth kann man sich nicht verirren. <strong>Ein</strong> klassisches Labyrinth führt ohne<br />
Sackgassen und Irrwege auf <strong>die</strong> Mitte zu. Der Weg ist frei von Wegkreuzungen und hat nur <strong>die</strong>sen<br />
einen verschlungenen Weg. Dieser ist auch der Weg, der einen wieder heraus führt. Der Innenraum eines<br />
Labyrinths ist dabei mit einem Maximum an Wegstrecke ausgefüllt. Auf dem Weg zur Mitte ist man dem<br />
Ziel oft zum Greifen nahe, wird aber immer wieder weggeführt. Je näher der Weg dem Ziel ist, desto<br />
kürzer ist der Pendelweg.<br />
Irrgarten Dagegen ist ein Irrgarten, ein Labyrinth in dem man sich verlaufen kann. Durch seine Kreuzungen<br />
und Verzweigungen verwirrt ein Irrgarten auf dem Weg zum Ziel und ist damit eine Sonderform<br />
eines Labyrinths. Dabei können sich einige Wege des Irrgartens als Sackgassen herausstellen, an denen<br />
man nicht weiter kommt. Andere Wege führen wieder an Wegkreuzungen, <strong>die</strong> bereits besucht wurden. Es<br />
ist <strong>die</strong> Kunst wieder herauszufinden.<br />
Die Bezeichnung Labyrinth verlor über <strong>die</strong> Jahre seine klassische Bedeutung und steht in der heutigen<br />
Zeit auch <strong>für</strong> etwas Verwirrendes - was eigentlich dem Irrgarten zukäme.<br />
2 Benutzeranleitung<br />
<strong>Ein</strong>e Kurzanleitung zum Übersetzen und Installieren der benötigten Komponenten befindet sich im Anhang.<br />
Anleitung zur Be<strong>die</strong>nung von <strong>Ariadne</strong>:<br />
1. Start<br />
Starten Sie <strong>Ariadne</strong>.exe aus dem Verzeichnis <strong>Ariadne</strong>\Debug<br />
2. Die Benutzeroberfläche<br />
Machen Sie sich kurz mit der Benutzeroberfläche vertraut. Die Benutzeroberfläche ist in drei Bereiche<br />
aufgeteilt:<br />
3
2 BENUTZERANLEITUNG<br />
• Die linke Hälfte<br />
Dieser Bereich beinhaltet ein Fenster, in der später das Ursprungsbild angezeigt wird. Außerdem<br />
werden darin der Start- und Zielpunkt festgelegt und der gefundene Weg eingezeichnet.<br />
Unterhalb <strong>die</strong>ses Bilds ist ein Fortschrittsbalken positioniert, welcher den aktuellen Fortschritt<br />
bei der jeweils ausgeführten Operation angibt.<br />
• Der rechte obere Bereich<br />
Dieses Fenster zeigt <strong>die</strong> jeweiligen Bearbeitungsschritte (Aufbereitung, Skelettierung) an und<br />
<strong>die</strong>nt zur Überprüfung der gewählten Aufbereitungsoptionen.<br />
• Der rechte untere Bereich<br />
Dieser Bereich beinhaltet <strong>die</strong> Schalt- und Kontrollelemente von <strong>Ariadne</strong>, sowie einen <strong>”</strong> Info“-<br />
Bereich. Auf <strong>die</strong> Be<strong>die</strong>nung wird in den nächsten Schritten näher eingegangen.<br />
3. Bild laden<br />
Laden Sie nun über <strong>die</strong> Schaltfläche <strong>”</strong> Bild laden...“ ein Bild Ihrer Wahl aus dem Verzeichnis<br />
Examples in <strong>die</strong> Anwendung. Die Schaltfläche <strong>”</strong> Aufbereiten“ wird nun freigeschaltet.<br />
4. Bildaufbereitung<br />
Es stehen folgende Operationen zur Bildaufbereitung zur Verfügung:<br />
• Binarisieren: Umwandeln eines Farbilds in ein reines Schwarz-Weiß-Bild. Mit der Schaltfläche<br />
<strong>”</strong> ...“ wird ein Dialog geöffnet, in dem man <strong>die</strong> Schwellwerte <strong>für</strong> <strong>die</strong> Binarisierung festlegen kann.<br />
• Invertieren: Vertauscht <strong>die</strong> Farben Schwarz und Weiß (bzw. Wege werden zu Wänden, bzw.<br />
umgekehrt).<br />
• Ero<strong>die</strong>ren: Vergrößert schwarze Bereiche des Bilds (z.B. um Wände eines Irrgartens zu<br />
verstärken).<br />
Passende Werte und <strong>Ein</strong>stellungen <strong>für</strong> <strong>die</strong> Beispielbilder sind im Anhang zu finden.<br />
Die Schaltfläche <strong>”</strong> Aufbereiten“ nimmt <strong>die</strong> eingestellten Operationen am Ursprungsbild vor und<br />
stellt das aufbereitete Bild im rechten Fenster dar. Falls der gewünschte Effekt nicht erzielt worden<br />
ist, können <strong>die</strong> <strong>Ein</strong>stellungen abgeändert und das Bild erneut aufbereitet werden. Die nächste<br />
Schaltfläche <strong>für</strong> <strong>die</strong> Skelettierung wird freigeschaltet.<br />
5. Skelettieren:<br />
Als nächster Schritt erfolgt <strong>die</strong> Skelettierung. Das skelettierte Bild wird in dem rechten Fenster<br />
dargestellt. Falls das Ergebnis der Skelettierung nicht dem gewünschten Ergebnis entspricht<br />
( <strong>”</strong> durchbrochene Wände“, <strong>”</strong> unterbrochene Wege“), so kann <strong>die</strong> Aufbereitung und <strong>die</strong> anschließende<br />
Skelettierung nochmals wiederholt werden. Nun ist <strong>die</strong> Schaltfläche <strong>”</strong> Knoten finden“ freigeschaltet.<br />
6. Knoten finden:<br />
Über <strong>die</strong> Schaltfläche <strong>”</strong> Knoten finden“ werden <strong>die</strong> Knoten und Kanten des aktuellen Bilds ermittelt<br />
- <strong>die</strong> erfolgreiche Ermittlung wird mit einer Meldung angezeigt. In dem <strong>”</strong> Info“-Feld wird <strong>die</strong> Anzahl<br />
der Knoten und Kanten ausgegeben. Ab jetzt ist <strong>die</strong> Funktion <strong>”</strong> Weg finden“ verfügbar.<br />
7. Festlegen von Start- und Zielpunkt:<br />
Im linken Fenster können Sie <strong>die</strong> beiden Felder <strong>”</strong> Start“ bzw. <strong>”</strong> Ziel“ mit gedrückter linker Maustaste<br />
auf <strong>die</strong> gewünschten Positionen verschieben.<br />
8. Weg finden:<br />
Mit <strong>die</strong>ser Schaltfläche wird mit Hilfe des gewählten Verfahrens im Falle des <strong>”</strong> Backtracking“-<br />
Algorithmus ein möglicher Weg und im Falle des <strong>”</strong> Dijkstra“-Algorithmus der kürzeste Weg vom<br />
Start- zum Zielpunkt ermittelt. Die Wahl des Verfahrens kann vor der Wegfindung über <strong>die</strong> Auswahlfelder<br />
auf der rechten Seite getroffen werden. Der Weg wird graphisch im Ursprungsbild auf<br />
der linken Seite in grauem Farbton eingezeichnet. Die Länge des gefundenen Wegs wird in Pixeleinheiten<br />
im <strong>”</strong> Info“-Feld ausgegeben. Falls keine Verbindung zwischen Start- und Zielpunkt existiert<br />
4
3 TECHNISCHE BESCHREIBUNG<br />
wird <strong>die</strong>s durch eine Fehlermeldung kenntlich gemacht. Es besteht <strong>die</strong> Möglichkeit <strong>die</strong> Platzierung<br />
des Start- sowie Zielpunktes im Ursprungsbild abzuändern und <strong>für</strong> <strong>die</strong>se neue Anordnung einen<br />
anderen Weg errechnen zu lassen.<br />
3 Technische Beschreibung<br />
Diese Sektion beschreibt <strong>die</strong> verwendeten Module und Operationen der <strong>”</strong> Commmon Vision Blox“ (CVB)<br />
und den selbst entwickelten Algorithmus zum Auffinden der Knoten und Kanten. <strong>Ariadne</strong> wurde<br />
vollständig in Microsoft Visual C++ .NET Version 7 und mit Unterstützung der CVB entwickelt. Zur<br />
Übersetzung des Programms weitere Informationen im Anhang.<br />
3.1 Allgemeines<br />
Bildaufbereitung Für <strong>die</strong> Bildaufbereitung wurde das CVB-Modul <strong>”</strong> Morpheus“ verwendet:<br />
• Hysteresis: Binarisierung des Bilds<br />
Wird ein Farb- oder Graustufenbild eingeladen, so muss es vor der Skelettierung binarisiert werden,<br />
da der Skelettierungsalgorithmus nur mit binären Bildinformationen arbeiten kann.<br />
• Invert: Invertierung des Bilds<br />
Für <strong>die</strong> Skelettierung wird verlangt, dass <strong>die</strong> Wege in weißer und der Hintergrund (bzw. <strong>die</strong> Wände)<br />
in schwarzer Farbe vorliegen. Dies ist nicht bei allen Bildern der Fall (insbesondere nach der Binarisierung).<br />
Die Invertierung vertauscht <strong>die</strong> Farben des Binärbilds.<br />
• Erode: Erosion des Bilds<br />
Die Erosion vergrößert <strong>die</strong> schwarzen Bereiche des Bilds. Bezogen auf das Bild heißt <strong>die</strong>s, dass <strong>die</strong><br />
Wände verbreitert werden. Dies ist deswegen ab und zu notwendig, um <strong>”</strong> Risse“ in den Wänden zu<br />
schließen und <strong>die</strong> manchmal zu dünnen Wände zu verstärken.<br />
• Skeleton: Skelettierung<br />
Der Skelettierungsalgorithmus wandelt <strong>die</strong> Weglinien in Pixellinien mit einer Stärke von einem Pixel<br />
um. Dies wird <strong>für</strong> den Algorithmus zum Auffinden der Knoten und Kanten benötigt.<br />
Zu einer schnelleren Bearbeitung der Bildinhalte wird der von CVB bereitgestellte VPAT ( <strong>”</strong> virtual<br />
pixel access table“) verwendet: Dies ermöglicht einen direkten Zugriff auf <strong>die</strong> Bildinhalte.<br />
Bildsegmentierung Die Bildsegmentierung von <strong>Ariadne</strong> ermittelt aus dem skelettierten Bild eine<br />
<strong>”</strong> höhere“ Datenstruktur, bestehend aus Knoten und Kanten. Dieser Algorithmus wurde nicht von CVB<br />
oder einem anderen externen Tool bereitgestellt. Das nächste Kapitel geht auf <strong>die</strong> Realisierung <strong>die</strong>ses<br />
Algorithmus ein.<br />
3.2 Bildsegmentierung<br />
Der Algorithmus zur Ermittlung der Knoten und Kanten aus dem aufbereiteten und skelettierten Bild ist<br />
in der Methode OnFindNodes der Klasse C<strong>Ariadne</strong>Dlg implementiert. Die Arbeitsweise des Algorithmus<br />
soll durch ein einführendes Beispiel veranschaulicht werden.<br />
3.2.1 <strong>Ein</strong>führendes Beispiel<br />
Durch <strong>die</strong> vorhergehende Skelettierung liegen <strong>die</strong> Wege in Pixelzügen der Stärke eins vor. Dies ist bei<br />
der Bearbeitung zu berücksichtigen. Abbildung 1 zeigt einen beispielhaften Pixelzug. Dieser Pixelzug soll<br />
im Folgenden in eine höhere Datenstruktur überführt werden. Diese Datenstruktur besteht aus Kanten<br />
und Knoten. In Abbildung 1 nimmt der Pixel A eine Sonderstellung ein. Er fungiert als Verbindungsglied<br />
zwischen den vier Pixelzügen u, v, w und x. Deswegen wird <strong>für</strong> den Pixel A ein eigener Knoten<br />
5
3.2 Bildsegmentierung 3 TECHNISCHE BESCHREIBUNG<br />
erstellt. Für <strong>die</strong> anderen Pixelzüge u, v, w, x wird ebenfalls jeweils ein Knoten erstellt (siehe Abbildung 2).<br />
Jetzt sind <strong>die</strong> Kanten zwischen den Knoten zu erstellen. Hier<strong>für</strong> wird wieder der Knoten A herangezogen:<br />
Er baut je Nachbar eine Verbindung zwischen sich und dem angrenzenden Pixelzug (Knoten) auf.<br />
Abbildung 3 zeigt das Ergebnis <strong>die</strong>ser Operation.<br />
Der Algorithmus muss also <strong>für</strong> <strong>die</strong> weißen Pixelzüge des skelettierten Bilds <strong>die</strong> <strong>”</strong> besonderen“ Pixel (im<br />
Folgenden als Pixelknoten bezeichnet) ausfindig machen (im Beispiel war <strong>die</strong>s der Pixel A). Außerdem<br />
sind <strong>für</strong> <strong>die</strong> restlichen Pixelzüge <strong>die</strong> Knoten zu erstellen (im Beispiel: u, v, w, x). Danach sind <strong>für</strong> <strong>die</strong><br />
Pixelknoten <strong>die</strong> Nachbarn und somit <strong>die</strong> Kanten zu ermitteln.<br />
Nach der Ausführung des Algorithmus liegt eine Datenstruktur vor, <strong>die</strong> <strong>für</strong> <strong>die</strong> Bearbeitung durch<br />
einen Wegfindungsalgorithmus (Dijkstra oder Backtracking) geeignet ist.<br />
w<br />
u<br />
A<br />
Abbildung 1: Unbearbeiteter Pixelzug<br />
w<br />
u<br />
A<br />
Abbildung 2: Die erstellten Knoten<br />
Die oben genannte Sonderstellung des Pixels A soll jetzt nochmal genauer dargestellt werden. Die<br />
Abbildung 4 zeigt wieder den Pixelzug, wobei nur der Pixel A und seine angrenzenden Nachbarn dargestellt<br />
sind. Hierbei ist besonders <strong>die</strong> Anzahl der Nachbargruppen zu beachten. <strong>Ein</strong>e Nachbargruppe<br />
ist definiert als <strong>die</strong> zusammenhängenden Pixel von Nachbarn. Pixel A hat hierbei drei Nachbargruppen.<br />
<strong>Ein</strong>e besondere Eigenschaft <strong>die</strong>ser Pixelknoten ist es, dass sie mehr als zwei Nachbargruppen besitzen.<br />
Über <strong>die</strong>se Bedingung kann eindeutig entschieden werten, ob ein Pixel ein Pixelknoten ist.<br />
6<br />
v<br />
v<br />
x<br />
x
3.2 Bildsegmentierung 3 TECHNISCHE BESCHREIBUNG<br />
3.2.2 Die Datenstrukturen<br />
w<br />
u<br />
A<br />
Abbildung 3: Die erstellten Knoten mit den Kanten<br />
¡ ¢¡¢ ¡<br />
¡ ¡ ¢¡¢<br />
¢¡¢ ¡ ¡<br />
¥¡¥¡¥ ¦¡¦¡¦<br />
¦¡¦¡¦<br />
§¡§ ¨¡¨ £¡£¡£<br />
¥¡¥¡¥<br />
¤¡¤¡¤<br />
A<br />
§¡§ ¨¡¨<br />
¨¡¨ §¡§<br />
£¡£¡£ ¤¡¤¡¤<br />
¤¡¤¡¤ £¡£¡£<br />
Abbildung 4: Der Pixel A mit seinen Nachbarn<br />
• Knoten und Kanten - node, neighbor<br />
Knoten sind durch <strong>die</strong> Klasse Node realisiert. Sie besitzen eine eindeutige Identifikationsnummer und<br />
eine <strong>”</strong> Länge“. Diese Länge gibt <strong>die</strong> Anzahl der Pixel an, <strong>die</strong> zu <strong>die</strong>sem Knoten gehören. Außerdem<br />
speichert ein Knoten seine Kanten zu anderen Knoten in einer Liste.<br />
• Die Knotenliste - nodeList<br />
Die Hauptklasse C<strong>Ariadne</strong>Dlg verwaltet eine Knotenliste mit allen durch den Algorithmus erzeugten<br />
Objekten der Klasse Node. Diese Knotenliste wird dann später <strong>für</strong> <strong>die</strong> Wegfindung verwendet.<br />
Wichtig ist, dass <strong>die</strong> Position eines Knotens in <strong>die</strong>ser Liste mit der ID (minus 1) des Knotens<br />
übereinstimmt.<br />
• Die Knotenmatrix - nodeMatrix<br />
Wird <strong>für</strong> einen Pixelzug eine Knoten erstellt, so wird in der Knotenmatrix <strong>die</strong> ID des Knotens <strong>für</strong><br />
<strong>die</strong> jeweiligen Pixel vermerkt. Die Knotenmatrix hat hierbei <strong>die</strong> gleiche Größe wie <strong>die</strong> Bildmatrix.<br />
• Breitensuche-Queue - breadthQueue<br />
Die Breitensuche-Queue wird verwendet, um alle Pixel eines Pixelzugs zu traversieren.<br />
• Seed-Queue - seedQueue<br />
Die Seed-Queue verwaltet eine Schlange von Pixeln <strong>die</strong> als <strong>”</strong> Samen“ <strong>für</strong> neu zu erstellende Knoten<br />
<strong>die</strong>nt. Von <strong>die</strong>sen Punkten aus werden dann mit einer Breitensuche <strong>die</strong> zugehörigen Bildpunkte des<br />
Pixelzugs ermittelt.<br />
• Pixelknoten-Queue pixelNodeQueue<br />
Die Pixelknoten-Queue nimmt alle Knoten mit mehr als zwei Nachbargruppen auf, um sie in einem<br />
späteren Bearbeitungsdurchgang zur Erstellung der Kanten zu verarbeiten.<br />
7<br />
v<br />
x
3.2 Bildsegmentierung 3 TECHNISCHE BESCHREIBUNG<br />
3.2.3 Der Algorithmus<br />
Der Algorithmus liegt als Pseudocode vor. Außerdem finden sich im Quellcode von <strong>Ariadne</strong> sehr ausführliche<br />
Kommentare. Der Pseudocode verwendet einige Funktionen, <strong>die</strong> kurz erläutert werden sollen:<br />
• isW hite (pixel) gibt wahr zurück, falls der Pixel <strong>die</strong> Farbe Weiß hat, ansonsten falsch (durch <strong>die</strong><br />
Skelettierung liegen <strong>die</strong> Pixel der Wege in weißer Farbe vor)<br />
• nodeMatrix [pixel] gibt <strong>die</strong> ID des Pixels in der Knotenmatrix zurück. Die ID ist 0, falls zu <strong>die</strong>sem<br />
Pixel noch kein Knoten erstellt worden ist, ansonsten steht an <strong>die</strong>ser Position <strong>die</strong> ID des Knotens<br />
zu dem zugehörigen Pixel bzw. Pixelzug.<br />
• isEmpty(queue) gibt wahr zurück, falls <strong>die</strong> Queue keine Elemente enthält, ansonsten falsch.<br />
• first(queue) gibt das erste Element der Queue zurück.<br />
• removeF irst(queue) entfernt das erste Element aus der Queue.<br />
• newNode() erstellt einen neuen Knoten, mit einer neuen ID.<br />
• id(node) liefert <strong>die</strong> ID des Knotens node.<br />
• neighborGroups(pixel) liefert <strong>die</strong> Menge der Nachbargruppen des Pixels. <strong>Ein</strong>e Nachbargruppe ist<br />
wiederum eine Menge von Pixeln.<br />
• neighborsnode bezeichnet <strong>die</strong> Menge der Nachbarknoten von node.<br />
Der Algorithmus zum Auffinden der Knoten ist gegeben durch den folgenden Pseudocode:<br />
8
3.2 Bildsegmentierung 3 TECHNISCHE BESCHREIBUNG<br />
Algorithm 3.1: findNodes(−)<br />
for each pixel ∈ pictureMatrix<br />
if isW hite (pixel) and nodeMatrix [pixel] = 0<br />
seedQueue ← seedQueue ∪ {pixel}<br />
while not isEmpty (seedQueue)<br />
seedP ixel ← first (seedQueue)<br />
removeF irst (seedQueue)<br />
if nodeMatrix [seedP ixel] = 0<br />
node ← newNode ()<br />
nodeMatrix [seedP ixel] ← id (node)<br />
nodeList ← nodeList ∪ node<br />
breadthQueue ← breadthQueue ∪ {seedP ixel}<br />
while not isEmpty (breadthQueue)<br />
breadthP ixel ← first (breadthQueue)<br />
removeF irst (breadthQueue)<br />
for each neighborGroup ∈ neighborGroups (breadthP ixel)<br />
if {p|p ∈ neighborGroup ∧ |neighborGroups (p) | > 2} = ∅<br />
seedQueue ← seedQueue ∪ neighborGroup<br />
else breadthQueue ← breadthQueue ∪ neighborGroup<br />
if |neighborGroups (breadthP ixel)| > 2<br />
pixelNodeQueue ← pixelNodeQueue ∪ breadthP ixel<br />
else nodeMatrix [breadthP ixel] ← id (node)<br />
Der Algorithmus zur Erstellung der Kanten ist gegeben durch:<br />
Algorithm 3.2: findEdges(−)<br />
while not isEmpty (pixelNodeQueue)<br />
pixel ← first (pixelNodeQueue)<br />
removeF irst (pixelNodeQueue)<br />
node ← nodeOf (pixel)<br />
for each neighbor ∈ neighbors (node)<br />
if id (node) = id (neighbor)<br />
neighborsnode ← neighborsnode ∪ neighbor<br />
neighborsneighbor ← neighborsneighbor ∪ node<br />
9
A Übersetzen von <strong>Ariadne</strong><br />
Vorraussetzungen<br />
• Visual Studio C++ .NET<br />
• Common Vision Blox ≥ v 8.0.2 - zu installierende Module:<br />
– Measurement → Morpheus 2.3<br />
– General Image Processing → Morpheus 2.3<br />
Übersetzen von <strong>Ariadne</strong><br />
1. Öffnen der <strong>Projekt</strong>datei <strong>Ariadne</strong>.sln im Verzeichnis <strong>Ariadne</strong><br />
A ÜBERSETZEN VON ARIADNE<br />
2. Über <strong>Projekt</strong> → Eigenschaften von <strong>Ariadne</strong> müssen eventuell Anpassungen der Pfade zu der<br />
Common Vision Blox Installation gemacht werden:<br />
• C/C++ → Allgemein: Zusätzliche Includeverzeichnisse<br />
(z.B. C:\Programme\Common Vision Blox\Lib\C)<br />
• Linker → Allgemein: Zusätzliche Bibliotheksverzeichnisse<br />
(z.B. C:\Programme\Common Vision Blox\Lib\C)<br />
• Linker → <strong>Ein</strong>gabe: Zusätzliche Abhängigkeiten<br />
(z.B. C:\Programme\Common Vision Blox\Lib\C\CVCDisp.lib bzw. CVCImg.lib)<br />
3. Über Erstellen → <strong>Ariadne</strong> erstellen wird <strong>Ariadne</strong> übersetzt (<strong>die</strong> Warnung bei der Übersetzung<br />
können ignoriert werden)<br />
4. Debuggen → Starten startet <strong>Ariadne</strong><br />
10
B <strong>Ein</strong>stellungen zur Bildaufbereitung<br />
C AUFGABENVERTEILUNG<br />
Die folgende Tabelle gibt <strong>die</strong> passenden <strong>Ein</strong>stellungen <strong>für</strong> <strong>die</strong> Aufbereitung der Beispielbilder (im Verzeichnis<br />
Examples) an:<br />
Operationen Binarisierung<br />
Datei Bin. Inv. Erod. NarrowHigh WideHigh<br />
kompliziert.tif - - X - -<br />
rechteck01.jpg X X (X) 222 222<br />
rechteck02.jpg X X (X) 222 222<br />
rechteck03.jpg X X - 180 180<br />
rechteck04.jpg X X (X) 128 128<br />
rechteck05.tif X X (X) 128 128<br />
rechteck06.tif X X (X) 128 128<br />
rechteck07.tif - - X - -<br />
rechteck08.tif - - X - -<br />
rechteck09.tif X X X 128 128<br />
rund01.jpg X X - 244 244<br />
rund02.jpg X X (X) 128 128<br />
selbstgemacht.tif - - - - -<br />
crack.tif - - - - -<br />
ka kool maze.tif X X X 90 90<br />
snowman.tif X X (X) 128 128<br />
maze1.tif X X X 160 160<br />
maze2.tif X X - 185 185<br />
maze3.tif X X - 128 128<br />
maze4.tif X X - 200 200<br />
pattern.tif - - - - -<br />
C Aufgabenverteilung<br />
• Christopher Auer<br />
– Entwicklung des Algorithmus zum Finden der Knoten und Kanten<br />
– Dokumentation (Ausführung)<br />
– Implementierung des Algorithmus zum Finden der Knoten und Kanten<br />
– Entwicklung von <strong>Ariadne</strong> in VC++<br />
• Martin Wegerer<br />
– Entwicklung des Algorithmus zum Finden der Knoten und Kanten<br />
– Dokumentation (Korrektur und Grundkonzept<br />
– Design der Benutzeroberfläche<br />
– <strong>Ein</strong>bindung von CVB<br />
11