Sto cercando di confrontare due immagini (determinare se sono simili o meno) utilizzando la libreria OpenCV. Ho configurato il wrapper java e ho trovato diversi tutorial (principalmente in C/C++) che sto cercando di riscrivere in Java. Sto usando l'approccio di rilevamento delle funzionalità.Confronto di due immagini con OpenCV in Java
Il problema è che l'algoritmo che attualmente ho non produce risultati ragionevoli (afferma che due immagini simili non hanno nulla in comune e trova corrispondenze tra altre due immagini che sono completamente diverse). Qualcuno potrebbe suggerire come dovrei usare il matcher openCV per produrre risultati ragionevoli?
Questo è il mio codice per il confronto delle immagini
private static void compareImages(String path1, String path2) {
System.out.println(path1 + "-" + path2);
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
// first image
Mat img1 = Imgcodecs.imread(path1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Mat descriptors1 = new Mat();
MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
detector.detect(img1, keypoints1);
descriptor.compute(img1, keypoints1, descriptors1);
// second image
Mat img2 = Imgcodecs.imread(path2, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Mat descriptors2 = new Mat();
MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
detector.detect(img2, keypoints2);
descriptor.compute(img2, keypoints2, descriptors2);
// match these two keypoints sets
MatOfDMatch matches = new MatOfDMatch();
matcher.match(descriptors1, descriptors2, matches);
for (DMatch m : matches.toArray()) {
// how to use these values to detect the similarity? They seem to be way off
// all of these values are in range 50-80 which seems wrong to me
System.out.println(m.distance);
}
}
Purtroppo, algoritmi come SURF e SIFT non sono disponibili nella confezione java così sto usando ORB. Ho poca o nessuna esperienza con la visione artificiale, sto solo cercando di far funzionare questo semplice algoritmo di confronto per produrre risultati ragionevoli. Sarei felice per qualsiasi aiuto!
MODIFICA: Il mio caso d'uso sta eseguendo questo algoritmo contro le immagini prese da diverse angolazioni. Ho aggiornato il mio codice per essere formattato meglio.
immagini di esempio per confrontare:
[potrebbero essere utili] (http://stackoverflow.com/questions/15544158/error-matching-with-orb-in- android) – GPPK
L'algoritmo nel collegamento sembra essere esattamente lo stesso di quello che ho qui ... produce ancora risultati molto scarsi. Vorrei solo caricare due immagini e produrre una sorta di valore che indichi la loro somiglianza – Smajl
solo una nota: ho provato a ricamare due immagini con la classe 'cv :: Stitcher' che utilizza internamente' xfeatures2d :: SURF' e la stitting non è riuscita. Penso che questo significhi che è difficile identificare la sfumatura delle immagini di SURF – sturkmen