Digital Signal Processing Reference
In-Depth Information
8 Auffinden von Eckpunkten
c 3
c 1
Abbildung 8.4
Auswahl der starksten Eckpunkte
innerhalb einer bestimmten Um-
gebung. Die ursprungliche Liste
von Eckpunkten ( corners )istnach
corner strength“ q in absteigender
Reihenfolge sortiert, c 0 ist also der
starkste Eckpunkt. Als Erstes wird
c 0 zur neuen Liste goodCorners an-
gefugt und die Eckpunkte c 4 und
c 8 , die sich innerhalb der Distanz
d min von c 0 befinden, werden aus
corners geloscht. In gleicher Weise
wird als nachster Eckpunkt c 1 be-
handelt usw., bis in corners keine
Elemente mehr ubrig sind. Keiner
der verbleibenden Eckpunkte in
goodCorners ist dadurch naher zu
einem anderen Eckpunkt als d min .
c 0
c 1
c 2
c 3
c 4
c 5
c 6
c 7
c 8
c 9
corners
c 6
d min
c 5
c 9
c 0
c 4
c 8
c 0
goodCorners
c 7
c 2
das Bild Q durchlaufen und sobald eine Position als Eckpunkt in Frage
kommt, wird ein neues Corner -Objekt erzeugt und zu cornerList an-
gefugt (Zeile 72). Die Boole'sche Methode isLocalMax( Q, u, v ) , die in
der Klasse HarrisCornerDet definiert ist, stellt fest, ob Q ( u, v )ander
Position u, v ein lokales Maximum aufweist (s. Definition in Anhang 4.1).
Abschließend werden (in Zeile 76) die Eckpunkte in cornerList
durch Aufruf der Methode sort() (eine statische Methode der Klasse
java.util.Collections) nach ihrer Starke sortiert. Um das zu ermoglichen,
muss die Klasse Corner wie erwahnt das Java Comparable -Interface im-
plementieren, also auch eine compareTo() -Methode zur Verfugung stel-
len. Da wir die Eckpunkte in absteigender Reihenfolge nach ihrem jewei-
ligen q -Wert sortieren wollen, definieren wir diese Methode in der Klasse
Corner folgendermaßen:
79 public int compareTo (Object obj) { //in class Corner
80
Corner c2 = (Corner) obj;
if (this.q > c2.q) return -1;
81
if (this.q < c2.q) return 1;
82
else return 0;
83
84 }
Aufraumen
Der abschließende Schritt ist das Beseitigen der schwacheren Eckpunkte
in einem Umkreis bestimmter Große, spezifiziert durch den Radius d min
(Alg. 8.1, Zeile 24-30). Dieser Vorgang ist in Abb. 8.4 skizziert und in der
nachfolgenden Methode cleanupCorners() implementiert. Der bereits
nach q sortierte Vector corners wird zunachst in ein gewohnliches Array
konvertiert (Zeile 90), das dann von Anfang bis Ende durchlaufen wird:
85 Vector<Corner> cleanupCorners(Vector<Corner> corners,
86
double dmin) {
//corners is sorted by q in descending order
87
double dmin2 = dmin*dmin;
88
Corner[] cornerArray = new Corner[corners.size()];
89
cornerArray = corners.toArray(cornerArray);
90
Vector<Corner> goodCorners
91
= new Vector<Corner>(corners.size());
92
Search WWH ::




Custom Search