7

opencv で 2 つの画像が似ているか異なっているかを確認したい。

それらが同じ場合 printf("same");

それらが同じでない場合 printf("not same");

opencvでそのための方法や方法はありますか?

4

1 に答える 1

13

それほど簡単な作業ではなく、1 つの if では実行できません。私がお勧めするのは、画像の関心点を一致させることです。基本的に、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 に答える