BruteForceSL2DescriptorMatcherTest.java 8.3 KB

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