1 package org.opencv.test.features2d;
3 import java.util.Arrays;
6 import org.opencv.core.Core;
7 import org.opencv.core.CvException;
8 import org.opencv.core.CvType;
9 import org.opencv.core.Mat;
10 import org.opencv.core.MatOfDMatch;
11 import org.opencv.core.MatOfKeyPoint;
12 import org.opencv.core.Point;
13 import org.opencv.core.Scalar;
14 import org.opencv.core.DMatch;
15 import org.opencv.features2d.DescriptorExtractor;
16 import org.opencv.features2d.DescriptorMatcher;
17 import org.opencv.features2d.FeatureDetector;
18 import org.opencv.core.KeyPoint;
19 import org.opencv.test.OpenCVTestCase;
20 import org.opencv.test.OpenCVTestRunner;
21 import org.opencv.imgproc.Imgproc;
23 public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase {
25 static final String xmlParamsDefault = "<?xml version=\"1.0\"?>\n"
26 + "<opencv_storage>\n"
29 + " <name>algorithm</name>\n"
30 + " <type>23</type>\n"
31 + " <value>1</value></_>\n"
33 + " <name>trees</name>\n"
35 + " <value>4</value></_></indexParams>\n"
38 + " <name>checks</name>\n"
40 + " <value>32</value></_>\n"
42 + " <name>eps</name>\n"
44 + " <value>0.</value></_>\n"
46 + " <name>sorted</name>\n"
47 + " <type>15</type>\n"
48 + " <value>1</value></_></searchParams>\n"
49 + "</opencv_storage>\n";
50 static final String ymlParamsDefault = "%YAML:1.0\n"
53 + " name: algorithm\n"
73 static final String ymlParamsModified = "%YAML:1.0\n"
76 + " name: algorithm\n"
78 + " value: 6\n"// this line is changed!
91 + " value: 4.\n"// this line is changed!
97 DescriptorMatcher matcher;
103 private Mat getMaskImg() {
104 return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {
106 put(0, 0, 1, 1, 1, 1);
111 private Mat getQueryDescriptors() {
112 Mat img = getQueryImg();
113 MatOfKeyPoint keypoints = new MatOfKeyPoint();
114 Mat descriptors = new Mat();
116 FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
117 DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
119 String filename = OpenCVTestRunner.getTempFileName("yml");
120 writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n");
121 detector.read(filename);
123 detector.detect(img, keypoints);
124 extractor.compute(img, keypoints, descriptors);
129 private Mat getQueryImg() {
130 Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
131 Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3);
132 Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3);
137 private Mat getTrainDescriptors() {
138 Mat img = getTrainImg();
139 MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
140 Mat descriptors = new Mat();
142 DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF);
144 extractor.compute(img, keypoints, descriptors);
149 private Mat getTrainImg() {
150 Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
151 Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2);
152 Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2);
157 protected void setUp() throws Exception {
159 matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);
161 truth = new DMatch[] {
162 new DMatch(0, 0, 0, 0.6211397f),
163 new DMatch(1, 1, 0, 0.9177120f),
164 new DMatch(2, 1, 0, 0.3112163f),
165 new DMatch(3, 1, 0, 0.2925075f),
166 new DMatch(4, 1, 0, 0.9309179f)
170 public void testAdd() {
171 matcher.add(Arrays.asList(new Mat()));
172 assertFalse(matcher.empty());
175 public void testClear() {
176 matcher.add(Arrays.asList(new Mat()));
180 assertTrue(matcher.empty());
183 public void testClone() {
184 Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
185 matcher.add(Arrays.asList(train));
189 fail("Expected CvException (CV_StsNotImplemented)");
190 } catch (CvException cverr) {
195 public void testCloneBoolean() {
196 matcher.add(Arrays.asList(new Mat()));
198 DescriptorMatcher cloned = matcher.clone(true);
200 assertNotNull(cloned);
201 assertTrue(cloned.empty());
204 public void testCreate() {
205 assertNotNull(matcher);
208 public void testEmpty() {
209 assertTrue(matcher.empty());
212 public void testGetTrainDescriptors() {
213 Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
214 Mat truth = train.clone();
215 matcher.add(Arrays.asList(train));
217 List<Mat> descriptors = matcher.getTrainDescriptors();
219 assertEquals(1, descriptors.size());
220 assertMatEqual(truth, descriptors.get(0));
223 public void testIsMaskSupported() {
224 assertFalse(matcher.isMaskSupported());
227 public void testKnnMatchMatListOfListOfDMatchInt() {
228 fail("Not yet implemented");
231 public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {
232 fail("Not yet implemented");
235 public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {
236 fail("Not yet implemented");
239 public void testKnnMatchMatMatListOfListOfDMatchInt() {
240 fail("Not yet implemented");
243 public void testKnnMatchMatMatListOfListOfDMatchIntMat() {
244 fail("Not yet implemented");
247 public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {
248 fail("Not yet implemented");
251 public void testMatchMatListOfDMatch() {
252 Mat train = getTrainDescriptors();
253 Mat query = getQueryDescriptors();
254 MatOfDMatch matches = new MatOfDMatch();
255 matcher.add(Arrays.asList(train));
258 matcher.match(query, matches);
260 assertArrayDMatchEquals(truth, matches.toArray(), EPS);
263 public void testMatchMatListOfDMatchListOfMat() {
264 Mat train = getTrainDescriptors();
265 Mat query = getQueryDescriptors();
266 Mat mask = getMaskImg();
267 MatOfDMatch matches = new MatOfDMatch();
268 matcher.add(Arrays.asList(train));
271 matcher.match(query, matches, Arrays.asList(mask));
273 assertArrayDMatchEquals(truth, matches.toArray(), EPS);
276 public void testMatchMatMatListOfDMatch() {
277 Mat train = getTrainDescriptors();
278 Mat query = getQueryDescriptors();
279 MatOfDMatch matches = new MatOfDMatch();
281 matcher.match(query, train, matches);
283 assertArrayDMatchEquals(truth, matches.toArray(), EPS);
285 // OpenCVTestRunner.Log(matches.toString());
286 // OpenCVTestRunner.Log(matches);
289 public void testMatchMatMatListOfDMatchMat() {
290 Mat train = getTrainDescriptors();
291 Mat query = getQueryDescriptors();
292 Mat mask = getMaskImg();
293 MatOfDMatch matches = new MatOfDMatch();
295 matcher.match(query, train, matches, mask);
297 assertListDMatchEquals(Arrays.asList(truth), matches.toList(), EPS);
300 public void testRadiusMatchMatListOfListOfDMatchFloat() {
301 fail("Not yet implemented");
304 public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
305 fail("Not yet implemented");
308 public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {
309 fail("Not yet implemented");
312 public void testRadiusMatchMatMatListOfListOfDMatchFloat() {
313 fail("Not yet implemented");
316 public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {
317 fail("Not yet implemented");
320 public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {
321 fail("Not yet implemented");
324 public void testRead() {
325 String filenameR = OpenCVTestRunner.getTempFileName("yml");
326 String filenameW = OpenCVTestRunner.getTempFileName("yml");
327 writeFile(filenameR, ymlParamsModified);
329 matcher.read(filenameR);
330 matcher.write(filenameW);
332 assertEquals(ymlParamsModified, readFile(filenameW));
335 public void testTrain() {
336 Mat train = getTrainDescriptors();
337 matcher.add(Arrays.asList(train));
341 public void testTrainNoData() {
344 fail("Expected CvException - FlannBasedMatcher::train should fail on empty train set");
345 } catch (CvException cverr) {
350 public void testWrite() {
351 String filename = OpenCVTestRunner.getTempFileName("xml");
353 matcher.write(filename);
355 assertEquals(xmlParamsDefault, readFile(filename));
358 public void testWriteYml() {
359 String filename = OpenCVTestRunner.getTempFileName("yml");
361 matcher.write(filename);
363 assertEquals(ymlParamsDefault, readFile(filename));