package org.opencv.test.features2d; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfDMatch; import org.opencv.core.MatOfKeyPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.DMatch; import org.opencv.features2d.DescriptorMatcher; import org.opencv.features2d.BFMatcher; import org.opencv.core.KeyPoint; import org.opencv.test.OpenCVTestCase; import org.opencv.test.OpenCVTestRunner; import org.opencv.imgproc.Imgproc; import org.opencv.features2d.Feature2D; public class BruteForceDescriptorMatcherTest extends OpenCVTestCase { DescriptorMatcher matcher; int matSize; DMatch[] truth; private Mat getMaskImg() { return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) { { put(0, 0, 1, 1, 1, 1); } }; } private Mat getQueryDescriptors() { Mat img = getQueryImg(); MatOfKeyPoint keypoints = new MatOfKeyPoint(); Mat descriptors = new Mat(); Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null); Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null); setProperty(detector, "hessianThreshold", "double", 8000); setProperty(detector, "nOctaves", "int", 3); setProperty(detector, "nOctaveLayers", "int", 4); setProperty(detector, "upright", "boolean", false); detector.detect(img, keypoints); extractor.compute(img, keypoints, descriptors); return descriptors; } private Mat getQueryImg() { Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255)); Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3); Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3); return cross; } private Mat getTrainDescriptors() { Mat img = getTrainImg(); MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1)); Mat descriptors = new Mat(); Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null); extractor.compute(img, keypoints, descriptors); return descriptors; } private Mat getTrainImg() { Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255)); Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2); Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2); return cross; } protected void setUp() throws Exception { super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); matSize = 100; truth = new DMatch[] { new DMatch(0, 0, 0, 0.6159003f), new DMatch(1, 1, 0, 0.9177120f), new DMatch(2, 1, 0, 0.3112163f), new DMatch(3, 1, 0, 0.2925074f), new DMatch(4, 1, 0, 0.26520672f) }; } // https://github.com/opencv/opencv/issues/11268 public void testConstructor() { BFMatcher self_created_matcher = new BFMatcher(); Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123)); self_created_matcher.add(Arrays.asList(train)); assertTrue(!self_created_matcher.empty()); } 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 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 testCloneBoolean() { matcher.add(Arrays.asList(new Mat())); DescriptorMatcher cloned = matcher.clone(true); assertNotNull(cloned); assertTrue(cloned.empty()); } 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 testKnnMatchMatListOfListOfDMatchInt() { fail("Not yet implemented"); } public void testKnnMatchMatListOfListOfDMatchIntListOfMat() { fail("Not yet implemented"); } public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() { fail("Not yet implemented"); } public void testKnnMatchMatMatListOfListOfDMatchInt() { final int k = 3; Mat train = getTrainDescriptors(); Mat query = getQueryDescriptors(); List matches = new ArrayList(); matcher.knnMatch(query, train, matches, k); /* Log.d("knnMatch", "train = " + train); Log.d("knnMatch", "query = " + query); matcher.add(train); matcher.knnMatch(query, matches, k); */ assertEquals(query.rows(), matches.size()); for(int i = 0; i