OpenCV Bildvergleich in Android
[BEARBEITEN]
Ich haben dazu einige code-für-Bild-Vergleich. Das passende Teil ist noch etwas fehlerhaft und ich würde gerne etwas Hilfe. Das Projekt finden Sie unter - GitHub.
Habe ich diese beiden Bilder Img1 und Img2:
Wenn ich den folgenden Befehl 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
}
Bekomme ich einen double-Wert für l2_norm. Dieser double-Wert variiert für die duplizieren-Bild-Paare. Aber wenn die Bilder unterschiedlich sind, dann wird eine Ausnahme geworfen. Ist dies, wie ich identifizieren doppelte Bilder? Oder gibt es eine bessere Methode? Ich habe ausgiebig Gegoogelt und konnte nicht finden, eine wirklich überzeugende Antwort. Ich möchte den code und die Erklärung, wie ich aus vergleichen Sie zwei Bilder und einen booleschen Wert true
oder false
je auf die Bilder.
BEARBEITEN
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
Ich hab das versucht, aber die if
Zustand ist nie zufrieden. Ich nehme an, es sind ein paar Unterschiede, aber es gibt keine compare
Funktion für Scalar
. Was kann ich tun?
BEARBEITEN
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 ist wieder fehlerhaft. Obwohl es kann verwendet werden, um Bilder zu vergleichen mit einem anständigen Genauigkeit, es schlägt fehl, wenn Bilder in verschiedenen Größen.
Wenn Bilder in verschiedenen Größen und drucken ich die skalaren Werte ich dieses:
[9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]
Die Unterschiede zwischen der zweiten und Dritten zahlen zwar nicht viel, ist Recht groß im Vergleich zu, wenn Sie die Bilder gleichen Größe verglichen werden. Die erste Zahl allerdings leidet am meisten ändern.
Was wäre der beste Schnellste Weg, um Inhalte zu vergleichen von zwei Bildern?
[BEARBEITEN]
Ich bin mit dem code, den ich gefunden hier.
Was ich bin nicht in der Lage, um herauszufinden, ist, wie Sie initialisiert die MatOfKeyPoint
Variablen keypoints
und logoKeypoints
. Hier ist mein code-snippet:
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));
Natürlich kann ich nicht initialisieren die Variablen keypoints
und logoKeypoints
auf null cuz ich werde erhalten eine null-Zeiger-Ausnahme dann. Wie kann ich die initialisieren?
InformationsquelleAutor der Frage Karthik Balakrishnan | 2013-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verstehen, dass dies nicht eine einfache Frage und Sie haben unterschiedliche Konzepte, die Sie Folgen konnte. Ich will nur darauf hinweisen, zwei Lösung ohne source-code.
Ich hoffe, das hilft. Bitte Fragen Sie, wenn Sie Fragen haben.
[UPDATE-1]
Ein C++-tutorial: http://morf.lv/modules.php?name=tutorials&lasit=2#.UR-ewKU3vCk
Einige JavaCV-tutorials: http://code.google.com/p/javacv/w/list
[UPDATE-2]
Hier ist ein Beispiel mit SIFT-Detektor und SIFT-Deskriptor mit Standard-Parametern. RANSAC-Schwelle für homography ist 65, reprojection-Fehler (epsilon) ist 10, Kreuz-Validierung aktiviert. Sie könnten versuchen, zu zählen, die aufeinander abgestimmt sind. Wenn die Inliner-Ausreißer-Verhältnis ist zu hoch, man konnte sehen, dieses paar als Duplikate.
Zum Beispiel: Diese Bilder produzieren 180 Eckdaten in IMG1 und 198 in IMG2. Die übereinstimmenden Deskriptoren sind 163 von denen nur 3 Ausreißer. So das gibt ein wirklich gutes Verhältnis, das nur bedeuten konnte, dass diese Bilder könnten Duplikate.
[UPDATE-3]
Ich verstehe nicht, warum Sie initialisieren kann die MatOfKeypoints. Ich habe gelesen, die API und es gibt einen öffentlichen Konstruktor. UND: Man kann die Matte des Bildes, die Sie analysieren möchten. Das ist sehr schön. =)
Für den Abgleich verwenden Sie eine BRUTEFORCE_SL2 Deskriptor-Matcher verursachen, müssen Sie die euklidische Distanz für SURF oder SIFT.
InformationsquelleAutor der Antwort Mr.Mountain
Verwenden
cv2.absDiff
zu berechnen, den Unterschied zwischen den Bildern undcv2.sumElems
um die Summe aller Pixel Unterschiede.Dann erfinden eine Schwelle, durch welche Sie beurteilen, ob zwei Bilder ähnlich sind, oder nicht.
InformationsquelleAutor der Antwort sschrass
Können Sie versuchen, den folgenden code:
Hier in den code compare-Funktion vergleicht zwei Bilder und dann, wenn es dort ist dis ähnlichkeit zwischen den Bildern dann insbesondere matrix-Wert 255, alle anderen Werte gleich null sein wird. Dann können Sie die Anzahl der nicht-null-Werte, um zu bestimmen, wenn die Bilder gleich waren. Dies funktioniert nur für Genau die gleichen Bilder.
Wenn Sie wollen, vergleichen Sie die Bilder ignorieren, die Licht-Effekte schlage ich vor, Sie zu generieren, der Rand Bild zuerst (Mit canny-Funktion von OpenCV) und vergleichen Sie anschließend die Bilder.
Hoffe, diese Antwort hilft dir weiter!!!
InformationsquelleAutor der Antwort Sanober Malik