Path: blob/master/modules/features2d/misc/java/test/BruteForceDescriptorMatcherTest.java
16354 views
package org.opencv.test.features2d;12import java.util.ArrayList;3import java.util.Arrays;4import java.util.List;56import org.opencv.core.CvType;7import org.opencv.core.Mat;8import org.opencv.core.MatOfDMatch;9import org.opencv.core.MatOfKeyPoint;10import org.opencv.core.Point;11import org.opencv.core.Scalar;12import org.opencv.core.DMatch;13import org.opencv.features2d.DescriptorMatcher;14import org.opencv.core.KeyPoint;15import org.opencv.test.OpenCVTestCase;16import org.opencv.test.OpenCVTestRunner;17import org.opencv.imgproc.Imgproc;18import org.opencv.features2d.Feature2D;1920public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {2122DescriptorMatcher matcher;23int matSize;24DMatch[] truth;2526private Mat getMaskImg() {27return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {28{29put(0, 0, 1, 1, 1, 1);30}31};32}3334private Mat getQueryDescriptors() {35Mat img = getQueryImg();36MatOfKeyPoint keypoints = new MatOfKeyPoint();37Mat descriptors = new Mat();3839Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);40Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);4142setProperty(detector, "hessianThreshold", "double", 8000);43setProperty(detector, "nOctaves", "int", 3);44setProperty(detector, "nOctaveLayers", "int", 4);45setProperty(detector, "upright", "boolean", false);4647detector.detect(img, keypoints);48extractor.compute(img, keypoints, descriptors);4950return descriptors;51}5253private Mat getQueryImg() {54Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));55Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3);56Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3);5758return cross;59}6061private Mat getTrainDescriptors() {62Mat img = getTrainImg();63MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));64Mat descriptors = new Mat();6566Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);6768extractor.compute(img, keypoints, descriptors);6970return descriptors;71}7273private Mat getTrainImg() {74Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));75Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2);76Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2);7778return cross;79}8081protected void setUp() throws Exception {82super.setUp();83matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);84matSize = 100;8586truth = new DMatch[] {87new DMatch(0, 0, 0, 0.6211397f),88new DMatch(1, 1, 0, 0.9177120f),89new DMatch(2, 1, 0, 0.3112163f),90new DMatch(3, 1, 0, 0.2925074f),91new DMatch(4, 1, 0, 0.9309178f)92};93}9495public void testAdd() {96matcher.add(Arrays.asList(new Mat()));97assertFalse(matcher.empty());98}99100public void testClear() {101matcher.add(Arrays.asList(new Mat()));102103matcher.clear();104105assertTrue(matcher.empty());106}107108public void testClone() {109Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));110Mat truth = train.clone();111matcher.add(Arrays.asList(train));112113DescriptorMatcher cloned = matcher.clone();114115assertNotNull(cloned);116117List<Mat> descriptors = cloned.getTrainDescriptors();118assertEquals(1, descriptors.size());119assertMatEqual(truth, descriptors.get(0));120}121122public void testCloneBoolean() {123matcher.add(Arrays.asList(new Mat()));124125DescriptorMatcher cloned = matcher.clone(true);126127assertNotNull(cloned);128assertTrue(cloned.empty());129}130131public void testCreate() {132assertNotNull(matcher);133}134135public void testEmpty() {136assertTrue(matcher.empty());137}138139public void testGetTrainDescriptors() {140Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));141Mat truth = train.clone();142matcher.add(Arrays.asList(train));143144List<Mat> descriptors = matcher.getTrainDescriptors();145146assertEquals(1, descriptors.size());147assertMatEqual(truth, descriptors.get(0));148}149150public void testIsMaskSupported() {151assertTrue(matcher.isMaskSupported());152}153154public void testKnnMatchMatListOfListOfDMatchInt() {155fail("Not yet implemented");156}157158public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {159fail("Not yet implemented");160}161162public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {163fail("Not yet implemented");164}165166public void testKnnMatchMatMatListOfListOfDMatchInt() {167final int k = 3;168Mat train = getTrainDescriptors();169Mat query = getQueryDescriptors();170List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();171matcher.knnMatch(query, train, matches, k);172/*173Log.d("knnMatch", "train = " + train);174Log.d("knnMatch", "query = " + query);175176matcher.add(train);177matcher.knnMatch(query, matches, k);178*/179assertEquals(query.rows(), matches.size());180for(int i = 0; i<matches.size(); i++)181{182MatOfDMatch vdm = matches.get(i);183//Log.d("knn", "vdm["+i+"]="+vdm.dump());184assertTrue(Math.min(k, train.rows()) >= vdm.total());185for(DMatch dm : vdm.toArray())186{187assertEquals(dm.queryIdx, i);188}189}190}191192public void testKnnMatchMatMatListOfListOfDMatchIntMat() {193fail("Not yet implemented");194}195196public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {197fail("Not yet implemented");198}199200public void testMatchMatListOfDMatch() {201Mat train = getTrainDescriptors();202Mat query = getQueryDescriptors();203MatOfDMatch matches = new MatOfDMatch();204matcher.add(Arrays.asList(train));205206matcher.match(query, matches);207208assertArrayDMatchEquals(truth, matches.toArray(), EPS);209}210211public void testMatchMatListOfDMatchListOfMat() {212Mat train = getTrainDescriptors();213Mat query = getQueryDescriptors();214Mat mask = getMaskImg();215MatOfDMatch matches = new MatOfDMatch();216matcher.add(Arrays.asList(train));217218matcher.match(query, matches, Arrays.asList(mask));219220assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);221}222223public void testMatchMatMatListOfDMatch() {224Mat train = getTrainDescriptors();225Mat query = getQueryDescriptors();226MatOfDMatch matches = new MatOfDMatch();227228matcher.match(query, train, matches);229230assertArrayDMatchEquals(truth, matches.toArray(), EPS);231232// OpenCVTestRunner.Log("matches found: " + matches.size());233// for (DMatch m : matches)234// OpenCVTestRunner.Log(m.toString());235}236237public void testMatchMatMatListOfDMatchMat() {238Mat train = getTrainDescriptors();239Mat query = getQueryDescriptors();240Mat mask = getMaskImg();241MatOfDMatch matches = new MatOfDMatch();242243matcher.match(query, train, matches, mask);244245assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);246}247248public void testRadiusMatchMatListOfListOfDMatchFloat() {249fail("Not yet implemented");250}251252public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {253fail("Not yet implemented");254}255256public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {257fail("Not yet implemented");258}259260public void testRadiusMatchMatMatListOfListOfDMatchFloat() {261fail("Not yet implemented");262}263264public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {265fail("Not yet implemented");266}267268public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {269fail("Not yet implemented");270}271272public void testRead() {273String filename = OpenCVTestRunner.getTempFileName("yml");274writeFile(filename, "%YAML:1.0\n---\n");275276matcher.read(filename);277assertTrue(true);// BruteforceMatcher has no settings278}279280public void testTrain() {281matcher.train();// BruteforceMatcher does not need to train282}283284public void testWrite() {285String filename = OpenCVTestRunner.getTempFileName("yml");286287matcher.write(filename);288289String truth = "%YAML:1.0\n---\n";290assertEquals(truth, readFile(filename));291}292293}294295296