Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/features2d/misc/java/test/FlannBasedDescriptorMatcherTest.java
16354 views
1
package org.opencv.test.features2d;
2
3
import java.util.Arrays;
4
import java.util.List;
5
6
import org.opencv.core.CvException;
7
import org.opencv.core.CvType;
8
import org.opencv.core.Mat;
9
import org.opencv.core.MatOfDMatch;
10
import org.opencv.core.MatOfKeyPoint;
11
import org.opencv.core.Point;
12
import org.opencv.core.Scalar;
13
import org.opencv.core.DMatch;
14
import org.opencv.features2d.DescriptorMatcher;
15
import org.opencv.core.KeyPoint;
16
import org.opencv.test.OpenCVTestCase;
17
import org.opencv.test.OpenCVTestRunner;
18
import org.opencv.imgproc.Imgproc;
19
import org.opencv.features2d.Feature2D;
20
21
public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
22
23
static final String xmlParamsDefault = "<?xml version=\"1.0\"?>\n"
24
+ "<opencv_storage>\n"
25
+ "<format>3</format>\n"
26
+ "<indexParams>\n"
27
+ " <_>\n"
28
+ " <name>algorithm</name>\n"
29
+ " <type>9</type>\n" // FLANN_INDEX_TYPE_ALGORITHM
30
+ " <value>1</value></_>\n"
31
+ " <_>\n"
32
+ " <name>trees</name>\n"
33
+ " <type>4</type>\n"
34
+ " <value>4</value></_></indexParams>\n"
35
+ "<searchParams>\n"
36
+ " <_>\n"
37
+ " <name>checks</name>\n"
38
+ " <type>4</type>\n"
39
+ " <value>32</value></_>\n"
40
+ " <_>\n"
41
+ " <name>eps</name>\n"
42
+ " <type>5</type>\n"
43
+ " <value>0.</value></_>\n"
44
+ " <_>\n"
45
+ " <name>sorted</name>\n"
46
+ " <type>8</type>\n" // FLANN_INDEX_TYPE_BOOL
47
+ " <value>1</value></_></searchParams>\n"
48
+ "</opencv_storage>\n";
49
static final String ymlParamsDefault = "%YAML:1.0\n---\n"
50
+ "format: 3\n"
51
+ "indexParams:\n"
52
+ " -\n"
53
+ " name: algorithm\n"
54
+ " type: 9\n" // FLANN_INDEX_TYPE_ALGORITHM
55
+ " value: 1\n"
56
+ " -\n"
57
+ " name: trees\n"
58
+ " type: 4\n"
59
+ " value: 4\n"
60
+ "searchParams:\n"
61
+ " -\n"
62
+ " name: checks\n"
63
+ " type: 4\n"
64
+ " value: 32\n"
65
+ " -\n"
66
+ " name: eps\n"
67
+ " type: 5\n"
68
+ " value: 0.\n"
69
+ " -\n"
70
+ " name: sorted\n"
71
+ " type: 8\n" // FLANN_INDEX_TYPE_BOOL
72
+ " value: 1\n";
73
static final String ymlParamsModified = "%YAML:1.0\n---\n"
74
+ "format: 3\n"
75
+ "indexParams:\n"
76
+ " -\n"
77
+ " name: algorithm\n"
78
+ " type: 9\n" // FLANN_INDEX_TYPE_ALGORITHM
79
+ " value: 6\n"// this line is changed!
80
+ " -\n"
81
+ " name: trees\n"
82
+ " type: 4\n"
83
+ " value: 4\n"
84
+ "searchParams:\n"
85
+ " -\n"
86
+ " name: checks\n"
87
+ " type: 4\n"
88
+ " value: 32\n"
89
+ " -\n"
90
+ " name: eps\n"
91
+ " type: 5\n"
92
+ " value: 4.\n"// this line is changed!
93
+ " -\n"
94
+ " name: sorted\n"
95
+ " type: 8\n" // FLANN_INDEX_TYPE_BOOL
96
+ " value: 1\n";
97
98
DescriptorMatcher matcher;
99
100
int matSize;
101
102
DMatch[] truth;
103
104
private Mat getMaskImg() {
105
return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {
106
{
107
put(0, 0, 1, 1, 1, 1);
108
}
109
};
110
}
111
112
private Mat getQueryDescriptors() {
113
Mat img = getQueryImg();
114
MatOfKeyPoint keypoints = new MatOfKeyPoint();
115
Mat descriptors = new Mat();
116
117
Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
118
Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
119
120
setProperty(detector, "hessianThreshold", "double", 8000);
121
setProperty(detector, "nOctaves", "int", 3);
122
setProperty(detector, "upright", "boolean", false);
123
124
detector.detect(img, keypoints);
125
extractor.compute(img, keypoints, descriptors);
126
127
return descriptors;
128
}
129
130
private Mat getQueryImg() {
131
Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
132
Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3);
133
Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3);
134
135
return cross;
136
}
137
138
private Mat getTrainDescriptors() {
139
Mat img = getTrainImg();
140
MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
141
Mat descriptors = new Mat();
142
143
Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
144
145
extractor.compute(img, keypoints, descriptors);
146
147
return descriptors;
148
}
149
150
private Mat getTrainImg() {
151
Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
152
Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2);
153
Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2);
154
155
return cross;
156
}
157
158
protected void setUp() throws Exception {
159
super.setUp();
160
matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);
161
matSize = 100;
162
truth = new DMatch[] {
163
new DMatch(0, 0, 0, 0.6211397f),
164
new DMatch(1, 1, 0, 0.9177120f),
165
new DMatch(2, 1, 0, 0.3112163f),
166
new DMatch(3, 1, 0, 0.2925075f),
167
new DMatch(4, 1, 0, 0.9309179f)
168
};
169
}
170
171
public void testAdd() {
172
matcher.add(Arrays.asList(new Mat()));
173
assertFalse(matcher.empty());
174
}
175
176
public void testClear() {
177
matcher.add(Arrays.asList(new Mat()));
178
179
matcher.clear();
180
181
assertTrue(matcher.empty());
182
}
183
184
public void testClone() {
185
Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
186
matcher.add(Arrays.asList(train));
187
188
try {
189
matcher.clone();
190
fail("Expected CvException (CV_StsNotImplemented)");
191
} catch (CvException cverr) {
192
// expected
193
}
194
}
195
196
public void testCloneBoolean() {
197
matcher.add(Arrays.asList(new Mat()));
198
199
DescriptorMatcher cloned = matcher.clone(true);
200
201
assertNotNull(cloned);
202
assertTrue(cloned.empty());
203
}
204
205
public void testCreate() {
206
assertNotNull(matcher);
207
}
208
209
public void testEmpty() {
210
assertTrue(matcher.empty());
211
}
212
213
public void testGetTrainDescriptors() {
214
Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
215
Mat truth = train.clone();
216
matcher.add(Arrays.asList(train));
217
218
List<Mat> descriptors = matcher.getTrainDescriptors();
219
220
assertEquals(1, descriptors.size());
221
assertMatEqual(truth, descriptors.get(0));
222
}
223
224
public void testIsMaskSupported() {
225
assertFalse(matcher.isMaskSupported());
226
}
227
228
public void testKnnMatchMatListOfListOfDMatchInt() {
229
fail("Not yet implemented");
230
}
231
232
public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {
233
fail("Not yet implemented");
234
}
235
236
public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {
237
fail("Not yet implemented");
238
}
239
240
public void testKnnMatchMatMatListOfListOfDMatchInt() {
241
fail("Not yet implemented");
242
}
243
244
public void testKnnMatchMatMatListOfListOfDMatchIntMat() {
245
fail("Not yet implemented");
246
}
247
248
public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {
249
fail("Not yet implemented");
250
}
251
252
public void testMatchMatListOfDMatch() {
253
Mat train = getTrainDescriptors();
254
Mat query = getQueryDescriptors();
255
MatOfDMatch matches = new MatOfDMatch();
256
matcher.add(Arrays.asList(train));
257
matcher.train();
258
259
matcher.match(query, matches);
260
261
assertArrayDMatchEquals(truth, matches.toArray(), EPS);
262
}
263
264
public void testMatchMatListOfDMatchListOfMat() {
265
Mat train = getTrainDescriptors();
266
Mat query = getQueryDescriptors();
267
Mat mask = getMaskImg();
268
MatOfDMatch matches = new MatOfDMatch();
269
matcher.add(Arrays.asList(train));
270
matcher.train();
271
272
matcher.match(query, matches, Arrays.asList(mask));
273
274
assertArrayDMatchEquals(truth, matches.toArray(), EPS);
275
}
276
277
public void testMatchMatMatListOfDMatch() {
278
Mat train = getTrainDescriptors();
279
Mat query = getQueryDescriptors();
280
MatOfDMatch matches = new MatOfDMatch();
281
282
matcher.match(query, train, matches);
283
284
assertArrayDMatchEquals(truth, matches.toArray(), EPS);
285
286
// OpenCVTestRunner.Log(matches.toString());
287
// OpenCVTestRunner.Log(matches);
288
}
289
290
public void testMatchMatMatListOfDMatchMat() {
291
Mat train = getTrainDescriptors();
292
Mat query = getQueryDescriptors();
293
Mat mask = getMaskImg();
294
MatOfDMatch matches = new MatOfDMatch();
295
296
matcher.match(query, train, matches, mask);
297
298
assertListDMatchEquals(Arrays.asList(truth), matches.toList(), EPS);
299
}
300
301
public void testRadiusMatchMatListOfListOfDMatchFloat() {
302
fail("Not yet implemented");
303
}
304
305
public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
306
fail("Not yet implemented");
307
}
308
309
public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {
310
fail("Not yet implemented");
311
}
312
313
public void testRadiusMatchMatMatListOfListOfDMatchFloat() {
314
fail("Not yet implemented");
315
}
316
317
public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {
318
fail("Not yet implemented");
319
}
320
321
public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {
322
fail("Not yet implemented");
323
}
324
325
public void testRead() {
326
String filenameR = OpenCVTestRunner.getTempFileName("yml");
327
String filenameW = OpenCVTestRunner.getTempFileName("yml");
328
writeFile(filenameR, ymlParamsModified);
329
330
matcher.read(filenameR);
331
matcher.write(filenameW);
332
333
assertEquals(ymlParamsModified, readFile(filenameW));
334
}
335
336
public void testTrain() {
337
Mat train = getTrainDescriptors();
338
matcher.add(Arrays.asList(train));
339
matcher.train();
340
}
341
342
public void testTrainNoData() {
343
try {
344
matcher.train();
345
fail("Expected CvException - FlannBasedMatcher::train should fail on empty train set");
346
} catch (CvException cverr) {
347
// expected
348
}
349
}
350
351
public void testWrite() {
352
String filename = OpenCVTestRunner.getTempFileName("xml");
353
354
matcher.write(filename);
355
356
assertEquals(xmlParamsDefault, readFile(filename));
357
}
358
359
public void testWriteYml() {
360
String filename = OpenCVTestRunner.getTempFileName("yml");
361
362
matcher.write(filename);
363
364
assertEquals(ymlParamsDefault, readFile(filename));
365
}
366
367
}
368
369