Path: blob/master/modules/features2d/misc/java/test/BruteForceSL2DescriptorMatcherTest.java
16354 views
package org.opencv.test.features2d;12import java.util.Arrays;3import java.util.List;45import org.opencv.core.CvType;6import org.opencv.core.Mat;7import org.opencv.core.MatOfDMatch;8import org.opencv.core.MatOfKeyPoint;9import org.opencv.core.Point;10import org.opencv.core.Scalar;11import org.opencv.core.DMatch;12import org.opencv.features2d.DescriptorMatcher;13import org.opencv.core.KeyPoint;14import org.opencv.test.OpenCVTestCase;15import org.opencv.test.OpenCVTestRunner;16import org.opencv.imgproc.Imgproc;17import org.opencv.features2d.Feature2D;1819public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase {2021DescriptorMatcher matcher;22int matSize;23DMatch[] truth;2425private Mat getMaskImg() {26return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {27{28put(0, 0, 1, 1, 1, 1);29}30};31}3233/*34private float sqr(float val){35return val * val;36}37*/3839private Mat getQueryDescriptors() {40Mat img = getQueryImg();41MatOfKeyPoint keypoints = new MatOfKeyPoint();42Mat descriptors = new Mat();4344Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);45Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);4647setProperty(detector, "hessianThreshold", "double", 8000);48setProperty(detector, "nOctaves", "int", 3);49setProperty(detector, "nOctaveLayers", "int", 4);50setProperty(detector, "upright", "boolean", false);5152detector.detect(img, keypoints);53extractor.compute(img, keypoints, descriptors);5455return descriptors;56}5758private Mat getQueryImg() {59Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));60Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3);61Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3);6263return cross;64}6566private Mat getTrainDescriptors() {67Mat img = getTrainImg();68MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));69Mat descriptors = new Mat();7071Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);7273extractor.compute(img, keypoints, descriptors);7475return descriptors;76}7778private Mat getTrainImg() {79Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));80Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2);81Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2);8283return cross;84}8586protected void setUp() throws Exception {87super.setUp();88matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);89matSize = 100;9091truth = new DMatch[] {92new DMatch(0, 0, 0, 0.3858146f),93new DMatch(1, 1, 0, 0.8421953f),94new DMatch(2, 1, 0, 0.0968556f),95new DMatch(3, 1, 0, 0.0855606f),96new DMatch(4, 1, 0, 0.8666080f)97};98}99100public void testAdd() {101matcher.add(Arrays.asList(new Mat()));102assertFalse(matcher.empty());103}104105public void testClear() {106matcher.add(Arrays.asList(new Mat()));107108matcher.clear();109110assertTrue(matcher.empty());111}112113public void testClone() {114Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));115Mat truth = train.clone();116matcher.add(Arrays.asList(train));117118DescriptorMatcher cloned = matcher.clone();119120assertNotNull(cloned);121122List<Mat> descriptors = cloned.getTrainDescriptors();123assertEquals(1, descriptors.size());124assertMatEqual(truth, descriptors.get(0));125}126127public void testCloneBoolean() {128matcher.add(Arrays.asList(new Mat()));129130DescriptorMatcher cloned = matcher.clone(true);131132assertNotNull(cloned);133assertTrue(cloned.empty());134}135136public void testCreate() {137assertNotNull(matcher);138}139140public void testEmpty() {141assertTrue(matcher.empty());142}143144public void testGetTrainDescriptors() {145Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));146Mat truth = train.clone();147matcher.add(Arrays.asList(train));148149List<Mat> descriptors = matcher.getTrainDescriptors();150151assertEquals(1, descriptors.size());152assertMatEqual(truth, descriptors.get(0));153}154155public void testIsMaskSupported() {156assertTrue(matcher.isMaskSupported());157}158159public void testKnnMatchMatListOfListOfDMatchInt() {160fail("Not yet implemented");161}162163public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {164fail("Not yet implemented");165}166167public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {168fail("Not yet implemented");169}170171public void testKnnMatchMatMatListOfListOfDMatchInt() {172fail("Not yet implemented");173}174175public void testKnnMatchMatMatListOfListOfDMatchIntMat() {176fail("Not yet implemented");177}178179public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {180fail("Not yet implemented");181}182183public void testMatchMatListOfDMatch() {184Mat train = getTrainDescriptors();185Mat query = getQueryDescriptors();186MatOfDMatch matches = new MatOfDMatch();187matcher.add(Arrays.asList(train));188189matcher.match(query, matches);190OpenCVTestRunner.Log(matches);191OpenCVTestRunner.Log(matches);192OpenCVTestRunner.Log(matches);193194assertArrayDMatchEquals(truth, matches.toArray(), EPS);195}196197public void testMatchMatListOfDMatchListOfMat() {198Mat train = getTrainDescriptors();199Mat query = getQueryDescriptors();200Mat mask = getMaskImg();201MatOfDMatch matches = new MatOfDMatch();202matcher.add(Arrays.asList(train));203204matcher.match(query, matches, Arrays.asList(mask));205206assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);207}208209public void testMatchMatMatListOfDMatch() {210Mat train = getTrainDescriptors();211Mat query = getQueryDescriptors();212MatOfDMatch matches = new MatOfDMatch();213214matcher.match(query, train, matches);215216assertArrayDMatchEquals(truth, matches.toArray(), EPS);217218// OpenCVTestRunner.Log("matches found: " + matches.size());219// for (DMatch m : matches)220// OpenCVTestRunner.Log(m.toString());221}222223public void testMatchMatMatListOfDMatchMat() {224Mat train = getTrainDescriptors();225Mat query = getQueryDescriptors();226Mat mask = getMaskImg();227MatOfDMatch matches = new MatOfDMatch();228229matcher.match(query, train, matches, mask);230231assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);232}233234public void testRadiusMatchMatListOfListOfDMatchFloat() {235fail("Not yet implemented");236}237238public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {239fail("Not yet implemented");240}241242public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {243fail("Not yet implemented");244}245246public void testRadiusMatchMatMatListOfListOfDMatchFloat() {247fail("Not yet implemented");248}249250public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {251fail("Not yet implemented");252}253254public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {255fail("Not yet implemented");256}257258public void testRead() {259String filename = OpenCVTestRunner.getTempFileName("yml");260writeFile(filename, "%YAML:1.0\n---\n");261262matcher.read(filename);263assertTrue(true);// BruteforceMatcher has no settings264}265266public void testTrain() {267matcher.train();// BruteforceMatcher does not need to train268}269270public void testWrite() {271String filename = OpenCVTestRunner.getTempFileName("yml");272273matcher.write(filename);274275String truth = "%YAML:1.0\n---\n";276assertEquals(truth, readFile(filename));277}278279}280281282