2012-04-17 6 views
17

Я создаю приложение для поиска совпадений между двумя изображениями. Я не могу правильно найти результаты матчей.не удалось реализовать дескрипторы в android

Способы сопоставления дают мне такое же количество дескрипторов, что и входные ключевые точки, и я также не могу нарисовать этот результат. Я использую OpenCV в качестве библиотеки в рабочей области.

Вот мой код.

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

Ваша программа отлично выглядит, вы пытались отладить? Просто чтобы убедиться, что каждый шаг правильный, чтобы увидеть количество ключевых точек в каждом изображении. Я использую вектор вместо списка. –

+0

Какую версию opencv вы используете, я не вижу эту последовательность параметров с Feature2d.drawMatches() с opencv 2.4.1. Я использую List , так что это не проблема. –

+0

2.4.x либо имеет Feature2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg) ИЛИ Features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor, singlePointColor, matchesMask, flags). –

ответ

1

В случае заблокированного решения, я предлагаю вам использовать обычные коды Android NDK и C++. он работает правильно. This tutorial хорошо объясняет, как сделать проект jni-opencv для android

 Смежные вопросы

  • Нет связанных вопросов^_^