BruteForceL1DescriptorMatcherTest.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package org.opencv.test.features2d;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import org.opencv.core.CvType;
  5. import org.opencv.core.Mat;
  6. import org.opencv.core.MatOfDMatch;
  7. import org.opencv.core.MatOfKeyPoint;
  8. import org.opencv.core.Point;
  9. import org.opencv.core.Scalar;
  10. import org.opencv.core.DMatch;
  11. import org.opencv.features2d.DescriptorMatcher;
  12. import org.opencv.core.KeyPoint;
  13. import org.opencv.test.OpenCVTestCase;
  14. import org.opencv.test.OpenCVTestRunner;
  15. import org.opencv.imgproc.Imgproc;
  16. import org.opencv.features2d.Feature2D;
  17. public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase {
  18. DescriptorMatcher matcher;
  19. int matSize;
  20. DMatch[] truth;
  21. private Mat getMaskImg() {
  22. return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {
  23. {
  24. put(0, 0, 1, 1, 1, 1);
  25. }
  26. };
  27. }
  28. private Mat getQueryDescriptors() {
  29. Mat img = getQueryImg();
  30. MatOfKeyPoint keypoints = new MatOfKeyPoint();
  31. Mat descriptors = new Mat();
  32. Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
  33. Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
  34. setProperty(detector, "extended", "boolean", true);
  35. setProperty(detector, "hessianThreshold", "double", 8000);
  36. setProperty(detector, "nOctaveLayers", "int", 2);
  37. setProperty(detector, "nOctaves", "int", 3);
  38. setProperty(detector, "upright", "boolean", false);
  39. detector.detect(img, keypoints);
  40. extractor.compute(img, keypoints, descriptors);
  41. return descriptors;
  42. }
  43. private Mat getQueryImg() {
  44. Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
  45. Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3);
  46. Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3);
  47. return cross;
  48. }
  49. private Mat getTrainDescriptors() {
  50. Mat img = getTrainImg();
  51. MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
  52. Mat descriptors = new Mat();
  53. Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
  54. extractor.compute(img, keypoints, descriptors);
  55. return descriptors;
  56. }
  57. private Mat getTrainImg() {
  58. Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
  59. Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2);
  60. Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2);
  61. return cross;
  62. }
  63. protected void setUp() throws Exception {
  64. super.setUp();
  65. matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_L1);
  66. matSize = 100;
  67. truth = new DMatch[] {
  68. new DMatch(0, 0, 0, 3.0710702f),
  69. new DMatch(1, 1, 0, 3.562016f),
  70. new DMatch(2, 1, 0, 1.3682679f),
  71. new DMatch(3, 1, 0, 1.3012862f),
  72. new DMatch(4, 1, 0, 1.1852086f)
  73. };
  74. }
  75. public void testAdd() {
  76. matcher.add(Arrays.asList(new Mat()));
  77. assertFalse(matcher.empty());
  78. }
  79. public void testClear() {
  80. matcher.add(Arrays.asList(new Mat()));
  81. matcher.clear();
  82. assertTrue(matcher.empty());
  83. }
  84. public void testClone() {
  85. Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
  86. Mat truth = train.clone();
  87. matcher.add(Arrays.asList(train));
  88. DescriptorMatcher cloned = matcher.clone();
  89. assertNotNull(cloned);
  90. List<Mat> descriptors = cloned.getTrainDescriptors();
  91. assertEquals(1, descriptors.size());
  92. assertMatEqual(truth, descriptors.get(0));
  93. }
  94. public void testCloneBoolean() {
  95. matcher.add(Arrays.asList(new Mat()));
  96. DescriptorMatcher cloned = matcher.clone(true);
  97. assertNotNull(cloned);
  98. assertTrue(cloned.empty());
  99. }
  100. public void testCreate() {
  101. assertNotNull(matcher);
  102. }
  103. public void testEmpty() {
  104. assertTrue(matcher.empty());
  105. }
  106. public void testGetTrainDescriptors() {
  107. Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
  108. Mat truth = train.clone();
  109. matcher.add(Arrays.asList(train));
  110. List<Mat> descriptors = matcher.getTrainDescriptors();
  111. assertEquals(1, descriptors.size());
  112. assertMatEqual(truth, descriptors.get(0));
  113. }
  114. public void testIsMaskSupported() {
  115. assertTrue(matcher.isMaskSupported());
  116. }
  117. public void testKnnMatchMatListOfListOfDMatchInt() {
  118. fail("Not yet implemented");
  119. }
  120. public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {
  121. fail("Not yet implemented");
  122. }
  123. public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {
  124. fail("Not yet implemented");
  125. }
  126. public void testKnnMatchMatMatListOfListOfDMatchInt() {
  127. fail("Not yet implemented");
  128. }
  129. public void testKnnMatchMatMatListOfListOfDMatchIntMat() {
  130. fail("Not yet implemented");
  131. }
  132. public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {
  133. fail("Not yet implemented");
  134. }
  135. public void testMatchMatListOfDMatch() {
  136. Mat train = getTrainDescriptors();
  137. Mat query = getQueryDescriptors();
  138. MatOfDMatch matches = new MatOfDMatch();
  139. matcher.add(Arrays.asList(train));
  140. matcher.match(query, matches);
  141. assertArrayDMatchEquals(truth, matches.toArray(), EPS);
  142. }
  143. public void testMatchMatListOfDMatchListOfMat() {
  144. Mat train = getTrainDescriptors();
  145. Mat query = getQueryDescriptors();
  146. Mat mask = getMaskImg();
  147. MatOfDMatch matches = new MatOfDMatch();
  148. matcher.add(Arrays.asList(train));
  149. matcher.match(query, matches, Arrays.asList(mask));
  150. assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
  151. }
  152. public void testMatchMatMatListOfDMatch() {
  153. Mat train = getTrainDescriptors();
  154. Mat query = getQueryDescriptors();
  155. MatOfDMatch matches = new MatOfDMatch();
  156. matcher.match(query, train, matches);
  157. assertArrayDMatchEquals(truth, matches.toArray(), EPS);
  158. }
  159. public void testMatchMatMatListOfDMatchMat() {
  160. Mat train = getTrainDescriptors();
  161. Mat query = getQueryDescriptors();
  162. Mat mask = getMaskImg();
  163. MatOfDMatch matches = new MatOfDMatch();
  164. matcher.match(query, train, matches, mask);
  165. assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
  166. }
  167. public void testRadiusMatchMatListOfListOfDMatchFloat() {
  168. fail("Not yet implemented");
  169. }
  170. public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
  171. fail("Not yet implemented");
  172. }
  173. public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {
  174. fail("Not yet implemented");
  175. }
  176. public void testRadiusMatchMatMatListOfListOfDMatchFloat() {
  177. fail("Not yet implemented");
  178. }
  179. public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {
  180. fail("Not yet implemented");
  181. }
  182. public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {
  183. fail("Not yet implemented");
  184. }
  185. public void testRead() {
  186. String filename = OpenCVTestRunner.getTempFileName("yml");
  187. writeFile(filename, "%YAML:1.0\n---\n");
  188. matcher.read(filename);
  189. assertTrue(true);// BruteforceMatcher has no settings
  190. }
  191. public void testTrain() {
  192. matcher.train();// BruteforceMatcher does not need to train
  193. }
  194. public void testWrite() {
  195. String filename = OpenCVTestRunner.getTempFileName("yml");
  196. matcher.write(filename);
  197. String truth = "%YAML:1.0\n---\n";
  198. assertEquals(truth, readFile(filename));
  199. }
  200. }