2012-04-17 9 views
17

Ich erstelle eine Anwendung zum Finden von Übereinstimmungen zwischen zwei Bildern. Ich kann die Ergebnisse des Spiels nicht richtig finden.nicht in der Lage Deskriptoren in Android zu implementieren

Übereinstimmende Methoden geben mir die gleiche Anzahl von Deskriptoren wie die Eingabeschlüsselpunkte und ich kann dieses Ergebnis auch nicht zeichnen. Ich verwende OpenCV als eine Bibliothek im Arbeitsbereich.

Hier ist mein Code.

Bitmap mBitmap1 = mimage1.copy(Bitmap.Config.ARGB_8888, false); 
    Bitmap mBitmap2 = mimage2.copy(Bitmap.Config.ARGB_8888, false); 

    Mat s_image1 = Utils.bitmapToMat(mBitmap1); 
    Mat s_image2 = Utils.bitmapToMat(mBitmap2); 

    Mat rgb1 = new Mat(); 
    Mat rgb2 = new Mat(); 
    Mat rgb3 = new Mat(); 
    Mat temp = new Mat(); 

    Mat o_image1 = new Mat(); 
    Mat o_image2 = new Mat(); 
    Mat o_image3 = new Mat(); 

    List<KeyPoint> points1 = new ArrayList<KeyPoint>(); 
    List<KeyPoint> points2 = new ArrayList<KeyPoint>(); 
    List<DMatch> matches = new ArrayList<DMatch>(); 

    FeatureDetector surf = FeatureDetector.create(FeatureDetector.SURF); 
    surf.detect(s_image1, points1); 
    surf.detect(s_image2, points2); 

    Scalar color1 = new Scalar(0,255,0); 
    Scalar color2 = new Scalar(255,0,0); 

    Imgproc.cvtColor(s_image1, rgb1, Imgproc.COLOR_RGBA2RGB); 
    Imgproc.cvtColor(s_image2, rgb2, Imgproc.COLOR_RGBA2RGB); 

    Mat descriptors1 = new Mat(), descriptors2 = new Mat(); 
    Features2d.drawKeypoints(rgb1, points1, rgb1, color2); 
    Features2d.drawKeypoints(rgb2, points2, rgb2, color2); 
    DescriptorExtractor extracter = DescriptorExtractor.create(DescriptorExtractor.SURF); 

    extracter.compute(rgb1, points1, descriptors1); 
    extracter.compute(rgb2, points2, descriptors2); 
    int k = 5; 
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); 
    matcher.match(descriptors2, descriptors1, matches); 
    Features2d.drawMatches(rgb1, points1, rgb2, points2, matches, rgb3, color1, color2); 
    Imgproc.cvtColor(rgb1, o_image1, Imgproc.COLOR_RGB2RGBA); 
    Imgproc.cvtColor(rgb2, o_image2, Imgproc.COLOR_RGB2RGBA); 

    Utils.matToBitmap(o_image1, mBitmap1); 
    mimageview1.setImageBitmap(mBitmap1); 
    Utils.matToBitmap(o_image2, mBitmap2); 
    mimageview2.setImageBitmap(mBitmap2); 
    Utils.matToBitmap(o_image3, mBitmap3); 
    mimageview3.setImageBitmap(mBitmap3); 
    s_image1.release(); 
    s_image2.release(); 
    o_image1.release(); 
    o_image2.release(); 
+0

Ihr Programm sieht gut aus, haben Sie versucht zu debuggen? Nur um zu sehen, dass jeder Schritt richtig ist, um die Anzahl der Schlüsselpunkte in jedem Bild zu sehen. Ich verwende den Vektor anstelle der Liste. –

+0

Welche opencv-Version verwenden Sie, ich sehe diese Sequenz von Parametern nicht mit Features2d.drawMatches() mit opencv 2.4.1. Ich benutze die Liste , das ist also kein Problem. –

+0

2.4.x hat entweder Features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg) ODER Features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor, singlePointColor, matsMask, flags). –

Antwort

1

Bei gesperrt Lösung, schlage ich Ihnen Android NDK und C++ nativen Codes zu verwenden. es funktioniert richtig. This tutorial ist gut zu erklären, den Schritt zu tun, ein jni-opencv-Projekt für Android

Verwandte Themen