[EDIT] Ich habe einige Code für den Bildvergleich entwickelt. Der passende Teil ist immer noch ein bisschen fehlerhaft und ich würde etwas Hilfe mögen. Das Projekt finden Sie unter - GitHub.OpenCV Bildvergleich in Android
Ich habe diese beiden Bilder Img1 und Img2:
Wenn ich den folgenden Befehl in OpenCV verwenden
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
}
ich einen doppelten Wert für l2_norm bekommen. Dieser doppelte Wert variiert für doppelte Bildpaare. Wenn die Bilder jedoch unterschiedlich sind, wird eine Ausnahme ausgelöst. Identifiziere ich so doppelte Bilder? Oder gibt es eine bessere Methode? Ich habe ausgiebig gegoogelt und konnte keine wirklich überzeugende Antwort finden. Ich möchte den Code und die Erklärung, wie ich zwei Bilder vergleichen würde und einen booleschen Wert von true
oder false
abhängig von den Bildern erhalten.
EDIT
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
Ich habe dies versucht, aber die if
Zustand ist nie zufrieden. Ich nehme an, es gibt ein paar Unterschiede, aber es gibt keine compare
Funktion für Scalar
. Was mache ich?
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);
}
Diese Methode fehlerhaft ist wieder. Obwohl es verwendet werden kann, um Bilder mit einer angemessenen Genauigkeit zu vergleichen, schlägt es fehl, wenn Bilder von unterschiedlicher Größe sind.
Wenn Bilder in verschiedenen Größen sind und ich drucke die skalare Werte ich dieses:
[9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]
Die Variation zwischen der zweiten und dritten Zahlen, obwohl nicht viel ist recht groß im Vergleich zu, wenn die Bilder der gleichen Größe wird verglichen. Die erste Nummer leidet jedoch am meisten.
Was wäre der schnellste Weg, um den Inhalt von zwei Bildern zu vergleichen?
[EDIT]
Ich verwende den Code, den ich here gefunden.
Was ich nicht herausfinden kann, ist, wie die MatOfKeyPoint
Variablen keypoints
und logoKeypoints
initialisiert werden. Hier ist mein Code-Schnipsel:
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));
Ich kann natürlich nicht die Variablen initialisieren keypoints
und logoKeypoints
auf null Cuz ich dann eine Null-Zeiger Ausnahme erhalten werden. Wie initialisiere ich sie?
Dieses OpenCV-Tutorial bietet hoffentlich einige Informationen zum Thema; http://goo.gl/gwN6e. – harism
try-catch ist * nicht * das selbe wie wenn-sonst! Wenn eine Ausnahme ausgelöst wurde (Catch-Block), ist etwas völlig falsch gelaufen! – sschrass
@SatelliteSD - das weiß ich. Deshalb frage ich, ob es eine bessere Methode gibt. –