diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java index f17711928ad06c2a9c2897735b4bf6c6afa51ed5..44ca89978028074d0e0183a9b581ae5d5acb0a43 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java @@ -66,10 +66,6 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase { detector.read(filename); detector.detect(img, keypoints); - OpenCVTestRunner.Log("points found: " + keypoints.size()); - for (KeyPoint kp : keypoints) - OpenCVTestRunner.Log(kp.toString()); - extractor.compute(img, keypoints, descriptors); return descriptors; diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4287b8e19b368eeba7cb665a74610fe78d3fcc8f --- /dev/null +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java @@ -0,0 +1,217 @@ +package org.opencv.test.features2d; + +import org.opencv.core.Core; +import org.opencv.core.CvType; +import org.opencv.core.Mat; +import org.opencv.core.Point; +import org.opencv.core.Scalar; +import org.opencv.features2d.DMatch; +import org.opencv.features2d.DescriptorExtractor; +import org.opencv.features2d.DescriptorMatcher; +import org.opencv.features2d.FeatureDetector; +import org.opencv.features2d.KeyPoint; +import org.opencv.test.OpenCVTestCase; +import org.opencv.test.OpenCVTestRunner; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase { + + DescriptorMatcher matcher; + int matSize; + DMatch[] truth; + + protected void setUp() throws Exception { + matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_L1); + matSize = 100; + + truth = new DMatch[] { + new DMatch(0, 0, 0, 3.175296f), + new DMatch(1, 1, 0, 3.5954158f), + new DMatch(2, 1, 0, 1.2537984f), + new DMatch(3, 1, 0, 3.5761614f), + new DMatch(4, 1, 0, 1.3250958f) }; + super.setUp(); + } + + private Mat getTrainImg() { + Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255)); + Core.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2); + Core.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2); + + return cross; + } + + private Mat getQueryImg() { + Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255)); + Core.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3); + Core.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3); + + return cross; + } + + private Mat getQueryDescriptors() { + Mat img = getQueryImg(); + List keypoints = new ArrayList(); + Mat descriptors = new Mat(); + + FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF); + DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF); + + String filename = OpenCVTestRunner.getTempFileName("yml"); + writeFile(filename, "%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n"); + detector.read(filename); + + detector.detect(img, keypoints); + extractor.compute(img, keypoints, descriptors); + + return descriptors; + } + + private Mat getTrainDescriptors() { + Mat img = getTrainImg(); + List keypoints = Arrays.asList(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1)); + Mat descriptors = new Mat(); + + DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.SURF); + + extractor.compute(img, keypoints, descriptors); + + return descriptors; + } + + private Mat getMaskImg() { + return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) { + { + put(0,0, 1, 1, 1, 1); + } + }; + } + + public void testAdd() { + matcher.add(Arrays.asList(new Mat())); + assertFalse(matcher.empty()); + } + + public void testClear() { + matcher.add(Arrays.asList(new Mat())); + + matcher.clear(); + + assertTrue(matcher.empty()); + } + + public void testCloneBoolean() { + matcher.add(Arrays.asList(new Mat())); + + DescriptorMatcher cloned = matcher.clone(true); + + assertNotNull(cloned); + assertTrue(cloned.empty()); + } + + public void testClone() { + Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123)); + Mat truth = train.clone(); + matcher.add(Arrays.asList(train)); + + DescriptorMatcher cloned = matcher.clone(); + + assertNotNull(cloned); + + List descriptors = cloned.getTrainDescriptors(); + assertEquals(1, descriptors.size()); + assertMatEqual(truth, descriptors.get(0)); + } + + public void testCreate() { + assertNotNull(matcher); + } + + public void testEmpty() { + assertTrue(matcher.empty()); + } + + public void testGetTrainDescriptors() { + Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123)); + Mat truth = train.clone(); + matcher.add(Arrays.asList(train)); + + List descriptors = matcher.getTrainDescriptors(); + + assertEquals(1, descriptors.size()); + assertMatEqual(truth, descriptors.get(0)); + } + + public void testIsMaskSupported() { + assertTrue(matcher.isMaskSupported()); + } + + public void testMatchMatMatListOfDMatchMat() { + Mat train = getTrainDescriptors(); + Mat query = getQueryDescriptors(); + Mat mask = getMaskImg(); + List matches = new ArrayList(); + + matcher.match(query, train, matches, mask); + + assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS); + } + + public void testMatchMatMatListOfDMatch() { + Mat train = getTrainDescriptors(); + Mat query = getQueryDescriptors(); + List matches = new ArrayList(); + + matcher.match(query, train, matches); + + assertListDMatchEquals(Arrays.asList(truth), matches, EPS); + } + + public void testMatchMatListOfDMatchListOfMat() { + Mat train = getTrainDescriptors(); + Mat query = getQueryDescriptors(); + Mat mask = getMaskImg(); + List matches = new ArrayList(); + matcher.add(Arrays.asList(train)); + + matcher.match(query, matches, Arrays.asList(mask)); + + assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches, EPS); + } + + public void testMatchMatListOfDMatch() { + Mat train = getTrainDescriptors(); + Mat query = getQueryDescriptors(); + List matches = new ArrayList(); + matcher.add(Arrays.asList(train)); + + matcher.match(query, matches); + + assertListDMatchEquals(Arrays.asList(truth), matches, EPS); + } + + public void testRead() { + String filename = OpenCVTestRunner.getTempFileName("yml"); + writeFile(filename, "%YAML:1.0\n"); + + matcher.read(filename); + assertTrue(true);// BruteforceMatcher has no settings + } + + public void testTrain() { + matcher.train();// BruteforceMatcher does not need to train + } + + public void testWrite() { + String filename = OpenCVTestRunner.getTempFileName("yml"); + + matcher.write(filename); + + String truth = "%YAML:1.0\n"; + assertEquals(truth, readFile(filename)); + } + +}