[EDIT] Ho creato un codice per il confronto delle immagini. La parte corrispondente è ancora un po 'imperfetta e mi piacerebbe un po' di assenso. Il progetto può essere trovato a - GitHub.Confronto immagini OpenCV in Android
ho questi due immagini Img1 e Img2:
Quando uso il seguente comando in OpenCV
Mat img1 = Highgui.imread("mnt/sdcard/IMG-20121228.jpg");
Mat img2 = Highgui.imread("mnt/sdcard/IMG-20121228-1.jpg");
try{
double l2_norm = Core.norm(img1, img2);
tv.setText(l2_norm+"");
} catch(Exception e) {
//image is not a duplicate
}
ottengo un valore doppio per l2_norm. Questo doppio valore varia per coppie di immagini duplicate. Ma se le immagini sono diverse, viene generata un'eccezione. È così che identifico le immagini duplicate? O c'è un metodo migliore? Ho cercato su Google estesamente e non sono riuscito a trovare una risposta davvero convincente. Vorrei il codice e la spiegazione su come confrontare due immagini e ottenere un valore booleano di true
o false
a seconda delle immagini.
EDIT
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
Ho provato questo, ma la condizione if
è mai soddisfatto. Presumo che ci siano alcune differenze, ma non esiste la funzione compare
per Scalar
. Cosa faccio?
EDIT
try{
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
String b=blah.toString();
String b1=blah1.toString();
System.out.println(b+" "+b1);
double comp=b.compareTo(b1);
tv.setText(""+comp);
}
questo metodo è ancora viziata. Sebbene possa essere utilizzato per confrontare le immagini con una precisione decente, non riesce quando le immagini sono di dimensioni diverse.
Quando le immagini sono di dimensioni diverse e stampare i valori scalari ottengo questo:
[9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]
La variazione tra il secondo e il terzo numero, anche se non molto è piuttosto grande rispetto a quando le immagini della stessa le dimensioni sono confrontate. Il primo numero subisce tuttavia il maggior numero di modifiche.
Quale sarebbe il modo migliore per confrontare i contenuti di due immagini?
[EDIT]
sto usando il codice che ho trovato here.
Quello che non riesco a capire è come inizializzare le variabili MatOfKeyPoint
keypoints
e logoKeypoints
. Ecco il mio frammento di codice:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
//FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
//Imgproc.cvtColor(img1, img1, Imgproc.COLOR_RGBA2RGB);
//Imgproc.cvtColor(img2, img2, Imgproc.COLOR_RGBA2RGB);
DescriptorExtractor SurfExtractor = DescriptorExtractor
.create(DescriptorExtractor.SURF);
//extract keypoints
MatOfKeyPoint keypoints, logoKeypoints;
long time= System.currentTimeMillis();
detector.detect(img1, keypoints);
Log.d("LOG!", "number of query Keypoints= " + keypoints.size());
detector.detect(img2, logoKeypoints);
Log.d("LOG!", "number of logo Keypoints= " + logoKeypoints.size());
Log.d("LOG!", "keypoint calculation time elapsed" + (System.currentTimeMillis() -time));
//Descript keypoints
long time2 = System.currentTimeMillis();
Mat descriptors = new Mat();
Mat logoDescriptors = new Mat();
Log.d("LOG!", "logo type" + img2.type() + " intype" + img1.type());
SurfExtractor.compute(img1, keypoints, descriptors);
SurfExtractor.compute(img2, logoKeypoints, logoDescriptors);
Log.d("LOG!", "Description time elapsed" + (System.currentTimeMillis()- time2));
Io, ovviamente, non posso inizializzare le variabili keypoints
e logoKeypoints
a nulla perchè io ricevo un'eccezione di puntatore nullo allora. Come inizializzarli?
Questo tutorial di OpenCV fornisce alcune informazioni sull'argomento; http://goo.gl/gwN6e. – harism
try-catch è * non * lo stesso di if-else! Se è stata lanciata un'eccezione (blocco catch), qualcosa è andato completamente storto! – sschrass
@SatelliteSD - Lo so. Ecco perché sto chiedendo se c'è un metodo migliore. –