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