OpenCV Brisk algorithm working with other templates but not with this one

青春壹個敷衍的年華 提交于 2021-01-29 13:31:27

问题


I've been told that template matching doesn't ignore the background and doesn't use alpha channel information. I decided to try to use BRISK algorithm which has scale invariance and rotation invariance. This is the code I'm using

public boolean runBRISK(String filename1, String filename2)
    {       
        BRISK detectorAndExtractor = BRISK.create();
        
        final MatOfKeyPoint keyPointsLarge = new MatOfKeyPoint();
        final MatOfKeyPoint keyPointsSmall = new MatOfKeyPoint();

        Mat largeImage = Imgcodecs.imread(filename1, Imgcodecs.IMREAD_COLOR);
        Mat smallImage = Imgcodecs.imread(filename2, Imgcodecs.IMREAD_COLOR);
        
        detectorAndExtractor.detect(largeImage, keyPointsLarge);
        detectorAndExtractor.detect(smallImage, keyPointsSmall);

        //System.out.println("keyPoints.size() : "+keyPointsLarge.size());
        //System.out.println("keyPoints2.size() : "+keyPointsSmall.size());

        Mat descriptorsLarge = new Mat();
        Mat descriptorsSmall = new Mat();

        detectorAndExtractor.compute(largeImage, keyPointsLarge, descriptorsLarge);
        detectorAndExtractor.compute(smallImage, keyPointsSmall, descriptorsSmall);

        //System.out.println("descriptorsA.size() : "+descriptorsLarge.size());
        //System.out.println("descriptorsB.size() : "+descriptorsSmall.size());

        MatOfDMatch matches = new MatOfDMatch();

        DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT);
        matcher.match(descriptorsLarge, descriptorsSmall, matches);

        System.out.println("matches.size() : "+matches.size());

        MatOfDMatch matchesFiltered = new MatOfDMatch();

        List<DMatch> matchesList = matches.toList();
        List<DMatch> bestMatches= new ArrayList<DMatch>();

        Double max_dist = 0.0;
        Double min_dist = 100.0;

        for (int i = 0; i < matchesList.size(); i++)
        {
            Double dist = (double) matchesList.get(i).distance;

            if (dist < min_dist && dist != 0)
            {
                min_dist = dist;
            }

            if (dist > max_dist)
            {
                max_dist = dist;
            }

        }

        //System.out.println("max_dist : "+max_dist);
        //System.out.println("min_dist : "+min_dist);

        if(min_dist > 50 )
        {
            //System.out.println("No match found");
            //System.out.println("Just return ");
            return false;
        }

        double threshold = 3 * min_dist;
        double threshold2 = 2 * min_dist;

        if (threshold > 75)
        {
            threshold  = 75;
        }
        else if (threshold2 >= max_dist)
        {
            threshold = min_dist * 1.1;
        }
        else if (threshold >= max_dist)
        {
            threshold = threshold2 * 1.4;
        }

        //System.out.println("Threshold : "+threshold);

        for (int i = 0; i < matchesList.size(); i++)
        {
            Double dist = (double) matchesList.get(i).distance;

            if (dist < threshold)
            {
                bestMatches.add(matches.toList().get(i));
                //System.out.println(String.format(i + " best match added : %s", dist));
            }
        }

        matchesFiltered.fromList(bestMatches);

        System.out.println("matchesFiltered.size() : " + matchesFiltered.size());


        if(matchesFiltered.rows() >= 1) //TODO >= 4
        {
            System.out.println("match found");
            return true;
        }
        else
        {
            return false;
        }
    }

Template Image

Template image

Source Image

Source image

Using other templates, for the most part it gives me correct matches. However using this template gives me always wrong matches.

来源:https://stackoverflow.com/questions/64545829/opencv-brisk-algorithm-working-with-other-templates-but-not-with-this-one

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!