Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Draw Rectangle around objects which not matching

I am using below code snippet to compare two images.After compare, I want to draw rectangle around the object which are not matching.

     int retVal = 0;
     int notMactingCount = 0;
     long startTime = System.currentTimeMillis();

    // Load images to compare
    Mat img1 = Imgcodecs.imread(filename1, Imgcodecs.CV_LOAD_IMAGE_COLOR);
    Mat img2 = Imgcodecs.imread(filename2, Imgcodecs.CV_LOAD_IMAGE_COLOR);
    System.out.println(img1);

    // Declare key point of images
    MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
    MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
    Mat descriptors1 = new Mat();
    Mat descriptors2 = new Mat();

    // Definition of ORB key point detector and descriptor extractors
    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
    DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);

    // Detect key points
    detector.detect(img1, keypoints1);
    detector.detect(img2, keypoints2);

    // Extract descriptors
    extractor.compute(img1, keypoints1, descriptors1);
    extractor.compute(img2, keypoints2, descriptors2);

    // Definition of descriptor matcher
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING ); 

    // Match points of two images
    MatOfDMatch matches = new MatOfDMatch();
    System.out.println("Type of Image1= " + descriptors1.type() + ", Type of Image2= " + descriptors2.type());
    System.out.println("Cols of Image1= " + descriptors1.cols() + ", Cols of Image2= " + descriptors2.cols());
    System.out.println("keypoints1 of Image1= " + keypoints1.cols() + ", keypoints2 of Image2= " + keypoints2.cols());


    // Visualize the matches and save the visualization.

    if (descriptors2.cols() == descriptors1.cols()) {
        matcher.match(descriptors1, descriptors2 ,matches);

        // Check matches of key points
        DMatch[] match = matches.toArray();
        double max_dist = 0; double min_dist = 100;

        for (int i = 0; i < descriptors1.rows(); i++) {
            double dist = match[i].distance;
            if( dist < min_dist ) min_dist = dist;
            if( dist > max_dist ) max_dist = dist;
        }
         System.out.println("max_dist=" + max_dist + ", min_dist=" + min_dist);

        // Extract good images (distances are under 10)
        for (int i = 0; i < descriptors1.rows(); i++) {
            if (match[i].distance <= 10) {
                retVal++;
            }else{
                notMactingCount++;
            }
        }
        System.out.println("matching count=" + retVal+" notMactingCount="+notMactingCount);
    }

Please share code snippet to draw rectangle around the object which are not matching or any link reference