OpenCV image comparison in Android

后端 未结 3 1806
甜味超标
甜味超标 2020-12-01 01:47

[EDIT] I have devised some code for image comparison. The matching part is still a bit flawed and I would love some assitance. The project can be found at - GitHub.

相关标签:
3条回答
  • 2020-12-01 02:06

    You should understand that this is not a simple question and you have different concepts you could follow. I will only point out two solution without source-code.

    1. Histogram comparison: You could convert both images into grey-scale make a histogram in the range of [0,...,255]. Every pixel-value will be counted. Then use both histograms for comparison. If the distribution of pixel-intensities equals or is above some treshold (perhaps 90% of all pixels), you could consider this images as duplicates. BUT: This is one of the simplest solutions and it isn't stable if any picture has an equal distribution.
    2. Interest-Point-Detectors/-Descriptors: Take a look at SIFT/SURF image-detectors and descriptors. A detector will try to determine unique keypoits of intensities in an image. A descriptor will be computed at this location I(x,y). A normal matcher with a bruteforce-approach and euclidean distance can match these images using their descriptors. If an image is a duplicate the rate of given matches should very high. This solution is good to implement and there could be enough tutorials regarding this topic.

    I'll hope this helps. Please ask if you have questions.

    [UPDATE-1] A C++-tutorial: http://morf.lv/modules.php?name=tutorials&lasit=2#.UR-ewKU3vCk

    Some JavaCV-tutorials: http://code.google.com/p/javacv/w/list

    [UPDATE-2] Here is an example with SIFT-Detector and SIFT-Descriptor using default parameters. RANSAC-Threshold for homography is 65, reprojection-error (epsilon) is 10, cross-validation enabled. You could try to count the matched. If the Inliner-Outlier-Ratio is too high you could see this pair as duplicates. Matching img1 and img2 using SIFT-detector and SIFT-descriptor For example: These images produce 180 keypoints in IMG1 and 198 in IMG2. The matched descriptors are 163 of which only 3 are outliers. So this gives a really good ratio which only could mean that these images could be duplicates.

    [UPDATE-3] I don't understand why you can initialize the MatOfKeypoints. I've read the API and there's a public constructor. AND: You can use the Mat of the image you want to analyse. This is very nice. =)

    MatOfKeyPoint reference = new MatOfKeyPoint(matOfReferenceImage);
    

    For Matching use a BRUTEFORCE_SL2 Descriptor-Matcher cause you will need the euclidean distance for SURF or SIFT.

    0 讨论(0)
  • 2020-12-01 02:17

    You can try the following code:

    Mat img1 = Highgui.imread("mnt/sdcard/IMG-20121228.jpg");
    Mat img2 = Highgui.imread("mnt/sdcard/IMG-20121228-1.jpg");
    Mat result = new Mat();
    
    Core.compare(img1,img2,result,Core.CMP_NE);
    
    int val = Core.countNonZero(result);
    
    if(val == 0) {
        //Duplicate Image
    } else {
        //Different Image
    }
    

    Here in the code compare function will compare two images and then if there there is dis similarity between images then then particular matrix value will be 255 and all other values will be zero. Then you can count the number of non-zero values to determine if the images were equal. This would work only for Exactly same images.

    If you want to compare images ignoring the light effects i suggest you to generate the edge image first (Using canny function of OpenCV) and then compare the images.

    Hope this answer helps you!!

    0 讨论(0)
  • 2020-12-01 02:24

    Use cv2.absDiff to compute the difference between the pictures and cv2.sumElems to get the sum of all pixels differences.

    Then invent a threshold by which you judge wether two images are similar or not.

    0 讨论(0)
提交回复
热议问题