2012-04-17 21 views
17

Estoy creando una aplicación para buscar coincidencias entre dos imágenes. No puedo encontrar adecuadamente los resultados de los partidos.incapaz de implementar descriptores en android

Los métodos de coincidencia me dan el mismo número de descriptores que los puntos clave de entrada y tampoco puedo dibujar este resultado. Estoy usando OpenCV como una biblioteca en el espacio de trabajo.

Aquí está mi código.

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

Su programa se ve bien, ¿ha intentado depurar? Solo para ver que cada paso sea correcto, para ver la cantidad de puntos clave en cada imagen. Yo uso el vector en lugar de la lista. –

+0

Qué versión de Opencv está usando, no veo esa secuencia de parámetros con Features2d.drawMatches() con opencv 2.4.1. Yo uso la lista , por lo que no es un problema. –

+0

2.4.x tiene Features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg) O Features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor, singlePointColor, matchesMask, flags). –

Respuesta

1

En caso de solución bloqueada, le sugiero que utilice los códigos nativos Android NDK y C++. funciona correctamente This tutorial explica bien el paso para hacer un proyecto jni-opencv para Android

Cuestiones relacionadas