BruteForceHammingDescriptorMatcherTest.java 7.6 KB

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