2012-04-17 17 views
17

Tôi đang tạo một ứng dụng để tìm các kết quả phù hợp giữa hai hình ảnh. Tôi không thể tìm thấy kết quả phù hợp.không thể triển khai các trình mô tả trong android

Phương thức đối sánh cung cấp cho tôi cùng số lượng mô tả làm điểm đầu vào và tôi cũng không thể vẽ kết quả này. Tôi đang sử dụng OpenCV như một thư viện trong không gian làm việc.

Đây là mã của tôi.

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

Chương trình của bạn có vẻ ổn, bạn đã thử gỡ lỗi chưa? Chỉ cần thấy rằng mọi bước đều đúng, để xem số lượng điểm chính trong mỗi hình ảnh. Tôi sử dụng vector thay vì danh sách. –

+0

Bạn đang sử dụng phiên bản opencv nào, tôi không thấy chuỗi các thông số đó với Features2d.drawMatches() với opencv 2.4.1. Tôi sử dụng Danh sách , vì vậy đó không phải là vấn đề. –

+0

2.4.x hoặc có Features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg) HOẶC features2d.drawMatches (img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor, singlePointColor, matchesMask, cờ). –

Trả lời

1

Trong trường hợp giải pháp bị khóa, tôi khuyên bạn nên sử dụng mã gốc NDK và C++ của Android. nó hoạt động đúng. This tutorial cũng đang giải thích bước để thực hiện dự án jni-opencv cho android