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:

OpenCV Bildvergleich in Android

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

Schreibe einen Kommentar