20.08.2013 Aufrufe

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“

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!