@@ -87,6 +87,7 @@ function match_keypoints(keypoints_1::Keypoints, keypoints_2::Keypoints, desc_1,
87
87
s_key = keypoints_1
88
88
l_key = keypoints_2
89
89
order = false
90
+
90
91
if length (desc_1) > length (desc_2)
91
92
smaller = desc_2
92
93
larger = desc_1
@@ -97,38 +98,41 @@ function match_keypoints(keypoints_1::Keypoints, keypoints_2::Keypoints, desc_1,
97
98
98
99
matches = Keypoints[]
99
100
100
- ndims= length (larger[1 ])
101
- n_large= length (larger)
102
- n_small= length (smaller)
103
-
104
- data= Matrix {Float64} (ndims, n_large);
105
- for i in 1 : ndims
106
- for j in 1 : n_large
107
- data[i,j]= larger[j][i]?1 : 0
108
- end
109
- end
110
-
111
101
if is_windows () && Sys. WORD_SIZE== 32
112
- tree = KDTree (data, Cityblock ())
113
-
114
- for i in 1 : n_small
115
- idx, dist = NearestNeighbors. knn (tree, smaller[i], 1 )
116
- if dist[1 ]/ ndims < threshold
117
- id_min = idx[1 ]
102
+ hamming_distances = [hamming_distance (s, l) for s in smaller, l in larger]
103
+ for i in 1 : length (smaller)
104
+ if any (hamming_distances[i, :] .< threshold)
105
+ id_min = indmin (hamming_distances[i, :])
118
106
push! (matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]])
107
+ hamming_distances[:, id_min] = 1.0
119
108
end
120
- end
109
+ end
121
110
else
122
- tree = flann (data, FLANNParameters (), Cityblock ())
111
+ ndims= length (larger[1 ])
112
+ n_large= length (larger)
113
+ n_small= length (smaller)
114
+ data= Matrix {Float64} (ndims, n_large);
115
+ for i in 1 : ndims
116
+ for j in 1 : n_large
117
+ data[i,j]= larger[j][i]?1 : 0
118
+ end
119
+ end
123
120
121
+ tree = flann (data, FLANNParameters (), Cityblock ())
122
+ matched = zeros (Bool, n_large)
124
123
for i in 1 : n_small
125
- idx, dist = FLANN. knn (tree, Vector {Float64} (smaller[i]), 1 )
126
- if dist[1 ]/ ndims < threshold
127
- id_min = idx[1 ]
128
- push! (matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]])
124
+ idx = inrange (tree, Vector {Float64} (smaller[i]), 0.1 )
125
+ for j in idx[1 ]
126
+ if ! matched[j]
127
+ id_min = j
128
+ push! (matches, order ? [l_key[id_min], s_key[i]] : [s_key[i], l_key[id_min]])
129
+ matched[j] = true
130
+ break
131
+ end
129
132
end
130
133
end
131
134
end
135
+
132
136
matches
133
137
end
134
138
0 commit comments