1 package org.opencv.test.features2d;
3 import java.util.Arrays;
6 import org.opencv.core.Core;
7 import org.opencv.core.CvType;
8 import org.opencv.core.Mat;
9 import org.opencv.core.MatOfDMatch;
10 import org.opencv.core.MatOfKeyPoint;
11 import org.opencv.core.Point;
12 import org.opencv.core.Scalar;
13 import org.opencv.core.DMatch;
14 import org.opencv.features2d.DescriptorExtractor;
15 import org.opencv.features2d.DescriptorMatcher;
16 import org.opencv.features2d.FeatureDetector;
17 import org.opencv.test.OpenCVTestCase;
18 import org.opencv.test.OpenCVTestRunner;
19 import org.opencv.imgproc.Imgproc;
21 public class BruteForceHammingLUTDescriptorMatcherTest extends OpenCVTestCase {
23 DescriptorMatcher matcher;
27 private Mat getMaskImg() {
28 return new Mat(4, 4, CvType.CV_8U, new Scalar(0)) {
30 put(0, 0, 1, 1, 1, 1, 1, 1, 1, 1);
35 private Mat getQueryDescriptors() {
36 return getTestDescriptors(getQueryImg());
39 private Mat getQueryImg() {
40 Mat img = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
41 Imgproc.line(img, new Point(40, matSize - 40), new Point(matSize - 50, 50), new Scalar(0), 8);
45 private Mat getTestDescriptors(Mat img) {
46 MatOfKeyPoint keypoints = new MatOfKeyPoint();
47 Mat descriptors = new Mat();
49 FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
50 DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.BRIEF);
52 detector.detect(img, keypoints);
53 extractor.compute(img, keypoints, descriptors);
58 private Mat getTrainDescriptors() {
59 return getTestDescriptors(getTrainImg());
62 private Mat getTrainImg() {
63 Mat img = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
64 Imgproc.line(img, new Point(40, 40), new Point(matSize - 40, matSize - 40), new Scalar(0), 8);
68 protected void setUp() throws Exception {
70 matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT);
73 truth = new DMatch[] {
74 new DMatch(0, 0, 0, 51),
75 new DMatch(1, 2, 0, 42),
76 new DMatch(2, 1, 0, 40),
77 new DMatch(3, 3, 0, 53) };
80 public void testAdd() {
81 matcher.add(Arrays.asList(new Mat()));
82 assertFalse(matcher.empty());
85 public void testClear() {
86 matcher.add(Arrays.asList(new Mat()));
90 assertTrue(matcher.empty());
93 public void testClone() {
94 Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
95 Mat truth = train.clone();
96 matcher.add(Arrays.asList(train));
98 DescriptorMatcher cloned = matcher.clone();
100 assertNotNull(cloned);
102 List<Mat> descriptors = cloned.getTrainDescriptors();
103 assertEquals(1, descriptors.size());
104 assertMatEqual(truth, descriptors.get(0));
107 public void testCloneBoolean() {
108 matcher.add(Arrays.asList(new Mat()));
110 DescriptorMatcher cloned = matcher.clone(true);
112 assertNotNull(cloned);
113 assertTrue(cloned.empty());
116 public void testCreate() {
117 assertNotNull(matcher);
120 public void testEmpty() {
121 assertTrue(matcher.empty());
124 public void testGetTrainDescriptors() {
125 Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
126 Mat truth = train.clone();
127 matcher.add(Arrays.asList(train));
129 List<Mat> descriptors = matcher.getTrainDescriptors();
131 assertEquals(1, descriptors.size());
132 assertMatEqual(truth, descriptors.get(0));
135 public void testIsMaskSupported() {
136 assertTrue(matcher.isMaskSupported());
139 public void testKnnMatchMatListOfListOfDMatchInt() {
140 fail("Not yet implemented");
143 public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {
144 fail("Not yet implemented");
147 public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {
148 fail("Not yet implemented");
151 public void testKnnMatchMatMatListOfListOfDMatchInt() {
152 fail("Not yet implemented");
155 public void testKnnMatchMatMatListOfListOfDMatchIntMat() {
156 fail("Not yet implemented");
159 public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {
160 fail("Not yet implemented");
163 public void testMatchMatListOfDMatch() {
164 Mat train = getTrainDescriptors();
165 Mat query = getQueryDescriptors();
166 MatOfDMatch matches = new MatOfDMatch();
167 matcher.add(Arrays.asList(train));
169 matcher.match(query, matches);
171 assertArrayDMatchEquals(truth, matches.toArray(), EPS);
174 public void testMatchMatListOfDMatchListOfMat() {
175 Mat train = getTrainDescriptors();
176 Mat query = getQueryDescriptors();
177 Mat mask = getMaskImg();
178 MatOfDMatch matches = new MatOfDMatch();
179 matcher.add(Arrays.asList(train));
181 matcher.match(query, matches, Arrays.asList(mask));
183 assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
186 public void testMatchMatMatListOfDMatch() {
187 Mat train = getTrainDescriptors();
188 Mat query = getQueryDescriptors();
189 MatOfDMatch matches = new MatOfDMatch();
191 matcher.match(query, train, matches);
194 OpenCVTestRunner.Log("matches found: " + matches.size());
195 for (DMatch m : matches.toArray())
196 OpenCVTestRunner.Log(m.toString());
199 assertArrayDMatchEquals(truth, matches.toArray(), EPS);
202 public void testMatchMatMatListOfDMatchMat() {
203 Mat train = getTrainDescriptors();
204 Mat query = getQueryDescriptors();
205 Mat mask = getMaskImg();
206 MatOfDMatch matches = new MatOfDMatch();
208 matcher.match(query, train, matches, mask);
210 assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
213 public void testRadiusMatchMatListOfListOfDMatchFloat() {
214 fail("Not yet implemented");
217 public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
218 fail("Not yet implemented");
221 public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {
222 fail("Not yet implemented");
225 public void testRadiusMatchMatMatListOfListOfDMatchFloat() {
226 fail("Not yet implemented");
229 public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {
230 fail("Not yet implemented");
233 public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {
234 fail("Not yet implemented");
237 public void testRead() {
238 String filename = OpenCVTestRunner.getTempFileName("yml");
239 writeFile(filename, "%YAML:1.0\n");
241 matcher.read(filename);
242 assertTrue(true);// BruteforceMatcher has no settings
245 public void testTrain() {
246 matcher.train();// BruteforceMatcher does not need to train
249 public void testWrite() {
250 String filename = OpenCVTestRunner.getTempFileName("yml");
252 matcher.write(filename);
254 String truth = "%YAML:1.0\n";
255 assertEquals(truth, readFile(filename));