BruteForceDescriptorMatcherTest.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  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.BFMatcher;
  14. import org.opencv.core.KeyPoint;
  15. import org.opencv.test.OpenCVTestCase;
  16. import org.opencv.test.OpenCVTestRunner;
  17. import org.opencv.imgproc.Imgproc;
  18. import org.opencv.features2d.Feature2D;
  19. public class BruteForceDescriptorMatcherTest extends OpenCVTestCase {
  20. DescriptorMatcher matcher;
  21. int matSize;
  22. DMatch[] truth;
  23. private Mat getMaskImg() {
  24. return new Mat(5, 2, CvType.CV_8U, new Scalar(0)) {
  25. {
  26. put(0, 0, 1, 1, 1, 1);
  27. }
  28. };
  29. }
  30. private Mat getQueryDescriptors() {
  31. Mat img = getQueryImg();
  32. MatOfKeyPoint keypoints = new MatOfKeyPoint();
  33. Mat descriptors = new Mat();
  34. Feature2D detector = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
  35. Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
  36. setProperty(detector, "hessianThreshold", "double", 8000);
  37. setProperty(detector, "nOctaves", "int", 3);
  38. setProperty(detector, "nOctaveLayers", "int", 4);
  39. setProperty(detector, "upright", "boolean", false);
  40. detector.detect(img, keypoints);
  41. extractor.compute(img, keypoints, descriptors);
  42. return descriptors;
  43. }
  44. private Mat getQueryImg() {
  45. Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
  46. Imgproc.line(cross, new Point(30, matSize / 2), new Point(matSize - 31, matSize / 2), new Scalar(100), 3);
  47. Imgproc.line(cross, new Point(matSize / 2, 30), new Point(matSize / 2, matSize - 31), new Scalar(100), 3);
  48. return cross;
  49. }
  50. private Mat getTrainDescriptors() {
  51. Mat img = getTrainImg();
  52. MatOfKeyPoint keypoints = new MatOfKeyPoint(new KeyPoint(50, 50, 16, 0, 20000, 1, -1), new KeyPoint(42, 42, 16, 160, 10000, 1, -1));
  53. Mat descriptors = new Mat();
  54. Feature2D extractor = createClassInstance(XFEATURES2D+"SURF", DEFAULT_FACTORY, null, null);
  55. extractor.compute(img, keypoints, descriptors);
  56. return descriptors;
  57. }
  58. private Mat getTrainImg() {
  59. Mat cross = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255));
  60. Imgproc.line(cross, new Point(20, matSize / 2), new Point(matSize - 21, matSize / 2), new Scalar(100), 2);
  61. Imgproc.line(cross, new Point(matSize / 2, 20), new Point(matSize / 2, matSize - 21), new Scalar(100), 2);
  62. return cross;
  63. }
  64. protected void setUp() throws Exception {
  65. super.setUp();
  66. matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
  67. matSize = 100;
  68. truth = new DMatch[] {
  69. new DMatch(0, 0, 0, 0.6159003f),
  70. new DMatch(1, 1, 0, 0.9177120f),
  71. new DMatch(2, 1, 0, 0.3112163f),
  72. new DMatch(3, 1, 0, 0.2925074f),
  73. new DMatch(4, 1, 0, 0.26520672f)
  74. };
  75. }
  76. // https://github.com/opencv/opencv/issues/11268
  77. public void testConstructor()
  78. {
  79. BFMatcher self_created_matcher = new BFMatcher();
  80. Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
  81. self_created_matcher.add(Arrays.asList(train));
  82. assertTrue(!self_created_matcher.empty());
  83. }
  84. public void testAdd() {
  85. matcher.add(Arrays.asList(new Mat()));
  86. assertFalse(matcher.empty());
  87. }
  88. public void testClear() {
  89. matcher.add(Arrays.asList(new Mat()));
  90. matcher.clear();
  91. assertTrue(matcher.empty());
  92. }
  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));
  97. DescriptorMatcher cloned = matcher.clone();
  98. assertNotNull(cloned);
  99. List<Mat> descriptors = cloned.getTrainDescriptors();
  100. assertEquals(1, descriptors.size());
  101. assertMatEqual(truth, descriptors.get(0));
  102. }
  103. public void testCloneBoolean() {
  104. matcher.add(Arrays.asList(new Mat()));
  105. DescriptorMatcher cloned = matcher.clone(true);
  106. assertNotNull(cloned);
  107. assertTrue(cloned.empty());
  108. }
  109. public void testCreate() {
  110. assertNotNull(matcher);
  111. }
  112. public void testEmpty() {
  113. assertTrue(matcher.empty());
  114. }
  115. public void testGetTrainDescriptors() {
  116. Mat train = new Mat(1, 1, CvType.CV_8U, new Scalar(123));
  117. Mat truth = train.clone();
  118. matcher.add(Arrays.asList(train));
  119. List<Mat> descriptors = matcher.getTrainDescriptors();
  120. assertEquals(1, descriptors.size());
  121. assertMatEqual(truth, descriptors.get(0));
  122. }
  123. public void testIsMaskSupported() {
  124. assertTrue(matcher.isMaskSupported());
  125. }
  126. public void testKnnMatchMatListOfListOfDMatchInt() {
  127. fail("Not yet implemented");
  128. }
  129. public void testKnnMatchMatListOfListOfDMatchIntListOfMat() {
  130. fail("Not yet implemented");
  131. }
  132. public void testKnnMatchMatListOfListOfDMatchIntListOfMatBoolean() {
  133. fail("Not yet implemented");
  134. }
  135. public void testKnnMatchMatMatListOfListOfDMatchInt() {
  136. final int k = 3;
  137. Mat train = getTrainDescriptors();
  138. Mat query = getQueryDescriptors();
  139. List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();
  140. matcher.knnMatch(query, train, matches, k);
  141. /*
  142. Log.d("knnMatch", "train = " + train);
  143. Log.d("knnMatch", "query = " + query);
  144. matcher.add(train);
  145. matcher.knnMatch(query, matches, k);
  146. */
  147. assertEquals(query.rows(), matches.size());
  148. for(int i = 0; i<matches.size(); i++)
  149. {
  150. MatOfDMatch vdm = matches.get(i);
  151. //Log.d("knn", "vdm["+i+"]="+vdm.dump());
  152. assertTrue(Math.min(k, train.rows()) >= vdm.total());
  153. for(DMatch dm : vdm.toArray())
  154. {
  155. assertEquals(dm.queryIdx, i);
  156. }
  157. }
  158. }
  159. public void testKnnMatchMatMatListOfListOfDMatchIntMat() {
  160. fail("Not yet implemented");
  161. }
  162. public void testKnnMatchMatMatListOfListOfDMatchIntMatBoolean() {
  163. fail("Not yet implemented");
  164. }
  165. public void testMatchMatListOfDMatch() {
  166. Mat train = getTrainDescriptors();
  167. Mat query = getQueryDescriptors();
  168. MatOfDMatch matches = new MatOfDMatch();
  169. matcher.add(Arrays.asList(train));
  170. matcher.match(query, matches);
  171. assertArrayDMatchEquals(truth, matches.toArray(), EPS);
  172. }
  173. public void testMatchMatListOfDMatchListOfMat() {
  174. Mat train = getTrainDescriptors();
  175. Mat query = getQueryDescriptors();
  176. Mat mask = getMaskImg();
  177. MatOfDMatch matches = new MatOfDMatch();
  178. matcher.add(Arrays.asList(train));
  179. matcher.match(query, matches, Arrays.asList(mask));
  180. assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
  181. }
  182. public void testMatchMatMatListOfDMatch() {
  183. Mat train = getTrainDescriptors();
  184. Mat query = getQueryDescriptors();
  185. MatOfDMatch matches = new MatOfDMatch();
  186. matcher.match(query, train, matches);
  187. assertArrayDMatchEquals(truth, matches.toArray(), EPS);
  188. // OpenCVTestRunner.Log("matches found: " + matches.size());
  189. // for (DMatch m : matches)
  190. // OpenCVTestRunner.Log(m.toString());
  191. }
  192. public void testMatchMatMatListOfDMatchMat() {
  193. Mat train = getTrainDescriptors();
  194. Mat query = getQueryDescriptors();
  195. Mat mask = getMaskImg();
  196. MatOfDMatch matches = new MatOfDMatch();
  197. matcher.match(query, train, matches, mask);
  198. assertListDMatchEquals(Arrays.asList(truth[0], truth[1]), matches.toList(), EPS);
  199. }
  200. public void testRadiusMatchMatListOfListOfDMatchFloat() {
  201. fail("Not yet implemented");
  202. }
  203. public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
  204. fail("Not yet implemented");
  205. }
  206. public void testRadiusMatchMatListOfListOfDMatchFloatListOfMatBoolean() {
  207. fail("Not yet implemented");
  208. }
  209. public void testRadiusMatchMatMatListOfListOfDMatchFloat() {
  210. fail("Not yet implemented");
  211. }
  212. public void testRadiusMatchMatMatListOfListOfDMatchFloatMat() {
  213. fail("Not yet implemented");
  214. }
  215. public void testRadiusMatchMatMatListOfListOfDMatchFloatMatBoolean() {
  216. fail("Not yet implemented");
  217. }
  218. public void testRead() {
  219. String filename = OpenCVTestRunner.getTempFileName("yml");
  220. writeFile(filename, "%YAML:1.0\n---\n");
  221. matcher.read(filename);
  222. assertTrue(true);// BruteforceMatcher has no settings
  223. }
  224. public void testTrain() {
  225. matcher.train();// BruteforceMatcher does not need to train
  226. }
  227. public void testWrite() {
  228. String filename = OpenCVTestRunner.getTempFileName("yml");
  229. matcher.write(filename);
  230. String truth = "%YAML:1.0\n---\n";
  231. assertEquals(truth, readFile(filename));
  232. }
  233. }