opencv で 2 つの画像が似ているか異なっているかを確認したい。
それらが同じ場合 printf("same");
それらが同じでない場合 printf("not same");
opencvでそのための方法や方法はありますか?
それほど簡単な作業ではなく、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 メソッドも見てください。