Ekstrak OpenCV Android cocok dengan Mat setelah deteksi fitur

Saya ingin mengekstrak bagian gambar yang cocok dengan gambar referensi saya. Saya mencoba mengubah gambar menggunakan metode Calib3d.findHomography. Ketika saya telah melakukan ini saya menggunakan Imgproc.warpPerspective untuk melakukan transformasi tetapi tidak ada hasil yang baik. Apakah saya melewatkan sesuatu di sini? Apakah saya perlu melakukan sesuatu dengan perspectiveTransform? Saya telah mencoba ini tetapi sejauh ini tidak berhasil.

Inilah metode findSceneCorners saya:

 private void findSceneCorners(Mat src) {
    mFeatureDetector.detect(src, mSceneKeypoints);
    mDescriptorExtractor.compute(src, mSceneKeypoints, mSceneDescriptors); 
    mDescriptorMatcher.match(mSceneDescriptors, mReferenceDescriptors, mMatches);

    List<DMatch> matchesList = mMatches.toList();
    if (matchesList.size() < 4) {
        // There are too few matches to find the homography.
        return;
    }

    List<KeyPoint> referenceKeypointsList =
            mReferenceKeypoints.toList();
    List<KeyPoint> sceneKeypointsList =
            mSceneKeypoints.toList();

    // Calculate the max and min distances between keypoints.
    double maxDist = 0.0;
    double minDist = Double.MAX_VALUE;
    for(DMatch match : matchesList) {
        double dist = match.distance;
        if (dist < minDist) {
            minDist = dist;
        }
        if (dist > maxDist) {
            maxDist = dist;
        }
    }

    // The thresholds for minDist are chosen subjectively
    // based on testing. The unit is not related to pixel
    // distances; it is related to the number of failed tests
    // for similarity between the matched descriptors.
    if (minDist > 50.0) {
        // The target is completely lost.
        // Discard any previously found corners.
        mSceneCorners.create(0, 0, mSceneCorners.type());
        return;
    } else if (minDist > 20.0) {
        // The target is lost but maybe it is still close.
        // Keep any previously found corners.
        return;
    }


    // Identify "good" keypoints based on match distance.
    ArrayList<Point> goodReferencePointsList =
            new ArrayList<Point>();
    ArrayList<Point> goodScenePointsList =
            new ArrayList<Point>();

    double maxGoodMatchDist = 1.75 * minDist;
    for(DMatch match : matchesList) {
        if (match.distance < maxGoodMatchDist) {
           goodReferencePointsList.add(
                   referenceKeypointsList.get(match.trainIdx).pt);
           goodScenePointsList.add(
                   sceneKeypointsList.get(match.queryIdx).pt);
        }
    }

    if (goodReferencePointsList.size() < 4 ||
            goodScenePointsList.size() < 4) {
        // There are too few good points to find the homography.
        return;
    }

    Log.i(TAG, "Match found");

    MatOfPoint2f goodReferencePoints = new MatOfPoint2f();
    goodReferencePoints.fromList(goodReferencePointsList);

    MatOfPoint2f goodScenePoints = new MatOfPoint2f();
    goodScenePoints.fromList(goodScenePointsList);

    homography = Calib3d.findHomography(goodReferencePoints, goodScenePoints);

    Mat quad = new Mat(mReferenceImage.size(), CvType.CV_32F);
    Imgproc.warpPerspective(src, quad, homography, quad.size());
    objectDetectedListener.objectDetected(quad);

}

person Smek    schedule 13.01.2014    source sumber
comment
Ini adalah tutorial yang disarankan OpenCV, sudahkah Anda mencobanya ? Itu bisa membantu   -  person thedarkside ofthemoon    schedule 13.01.2014
comment
Saya sudah memiliki kode yang berfungsi untuk melakukan hal itu. Menggambar garis di sekitar benda yang ditemukan. Tapi yang ingin saya capai adalah mengekstrak bagian gambar yang cocok menjadi objek Mat baru.   -  person Smek    schedule 13.01.2014
comment
Saya tidak menginstal OpenCV di komputer ini, saya sarankan Anda untuk menampilkan gambarnya, mungkin Anda akan mengetahui apa yang sedang terjadi. Saya akan memberi Anda jawaban untuk besok jika tidak ada orang lain yang menjawab   -  person thedarkside ofthemoon    schedule 13.01.2014
comment
Ini yang ingin saya capai kecuali saya Saya tidak menggunakan cerdik tetapi deteksi fitur. Dan segi empatnya akan didasarkan pada gambar templat.   -  person Smek    schedule 13.01.2014
comment
Lihat yang ini, mungkin bisa membantu.   -  person thedarkside ofthemoon    schedule 13.01.2014


Jawaban (1)


Saya pikir Anda harus menggunakan WARP_INVERSE_MAP sebagai bendera warpPerspective sebagai: Imgproc.warpPerspective(src, quad, homography, quad.size(),WARP_INVERSE_MAP);.

Saya belum menggunakan kode Anda secara persis, tetapi hanya bagian setelah homografi, dan saya telah melihat bahwa gambarnya bengkok di cermin, tidak seperti yang kami inginkan (gunakan gambar tampilan yang lebih besar untuk melihat dengan tepat apa yang ada di sana). Faktanya, di halaman yang Anda posting, dengan 10 kartu, digunakan bendera itu, maaf saya belum terpikir untuk menyebutkannya sebelumnya.

person thedarkside ofthemoon    schedule 13.01.2014
comment
Terima kasih sisi gelap bulan ini bekerja dengan sempurna. - person Smek; 14.01.2014