public void performMatch() { // create feature detectors and feature extractors FeatureDetector orbDetector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor orbExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB); // set the keypoints keyPointImg = new MatOfKeyPoint(); orbDetector.detect(imgGray, keyPointImg); MatOfKeyPoint keyPointTempl = new MatOfKeyPoint(); orbDetector.detect(templGray, keyPointTempl); // get the descriptions descImg = new Mat(image.size(), image.type()); orbExtractor.compute(imgGray, keyPointImg, descImg); Mat descTempl = new Mat(template.size(), template.type()); orbExtractor.compute(templGray, keyPointTempl, descTempl); // perform matching matches = new MatOfDMatch(); DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); matcher.match(descImg, descTempl, matches); Log.i("perform match result", matches.size().toString()); }
private Mat getTestDescriptors(Mat img) { MatOfKeyPoint keypoints = new MatOfKeyPoint(); Mat descriptors = new Mat(); FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST); DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.BRIEF); detector.detect(img, keypoints); extractor.compute(img, keypoints, descriptors); return descriptors; }
public Template performMatches(Map<String, Template> templates) { // create feature detectors and feature extractors FeatureDetector orbDetector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor orbExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB); MatOfKeyPoint keyPointImgT; Mat descImgT; // set the keypoints keyPointImgT = new MatOfKeyPoint(); orbDetector.detect(imgGray, keyPointImgT); descImgT = new Mat(image.size(), image.type()); orbExtractor.compute(imgGray, keyPointImgT, descImgT); Template best = null; matches = null; Map.Entry<String, Template> maxEntry = null; // MatOfDMatch matches = new MatOfDMatch(); for (Map.Entry<String, Template> entry : templates.entrySet()) { MatOfKeyPoint keyPointTempl = null; Mat descTempl = null; Mat tGray = null; Template t = entry.getValue(); if (null == t.getTemplGray() || null == t.getDescTempl() || null == t.getKeyPointTempl()) { // read image from stored data Mat templ = readImgFromFile(t.getTemplName()); tGray = new Mat(templ.size(), templ.type()); Imgproc.cvtColor(templ, tGray, Imgproc.COLOR_BGRA2GRAY); keyPointTempl = new MatOfKeyPoint(); orbDetector.detect(tGray, keyPointTempl); descTempl = new Mat(templ.size(), templ.type()); orbExtractor.compute(tGray, keyPointTempl, descTempl); t.setKeyPointTempl(keyPointTempl); t.setDescTempl(descTempl); } else { descTempl = t.getDescTempl(); } MatOfDMatch matchWithT = new MatOfDMatch(); DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); // matcher.radiusMatch(descImgT, descTempl, matchWithT,200);// matcher.match(descImgT, descTempl, matchWithT); List<DMatch> matchList = matchWithT.toList(); // float min = Float.MAX_VALUE; // float max = Float.MIN_VALUE; // for(int i=0;i<matchList.size();i++){ // min = matchList.get(i).distance<min?matchList.get(i).distance:min; // max = matchList.get(i).distance>max?matchList.get(i).distance:max; // } // Log.i("min distance","min distance is::"+min+"max // distance::"+max+"size::"+matchList.size()); // Collections.sort(matchList, new Comparator<DMatch>() { // @Override // public int compare(DMatch o1, DMatch o2) { // if (o1.distance < o2.distance) // return -1; // if (o1.distance > o2.distance) // return 1; // return 0; // } // }); float ratio = -1; if (matchList.size() > 0) ratio = findMinTwoRatio(matchList); if (ratio > 0.8 || ratio == -1) continue; Log.i("match", "ratio::" + ratio); // Todo:revisit logic if (matches == null || (matchWithT.size().height > matches.size().height)) { matches = matchWithT; keyPointImg = keyPointImgT; descImg = descImgT; best = t; } } // Log.i("perform match result", matches.size().toString()); return best; }
private void detectObject() { readLock.lock(); featureDetector.detect(img_scene, keypoints_scene); featureDetector.detect(img_object, keypoints_object); extractor.compute(img_object, keypoints_object, descriptors_object); extractor.compute(img_scene, keypoints_scene, descriptors_scene); readLock.unlock(); if (!descriptors_scene.empty()) { matcher.match(descriptors_object, descriptors_scene, matches); // readLock.unlock(); // listMatches = matches.toList(); int size = descriptors_object.rows(); // -- Quick calculation of max and min distances between keypoints for (int i = 0; i < size; i++) { double dist = listMatches.get(i).distance; if (dist < min_dist) { min_dist = dist; } } Log.e("Min", min_dist + ""); threeMinDist = 3 * min_dist; listGoodMatches.removeAll(listGoodMatches); for (int i = 0; i < size; i++) { DMatch dMatch = listMatches.get(i); float distance = dMatch.distance; if (distance < threeMinDist) { listGoodMatches.add(dMatch); } } // good_matches.fromList(listGoodMatches); Log.e("Matches", listMatches.size() + ""); Log.e("Good Matches", listGoodMatches.size() + ""); // if (listGoodMatches.size() > 4) { Point pointObj[] = new Point[listGoodMatches.size()]; Point pointScene[] = new Point[listGoodMatches.size()]; listKeyPointObject = keypoints_object.toList(); listKeyPointScene = keypoints_scene.toList(); // listPointScene.removeAll(listPointScene); for (int i = 0; i < listGoodMatches.size(); i++) { // -- Get the keypoints from the good matches pointObj[i] = listKeyPointObject.get(listGoodMatches.get(i).queryIdx).pt; pointScene[i] = listKeyPointScene.get(listGoodMatches.get(i).trainIdx).pt; // listPointScene.add(listKeyPointScene.get(listGoodMatches.get(i).trainIdx).pt); } obj.fromArray(pointObj); scene.fromArray(pointScene); Log.e("Before findHomography", ""); H = Calib3d.findHomography(obj, scene, Calib3d.RANSAC, 9); Log.e("AFTERRR findHomography", ""); pointObjConners[0] = new Point(0, 0); pointObjConners[1] = new Point(img_object.cols(), 0); pointObjConners[2] = new Point(img_object.cols(), img_object.rows()); pointObjConners[3] = new Point(0, img_object.rows()); obj_corners.fromArray(pointObjConners); Core.perspectiveTransform(obj_corners, scene_corners, H); p0 = new Point(scene_corners.toList().get(0).x, scene_corners.toList().get(0).y + 0); p1 = new Point(scene_corners.toList().get(1).x, scene_corners.toList().get(1).y + 0); p2 = new Point(scene_corners.toList().get(2).x, scene_corners.toList().get(2).y + 0); p3 = new Point(scene_corners.toList().get(3).x, scene_corners.toList().get(3).y + 0); Log.e("POINT THREAD", p0.toString() + p1.toString() + p2.toString() + p3.toString()); Log.e("detect ok", "detect ok"); } } else { Log.e("No descritor", "No descritor"); // readLock.unlock(); } }