11

I have to check if two images are similar or not in java using OpenCV, I am using OpenCV for that and using ORB

Here is my main class

System.out.println("Welcome to OpenCV " + Core.VERSION);
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);());
System.out.println(System.getProperty("user.dir"));
File f1 = new File(System.getProperty("user.dir") + "\\test.jpg");
File f2 = new File(System.getProperty("user.dir") + "\\test2.jpg");
MatchingDemo2 m = new MatchingDemo2();
m.mth(f1.getAbsolutePath(), f2.getAbsolutePath());

And here is my MatchingDemo2.java file

public class MatchingDemo2 {

public void mth(String inFile, String templateFile){
        FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
       //Create descriptors

        //first image
       // generate descriptors

        //second image
       // generate descriptors



        System.out.println("size " + matches.size());
        //HOW DO I KNOW IF IMAGES MATCHED OR NOT ????

        //THIS CODE IS FOR CONNECTIONS BUT I AM NOT ABLE TO DO IT
        //feature and connection colors
        Scalar RED = new Scalar(255,0,0);
        Scalar GREEN = new Scalar(0,255,0);
        //output image
        Mat outputImg = new Mat();
        MatOfByte drawnMatches = new MatOfByte();
        //this will draw all matches, works fine
        Features2d.drawMatches(img1, keypoints1, img2, keypoints2, matches, 
                outputImg, GREEN, RED,  drawnMatches, Features2d.NOT_DRAW_SINGLE_POINTS);
        int DIST_LIMIT = 80;
        List<DMatch> matchList = matches.toList();
        List<DMatch> matches_final = new ArrayList<DMatch>();
        for(int i=0; i<matchList.size(); i++){
            if(matchList.get(i).distance <= DIST_LIMIT){
                matches_final.add(matches.toList().get(i));
            } 
        }

        MatOfDMatch matches_final_mat = new MatOfDMatch();
        matches_final_mat.fromList(matches_final);
        for(int i=0; i< matches_final.size(); i++){
            System.out.println("Good Matchs "+ matches_final.get(i));
        }
}
}

But when i check the Good Matchs i get this

 size 1x328
 Good Matchs DMatch [queryIdx=0, trainIdx=93, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=1, trainIdx=173, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=2, trainIdx=92, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=3, trainIdx=80, imgIdx=0, distance=26.0]
 Good Matchs DMatch [queryIdx=5, trainIdx=164, imgIdx=0, distance=40.0]
 Good Matchs DMatch [queryIdx=6, trainIdx=228, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=7, trainIdx=179, imgIdx=0, distance=14.0]
 Good Matchs DMatch [queryIdx=8, trainIdx=78, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=9, trainIdx=166, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=10, trainIdx=74, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=11, trainIdx=245, imgIdx=0, distance=38.0]
 Good Matchs DMatch [queryIdx=12, trainIdx=120, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=13, trainIdx=244, imgIdx=0, distance=41.0]
 Good Matchs DMatch [queryIdx=14, trainIdx=67, imgIdx=0, distance=50.0]
 Good Matchs DMatch [queryIdx=15, trainIdx=185, imgIdx=0, distance=55.0]
 Good Matchs DMatch [queryIdx=16, trainIdx=97, imgIdx=0, distance=21.0]
 Good Matchs DMatch [queryIdx=17, trainIdx=172, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=18, trainIdx=354, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=19, trainIdx=302, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=20, trainIdx=176, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=21, trainIdx=60, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=22, trainIdx=72, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=23, trainIdx=63, imgIdx=0, distance=54.0]
 Good Matchs DMatch [queryIdx=24, trainIdx=176, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=25, trainIdx=49, imgIdx=0, distance=58.0]
 Good Matchs DMatch [queryIdx=26, trainIdx=77, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=27, trainIdx=302, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=28, trainIdx=265, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=29, trainIdx=67, imgIdx=0, distance=49.0]
 Good Matchs DMatch [queryIdx=30, trainIdx=302, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=31, trainIdx=265, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=32, trainIdx=73, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=33, trainIdx=67, imgIdx=0, distance=55.0]
 Good Matchs DMatch [queryIdx=34, trainIdx=283, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=35, trainIdx=145, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=36, trainIdx=71, imgIdx=0, distance=54.0]
 Good Matchs DMatch [queryIdx=37, trainIdx=167, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=38, trainIdx=94, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=39, trainIdx=88, imgIdx=0, distance=68.0]
 Good Matchs DMatch [queryIdx=40, trainIdx=88, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=41, trainIdx=179, imgIdx=0, distance=28.0]
 Good Matchs DMatch [queryIdx=42, trainIdx=64, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=43, trainIdx=223, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=44, trainIdx=80, imgIdx=0, distance=30.0]
 Good Matchs DMatch [queryIdx=45, trainIdx=196, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=46, trainIdx=52, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=47, trainIdx=93, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=48, trainIdx=187, imgIdx=0, distance=49.0]
 Good Matchs DMatch [queryIdx=49, trainIdx=179, imgIdx=0, distance=50.0]
 Good Matchs DMatch [queryIdx=50, trainIdx=283, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=51, trainIdx=171, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=52, trainIdx=302, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=53, trainIdx=67, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=54, trainIdx=15, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=55, trainIdx=173, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=56, trainIdx=302, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=57, trainIdx=47, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=58, trainIdx=187, imgIdx=0, distance=58.0]
 Good Matchs DMatch [queryIdx=59, trainIdx=344, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=60, trainIdx=164, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=61, trainIdx=125, imgIdx=0, distance=50.0]
 Good Matchs DMatch [queryIdx=62, trainIdx=77, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=63, trainIdx=22, imgIdx=0, distance=79.0]
 Good Matchs DMatch [queryIdx=64, trainIdx=82, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=65, trainIdx=93, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=66, trainIdx=241, imgIdx=0, distance=35.0]
 Good Matchs DMatch [queryIdx=67, trainIdx=80, imgIdx=0, distance=18.0]
 Good Matchs DMatch [queryIdx=68, trainIdx=179, imgIdx=0, distance=20.0]
 Good Matchs DMatch [queryIdx=69, trainIdx=242, imgIdx=0, distance=50.0]
 Good Matchs DMatch [queryIdx=70, trainIdx=80, imgIdx=0, distance=22.0]
 Good Matchs DMatch [queryIdx=71, trainIdx=179, imgIdx=0, distance=19.0]
 Good Matchs DMatch [queryIdx=72, trainIdx=92, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=73, trainIdx=94, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=74, trainIdx=173, imgIdx=0, distance=49.0]
 Good Matchs DMatch [queryIdx=75, trainIdx=94, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=76, trainIdx=94, imgIdx=0, distance=48.0]
 Good Matchs DMatch [queryIdx=77, trainIdx=92, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=78, trainIdx=80, imgIdx=0, distance=20.0]
 Good Matchs DMatch [queryIdx=80, trainIdx=119, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=81, trainIdx=228, imgIdx=0, distance=47.0]
 Good Matchs DMatch [queryIdx=82, trainIdx=179, imgIdx=0, distance=14.0]
 Good Matchs DMatch [queryIdx=83, trainIdx=227, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=84, trainIdx=84, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=85, trainIdx=245, imgIdx=0, distance=40.0]
 Good Matchs DMatch [queryIdx=86, trainIdx=58, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=87, trainIdx=14, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=88, trainIdx=187, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=89, trainIdx=185, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=90, trainIdx=178, imgIdx=0, distance=25.0]
 Good Matchs DMatch [queryIdx=91, trainIdx=220, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=92, trainIdx=205, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=93, trainIdx=60, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=94, trainIdx=44, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=95, trainIdx=16, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=96, trainIdx=157, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=97, trainIdx=135, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=98, trainIdx=60, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=99, trainIdx=344, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=100, trainIdx=77, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=101, trainIdx=95, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=102, trainIdx=72, imgIdx=0, distance=45.0]
 Good Matchs DMatch [queryIdx=103, trainIdx=134, imgIdx=0, distance=70.0]
 Good Matchs DMatch [queryIdx=104, trainIdx=154, imgIdx=0, distance=54.0]
 Good Matchs DMatch [queryIdx=105, trainIdx=208, imgIdx=0, distance=77.0]
 Good Matchs DMatch [queryIdx=106, trainIdx=73, imgIdx=0, distance=79.0]
 Good Matchs DMatch [queryIdx=107, trainIdx=72, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=108, trainIdx=64, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=109, trainIdx=72, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=110, trainIdx=365, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=111, trainIdx=148, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=112, trainIdx=81, imgIdx=0, distance=42.0]
 Good Matchs DMatch [queryIdx=113, trainIdx=56, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=114, trainIdx=162, imgIdx=0, distance=48.0]
 Good Matchs DMatch [queryIdx=115, trainIdx=56, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=116, trainIdx=120, imgIdx=0, distance=58.0]
 Good Matchs DMatch [queryIdx=117, trainIdx=72, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=118, trainIdx=92, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=119, trainIdx=131, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=120, trainIdx=72, imgIdx=0, distance=46.0]
 Good Matchs DMatch [queryIdx=121, trainIdx=74, imgIdx=0, distance=78.0]
 Good Matchs DMatch [queryIdx=122, trainIdx=94, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=123, trainIdx=72, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=124, trainIdx=134, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=125, trainIdx=72, imgIdx=0, distance=46.0]
 Good Matchs DMatch [queryIdx=126, trainIdx=15, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=127, trainIdx=72, imgIdx=0, distance=50.0]
 Good Matchs DMatch [queryIdx=128, trainIdx=93, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=129, trainIdx=68, imgIdx=0, distance=46.0]
 Good Matchs DMatch [queryIdx=130, trainIdx=205, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=131, trainIdx=187, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=132, trainIdx=72, imgIdx=0, distance=47.0]
 Good Matchs DMatch [queryIdx=133, trainIdx=220, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=134, trainIdx=289, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=135, trainIdx=82, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=136, trainIdx=93, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=137, trainIdx=244, imgIdx=0, distance=18.0]
 Good Matchs DMatch [queryIdx=138, trainIdx=244, imgIdx=0, distance=25.0]
 Good Matchs DMatch [queryIdx=139, trainIdx=92, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=140, trainIdx=244, imgIdx=0, distance=20.0]
 Good Matchs DMatch [queryIdx=141, trainIdx=93, imgIdx=0, distance=45.0]
 Good Matchs DMatch [queryIdx=142, trainIdx=93, imgIdx=0, distance=51.0]
 Good Matchs DMatch [queryIdx=143, trainIdx=94, imgIdx=0, distance=51.0]
 Good Matchs DMatch [queryIdx=144, trainIdx=94, imgIdx=0, distance=40.0]
 Good Matchs DMatch [queryIdx=145, trainIdx=93, imgIdx=0, distance=47.0]
 Good Matchs DMatch [queryIdx=146, trainIdx=244, imgIdx=0, distance=28.0]
 Good Matchs DMatch [queryIdx=147, trainIdx=172, imgIdx=0, distance=77.0]
 Good Matchs DMatch [queryIdx=148, trainIdx=170, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=149, trainIdx=261, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=150, trainIdx=228, imgIdx=0, distance=55.0]
 Good Matchs DMatch [queryIdx=151, trainIdx=179, imgIdx=0, distance=19.0]
 Good Matchs DMatch [queryIdx=152, trainIdx=227, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=153, trainIdx=107, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=154, trainIdx=174, imgIdx=0, distance=41.0]
 Good Matchs DMatch [queryIdx=155, trainIdx=283, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=156, trainIdx=254, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=157, trainIdx=185, imgIdx=0, distance=51.0]
 Good Matchs DMatch [queryIdx=158, trainIdx=178, imgIdx=0, distance=30.0]
 Good Matchs DMatch [queryIdx=159, trainIdx=278, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=160, trainIdx=91, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=161, trainIdx=148, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=162, trainIdx=157, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=163, trainIdx=373, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=164, trainIdx=226, imgIdx=0, distance=48.0]
 Good Matchs DMatch [queryIdx=165, trainIdx=278, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=166, trainIdx=283, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=167, trainIdx=196, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=168, trainIdx=344, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=169, trainIdx=157, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=170, trainIdx=144, imgIdx=0, distance=79.0]
 Good Matchs DMatch [queryIdx=171, trainIdx=154, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=172, trainIdx=211, imgIdx=0, distance=75.0]
 Good Matchs DMatch [queryIdx=173, trainIdx=279, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=174, trainIdx=211, imgIdx=0, distance=79.0]
 Good Matchs DMatch [queryIdx=175, trainIdx=220, imgIdx=0, distance=68.0]
 Good Matchs DMatch [queryIdx=176, trainIdx=218, imgIdx=0, distance=45.0]
 Good Matchs DMatch [queryIdx=177, trainIdx=289, imgIdx=0, distance=75.0]
 Good Matchs DMatch [queryIdx=178, trainIdx=223, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=179, trainIdx=57, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=180, trainIdx=36, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=181, trainIdx=111, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=182, trainIdx=93, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=183, trainIdx=137, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=184, trainIdx=157, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=185, trainIdx=72, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=186, trainIdx=172, imgIdx=0, distance=47.0]
 Good Matchs DMatch [queryIdx=187, trainIdx=279, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=188, trainIdx=72, imgIdx=0, distance=55.0]
 Good Matchs DMatch [queryIdx=189, trainIdx=96, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=190, trainIdx=220, imgIdx=0, distance=68.0]
 Good Matchs DMatch [queryIdx=191, trainIdx=93, imgIdx=0, distance=48.0]
 Good Matchs DMatch [queryIdx=192, trainIdx=279, imgIdx=0, distance=54.0]
 Good Matchs DMatch [queryIdx=193, trainIdx=157, imgIdx=0, distance=54.0]
 Good Matchs DMatch [queryIdx=194, trainIdx=91, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=195, trainIdx=278, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=196, trainIdx=220, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=197, trainIdx=74, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=198, trainIdx=93, imgIdx=0, distance=34.0]
 Good Matchs DMatch [queryIdx=199, trainIdx=81, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=200, trainIdx=93, imgIdx=0, distance=45.0]
 Good Matchs DMatch [queryIdx=201, trainIdx=90, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=202, trainIdx=93, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=203, trainIdx=94, imgIdx=0, distance=42.0]
 Good Matchs DMatch [queryIdx=204, trainIdx=93, imgIdx=0, distance=35.0]
 Good Matchs DMatch [queryIdx=205, trainIdx=94, imgIdx=0, distance=44.0]
 Good Matchs DMatch [queryIdx=206, trainIdx=90, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=207, trainIdx=179, imgIdx=0, distance=54.0]
 Good Matchs DMatch [queryIdx=208, trainIdx=92, imgIdx=0, distance=48.0]
 Good Matchs DMatch [queryIdx=209, trainIdx=91, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=210, trainIdx=119, imgIdx=0, distance=77.0]
 Good Matchs DMatch [queryIdx=211, trainIdx=227, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=212, trainIdx=186, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=213, trainIdx=96, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=214, trainIdx=77, imgIdx=0, distance=52.0]
 Good Matchs DMatch [queryIdx=215, trainIdx=372, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=216, trainIdx=334, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=217, trainIdx=278, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=218, trainIdx=325, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=219, trainIdx=188, imgIdx=0, distance=60.0]
 Good Matchs DMatch [queryIdx=220, trainIdx=340, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=221, trainIdx=72, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=222, trainIdx=278, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=223, trainIdx=221, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=224, trainIdx=339, imgIdx=0, distance=74.0]
 Good Matchs DMatch [queryIdx=225, trainIdx=155, imgIdx=0, distance=66.0]
 Good Matchs DMatch [queryIdx=226, trainIdx=278, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=227, trainIdx=165, imgIdx=0, distance=78.0]
 Good Matchs DMatch [queryIdx=228, trainIdx=279, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=229, trainIdx=355, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=231, trainIdx=69, imgIdx=0, distance=80.0]
 Good Matchs DMatch [queryIdx=232, trainIdx=278, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=233, trainIdx=65, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=234, trainIdx=93, imgIdx=0, distance=79.0]
 Good Matchs DMatch [queryIdx=235, trainIdx=203, imgIdx=0, distance=78.0]
 Good Matchs DMatch [queryIdx=236, trainIdx=159, imgIdx=0, distance=70.0]
 Good Matchs DMatch [queryIdx=237, trainIdx=93, imgIdx=0, distance=45.0]
 Good Matchs DMatch [queryIdx=238, trainIdx=172, imgIdx=0, distance=58.0]
 Good Matchs DMatch [queryIdx=239, trainIdx=374, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=240, trainIdx=278, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=241, trainIdx=223, imgIdx=0, distance=55.0]
 Good Matchs DMatch [queryIdx=242, trainIdx=365, imgIdx=0, distance=58.0]
 Good Matchs DMatch [queryIdx=243, trainIdx=91, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=244, trainIdx=238, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=245, trainIdx=299, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=246, trainIdx=289, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=247, trainIdx=93, imgIdx=0, distance=41.0]
 Good Matchs DMatch [queryIdx=249, trainIdx=5, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=250, trainIdx=93, imgIdx=0, distance=53.0]
 Good Matchs DMatch [queryIdx=251, trainIdx=93, imgIdx=0, distance=34.0]
 Good Matchs DMatch [queryIdx=252, trainIdx=97, imgIdx=0, distance=34.0]
 Good Matchs DMatch [queryIdx=253, trainIdx=93, imgIdx=0, distance=37.0]
 Good Matchs DMatch [queryIdx=254, trainIdx=174, imgIdx=0, distance=55.0]
 Good Matchs DMatch [queryIdx=255, trainIdx=91, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=256, trainIdx=81, imgIdx=0, distance=59.0]
 Good Matchs DMatch [queryIdx=257, trainIdx=92, imgIdx=0, distance=57.0]
 Good Matchs DMatch [queryIdx=258, trainIdx=212, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=259, trainIdx=119, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=260, trainIdx=228, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=261, trainIdx=119, imgIdx=0, distance=68.0]
 Good Matchs DMatch [queryIdx=263, trainIdx=266, imgIdx=0, distance=74.0]
 Good Matchs DMatch [queryIdx=264, trainIdx=319, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=265, trainIdx=157, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=266, trainIdx=365, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=267, trainIdx=341, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=268, trainIdx=303, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=269, trainIdx=313, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=271, trainIdx=350, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=272, trainIdx=313, imgIdx=0, distance=68.0]
 Good Matchs DMatch [queryIdx=278, trainIdx=267, imgIdx=0, distance=69.0]
 Good Matchs DMatch [queryIdx=280, trainIdx=223, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=281, trainIdx=267, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=283, trainIdx=334, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=284, trainIdx=313, imgIdx=0, distance=63.0]
 Good Matchs DMatch [queryIdx=285, trainIdx=78, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=286, trainIdx=312, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=287, trainIdx=271, imgIdx=0, distance=68.0]
 Good Matchs DMatch [queryIdx=288, trainIdx=170, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=289, trainIdx=278, imgIdx=0, distance=64.0]
 Good Matchs DMatch [queryIdx=290, trainIdx=282, imgIdx=0, distance=70.0]
 Good Matchs DMatch [queryIdx=291, trainIdx=91, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=292, trainIdx=334, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=293, trainIdx=80, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=294, trainIdx=92, imgIdx=0, distance=47.0]
 Good Matchs DMatch [queryIdx=295, trainIdx=301, imgIdx=0, distance=44.0]
 Good Matchs DMatch [queryIdx=297, trainIdx=220, imgIdx=0, distance=78.0]
 Good Matchs DMatch [queryIdx=298, trainIdx=374, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=300, trainIdx=329, imgIdx=0, distance=74.0]
 Good Matchs DMatch [queryIdx=302, trainIdx=285, imgIdx=0, distance=77.0]
 Good Matchs DMatch [queryIdx=305, trainIdx=271, imgIdx=0, distance=80.0]
 Good Matchs DMatch [queryIdx=307, trainIdx=350, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=308, trainIdx=320, imgIdx=0, distance=71.0]
 Good Matchs DMatch [queryIdx=309, trainIdx=163, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=310, trainIdx=170, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=311, trainIdx=357, imgIdx=0, distance=65.0]
 Good Matchs DMatch [queryIdx=312, trainIdx=320, imgIdx=0, distance=62.0]
 Good Matchs DMatch [queryIdx=314, trainIdx=342, imgIdx=0, distance=75.0]
 Good Matchs DMatch [queryIdx=315, trainIdx=162, imgIdx=0, distance=72.0]
 Good Matchs DMatch [queryIdx=316, trainIdx=239, imgIdx=0, distance=74.0]
 Good Matchs DMatch [queryIdx=317, trainIdx=171, imgIdx=0, distance=56.0]
 Good Matchs DMatch [queryIdx=318, trainIdx=244, imgIdx=0, distance=61.0]
 Good Matchs DMatch [queryIdx=319, trainIdx=369, imgIdx=0, distance=77.0]
 Good Matchs DMatch [queryIdx=320, trainIdx=346, imgIdx=0, distance=67.0]
 Good Matchs DMatch [queryIdx=322, trainIdx=158, imgIdx=0, distance=78.0]
 Good Matchs DMatch [queryIdx=325, trainIdx=92, imgIdx=0, distance=73.0]
 Good Matchs DMatch [queryIdx=326, trainIdx=236, imgIdx=0, distance=76.0]
 Good Matchs DMatch [queryIdx=327, trainIdx=162, imgIdx=0, distance=70.0]

The number of matches that i get is same for the same image as well as for different images I am really confused ? Can you one explain how to compare two images and tell if they are similar or not using OpenCV

Here is somewhat that i am trying to achieve

Girish Nair
  • 5,148
  • 5
  • 40
  • 61

2 Answers2

5

Since you are using BRUTEFORCE matcher you will always get best possible matches for all the keypoint descriptors from your query(template) in your train(image that contains query). i.e: BRUTEFORCE matcher will always find 100% matches(best equivalent keypoints for all query keypoint descriptors in train descriptors).

This means you need to filter the matches as correct matches(inliers) and incorrect matches(outliers) matches.

You can do it in two ways

1.Distance calculation

Using distance as mentioned by Andrey Smorodov. You can use this method (But this does not always provide correct results)

List<DMatch> matchesList = matches.toList();
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)
        min_dist = dist;
    if (dist > max_dist)
    max_dist = dist;
}

LinkedList<DMatch> good_matches = new LinkedList<DMatch>();
for (int i = 0; i < matchesList.size(); i++)  {  
    if (matchesList.get(i).distance <= (3 * min_dist)) // change the limit as you desire
    good_matches.addLast(matchesList.get(i));
}

2.Determine Mask

You can use the findHomography to get the mask which lets you find the inliers and outliers clearly(Since it considers into account camera pose perspective it is almost correct)

        LinkedList<Point> objList = new LinkedList<Point>();
        LinkedList<Point> sceneList = new LinkedList<Point>();

        List<KeyPoint> keypoints_RefList = keypointsRef.toList();
        List<KeyPoint> keypoints_List = keypoints.toList();

        for (int i = 0; i < good_matches.size(); i++) {
            objList.addLast(keypoints_RefList.get(good_matches.get(i).queryIdx).pt);
            sceneList.addLast(keypoints_List.get(good_matches.get(i).trainIdx).pt);
        }                 

        MatOfPoint2f obj = new MatOfPoint2f();
        MatOfPoint2f scene = new MatOfPoint2f();

        obj.fromList(objList);  
        scene.fromList(sceneList);  

        Mat mask = new Mat();
        Mat hg = Calib3d.findHomography(obj, scene, 8, 10,  mask);

Now the mask is an optional output in findHomography which is a array of either 1 or 0 value each for every match. The mask value for corresponding match is 1 if it is an inlier and 0 if it is an outlier.

You may use this as a criteria to decide if you have almost 90% of mask to be 1 then you can have the output to be true.

I use it in recognizing specific objects from android java camera frame and got these log results

08-22 01:08:38.929: I/OCVSample::Activity(25799): Keypoints Size: 1x477  KeypointsRef Size : 1x165
08-22 01:08:39.049: I/OCVSample::Activity(25799): descriptor Size: 32x477  descriptorRef Size : 32x165
08-22 01:08:39.129: I/OCVSample::Activity(25799): Matches Size: 1x165
08-22 01:08:39.129: I/OCVSample::Activity(25799): matchesList Size: 165
08-22 01:08:39.139: I/OCVSample::Activity(25799): Max dist : 460.44110107421875   Min dist : 100.0
08-22 01:08:39.139: I/OCVSample::Activity(25799): good matches size: 19
08-22 01:08:39.139: I/OCVSample::Activity(25799): obj size : 1x165
08-22 01:08:39.139: I/OCVSample::Activity(25799): scene size : 1x165
08-22 01:08:40.239: I/OCVSample::Activity(25799): Homography  mask size : 1x165
08-22 01:08:40.239: I/OCVSample::Activity(25799): Homography  mask : [1; 1; 1; 1; 1; 1; 1; 0; 1; 0; 1; 1; 1; 1; 0; 1; 1; 1; 0; 1; 1; 1; 1; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 0; 1; 1; 1; 1; 0; 1; 0; 1; 1; 1; 1; 1; 0; 1; 1; 1; 1; 1; 1; 1; 0; 1; 1; 0; 1; 0; 1; 0; 0; 1; 0; 1; 1; 1; 1; 1; 1; 1; 0; 1; 1; 1; 1; 1; 0; 1; 1; 1; 1; 0; 0; 1; 1; 0; 1; 1; 1; 1; 0; 1; 0; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 0; 1; 1; 1; 1; 0; 0; 0; 1; 0; 1; 1; 1; 1; 0; 0; 1; 1; 1; 1; 1; 0; 1; 0; 1; 1; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 1; 1; 0; 1; 1; 1; 1; 0; 1; 1; 1; 1; 1; 1; 1; 0; 1; 1; 0; 0; 1; 1]

3. Yet another simpler approach would be comparing the histogram of those two images for this you can use compHist(); function of openCV as shown here and also refer openCV documents.

Various methods in compare histogram gives output range from 0 to 1 or higher value, this output depends on similarity between histograms. Careful in some methods 1 is 100% positive match and 0 in some other method. "For chi-square method a low score represents a better match than a high score. A perfect match is 0 and a total mismatch is unbounded (depending on the size of the histogram)."

Remainder:- Two completely different images can have exactly the same histogram value.

Tips:

1.Now regarding knnMatch just use matcher.knnMatch(); and the appropriate datatypes for output.

2.Also in

 matcher.match(query, train, matches);

the query => keypoint descriptors for template-eg. a ball and

the train => keypoint descriptor for image that contains the same ball in it. The no of query descriptor is less than no of train descriptor make sure you get this right.

Now good luck.

Community
  • 1
  • 1
shyamnathan
  • 133
  • 11
  • What is keypointsRef Determine Mask ? Can you upload your project on github ? – Girish Nair Aug 22 '13 at 07:01
  • Also the histogram link that you gave is for not images but Histogram stored in array so i checked http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.html but i have problems in converting the code – Girish Nair Aug 22 '13 at 07:10
  • 1) I have explained it in the tip also **keypointRef is the extracted query keypoints** obtained from object which you want to find in the **keypoints image containing the object called train keypoints** 2) Mask is the optional output in **Calib3d.findHomography();** 3) No need to convert code in android you can use jni wrapper in android NDK. – shyamnathan Aug 22 '13 at 16:49
  • Can you upload your project on github ? – Girish Nair Aug 26 '13 at 06:30
  • I think using the earthmover distance (instead of using an average distance) might be a better distance measure. – Nallath Aug 28 '13 at 08:49
  • Can you please upload whole method(how does you have found matches and how to apply homography as well as perspective transform)... – Mehul Thakkar Jan 08 '14 at 06:55
2

Matcher only search for nearest match of keypoints graph. For measure difference you need use (average) sum (or other metric) of distances.

Andrey Smorodov
  • 10,649
  • 2
  • 35
  • 42
  • Above you have printed "Good Matchs DMatch [queryIdx=29, trainIdx=67, imgIdx=0, distance=49.0]". Get all distances, sum them, devide by their number (compute average) and it will your similarity measure. – Andrey Smorodov Aug 19 '13 at 09:21
  • For same image compared with itself i get 0 as average and for different images i get 50-70 as an average. But it doesn't actually compare the images properly ? what should i do to get a good match(other than using SURF) ? – Girish Nair Aug 19 '13 at 10:51
  • Also how do i draw the bitmap like http://docs.opencv.org/_images/Feature_Homography_Result.jpg for the compared images – Girish Nair Aug 19 '13 at 10:56
  • May be you need something like PSNR? Then take look at http://docs.opencv.org/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.html#videoinputpsnrmssim . Why do you think that average distance you get not relevant difference measure? You can draw overlay as described here: http://stackoverflow.com/questions/18175012/overlay-image-in-opencv – Andrey Smorodov Aug 19 '13 at 10:57
  • How do you do it in java ? – Girish Nair Aug 21 '13 at 12:48