Java 使用OpenCV计算两幅图像的相似度百分比

Java 使用OpenCV计算两幅图像的相似度百分比,java,opencv,image-processing,Java,Opencv,Image Processing,我可以使用下面显示的代码找到匹配的功能。我想计算两幅图像之间的相似度百分比。我是OpenCV的新手。我们将非常感谢您的任何帮助 FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor extractor = DescriptorExtractor .create(DescriptorExtractor.ORB); det

我可以使用下面显示的代码找到匹配的功能。我想计算两幅图像之间的相似度百分比。我是OpenCV的新手。我们将非常感谢您的任何帮助

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
    DescriptorExtractor extractor = DescriptorExtractor
            .create(DescriptorExtractor.ORB);

    detector.detect(image1, keypoints1);
    detector.detect(image2, keypoints2);

    extractor.compute(image1, keypoints1, descriptors1);
    extractor.compute(image2, keypoints2, descriptors2);

    DescriptorMatcher matcher = DescriptorMatcher
            .create(DescriptorMatcher.BRUTEFORCE_HAMMING);

    MatOfDMatch matches = new MatOfDMatch();
    matcher.match(descriptors1, descriptors2, matches);

是否有其他库可用于相同的目的?

我认为您无法通过使用特征点来计算百分比本身。但你可以计算“相似性分数”

首先,您希望以某种方式过滤掉不好的匹配(我将使用单应变换从几何角度验证匹配)。然后,您可以建立自己的计算“相似性分数”的方法

例如,您可以简单地求和已匹配项之间的汉明距离。也可以使用特征点的位置:假设图像a上的特征点Ai在图像B上有对应的Bi。Ai的坐标是(Xa,Ya),Bi的坐标是(Xb,Yb)。为了使图像相似,您可能希望(Xa,Ya)尽可能接近(Xb,Yb)。然后,分数将类似于:

Score = HammingDist / DistanceBetween(Point(Xa, Ya), Point(Xb, Yb))

当然,您可能希望在
HammingDist
DistanceBetween
上增加权重;你需要进行实验。

我找到了两个库,提供了我想要的。我将评估它们的性能以及与我的代码的兼容性,并选择最好的。

我的回答有帮助吗?你能找到更好的方法吗?我是图像处理的新手,所以理解某些术语需要时间。然而,我需要在探索其他库(如pHash和pdiff)时实现这一点。@SorryBoss:你能告诉我你是如何比较图像的吗?我也在尝试同样的方法,你能给出一些Android的线索或代码吗?我知道那是几年前的事了,但是我可以问一下你解决了你的问题吗?我需要的正是你需要的。你能分享你的进展吗?嘿,ftb,我想不起来我们最终使用了什么,不幸的是,我再也无法访问该代码库了