7

我想用opencv检查两个图像是否相似或不同。

如果它们相同 printf("same");

如果它们不相同 printf("not same");

在opencv中有什么方法或方法吗?

4

1 回答 1

13

这不是一件容易的事,而且是不可能做到的。我推荐的是匹配图像的兴趣点。基本上,您可以使用 opencv 库来识别图像上的兴趣点并执行它们的匹配。如果匹配的百分比足够高,则可以得出图像相同的结论。在大多数情况下,此百分比取决于您要匹配的图像类型。这意味着您需要调整接受百分比的值。

要执行指纹匹配,您可以使用 ORB、FREAK、BRISK、SURF 算法。但我建议你使用 ORB。您可以在此处阅读有关此内容的更多信息。

以下是一些提示如何使用 OpenCV for Java 进行操作:

//Load images to compare
Mat img1 = Highgui.imread(filename1, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat img2 = Highgui.imread(filename1, Highgui.CV_LOAD_IMAGE_GRAYSCALE);

MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
Mat descriptors1 = new Mat();
Mat descriptors2 = new Mat();

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

//Detect keypoints
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();
matcher.match(descriptors1,descriptors2 ,matches);

请注意,它是一个非常基本的图像匹配器。如何让它变得更好你应该根据你想要匹配的图像来调查它。还可以查看 Good Matches 方法,您可以在此处找到该方法。

于 2013-03-22T15:35:16.997 回答