3

以下是我使用现有示例编写的小代码,用于比较 2 张图像。要求是检查小图像是否是大图像的一部分。

    String smallUrl = "rsz_our-mobile-planet-us-infographic_infographics_lg_unberela.jpg";
    String largeUrl = "our-mobile-planet-us-infographic_infographics_lg.jpg";

    IplImage image = cvLoadImage(largeUrl,CV_LOAD_IMAGE_UNCHANGED );
    IplImage image2 = cvLoadImage(smallUrl,CV_LOAD_IMAGE_UNCHANGED ); 

    CvMat descriptorsA = new CvMat(null);
    CvMat descriptorsB = new CvMat(null);

    final FastFeatureDetector ffd = new FastFeatureDetector(40, true);
    final KeyPoint keyPoints = new KeyPoint();
    final KeyPoint keyPoints2 = new KeyPoint();

    ffd.detect(image, keyPoints, null);
    ffd.detect(image2, keyPoints2, null);

    System.out.println("keyPoints.size() : "+keyPoints.size());
    System.out.println("keyPoints2.size() : "+keyPoints2.size());
     // BRISK extractor = new  BRISK();
     //BriefDescriptorExtractor extractor = new BriefDescriptorExtractor();
    FREAK extractor = new FREAK();

    extractor.compute(image, keyPoints, descriptorsA);
    extractor.compute(image2, keyPoints2, descriptorsB);

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

    DMatch dmatch = new DMatch();
    //FlannBasedMatcher matcher = new FlannBasedMatcher();
    //DescriptorMatcher matcher = new DescriptorMatcher();

    BFMatcher matcher = new BFMatcher();
    matcher.match(descriptorsA, descriptorsB, dmatch, null);

    System.out.println(dmatch.capacity());

现在调用 match() 方法后,我需要决定小图像是否是大图像的一部分,可能有一些阈值,如 90% 匹配等。

我被困在这一点上,老实说,我不知道继续这样做。我猜想这与 dmatch 对象有关,我还发现还有其他方法,如 knnMatch 和 radiusMatch。但我仍然找不到任何合适的指南。

如果有人可以在这一点上指导我,那将是一个很大的帮助。

4

0 回答 0