Rumah > pembangunan bahagian belakang > C++ > Bagaimana Mengesan dan Mengekstrak Titik Sudut Sekeping Kertas Dengan Tepat Menggunakan OpenCV?

Bagaimana Mengesan dan Mengekstrak Titik Sudut Sekeping Kertas Dengan Tepat Menggunakan OpenCV?

Susan Sarandon
Lepaskan: 2024-12-31 12:29:09
asal
403 orang telah melayarinya

How to Accurately Detect and Extract Corner Points of a Sheet of Paper Using OpenCV?

Cara Mengesan Helaian Kertas dan Mengekstrak Titik Sudut Menggunakan OpenCV

Dalam artikel ini, kami akan menambah baik pengesanan segi empat sama OpenCV yang digunakan secara meluas contoh untuk menapis hasil luar dan mendapatkan titik sudut tepat sehelai kertas daripada imej.

Yang asal Contoh OpenCV tidak dapat menapis bunyi bising dengan berkesan, menjadikan output tidak kemas dan mencabar untuk diproses. Untuk menangani perkara ini, kami mencadangkan pelaksanaan yang diubah suai:

void find_squares(Mat&amp; image, vector<vector<Point> >&amp; squares)
{
    // Blur the image for enhanced edge detection
    Mat blurred(image);
    medianBlur(image, blurred, 9);

    // Convert to grayscale
    Mat gray0(blurred.size(), CV_8U), gray;

    // Detect contours for each color plane in the image
    for (int c = 0; c < 3; c++)
    {
        // Isolate a single color plane
        int ch[] = {c, 0};
        mixChannels(&amp;blurred, 1, &amp;gray0, 1, ch, 1);

        // Iterate through multiple threshold levels
        const int threshold_level = 2;
        for (int l = 0; l < threshold_level; l++)
        {
            if (l == 0)
            {
                // Use Canny instead of zero threshold to improve detection
                Canny(gray0, gray, 10, 20, 3);
                dilate(gray, gray, Mat(), Point(-1, -1)); // Remove potential holes
            }
            else
            {
                gray = gray0 >= (l + 1) * 255 / threshold_level;
            }

            // Find contours for each threshold level
            vector<vector<Point> > contours;
            findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

            // Test contours to identify valid squares
            vector<Point> approx;
            for (size_t i = 0; i < contours.size(); i++)
            {
                approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true) * 0.02, true);
                if (approx.size() == 4 
                    && abs(contourArea(Mat(approx))) > 1000 
                    && isContourConvex(Mat(approx)))
                {
                    double maxCosine = 0;
                    for (int j = 2; j < 5; j++)
                    {
                        double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
                        maxCosine = MAX(maxCosine, cosine);
                    }

                    if (maxCosine < 0.3)
                        squares.push_back(approx);
                }
            }
        }
    }
}
Salin selepas log masuk

Selepas menggunakan pelaksanaan yang dipertingkatkan ini, vektor petak yang terhasil akan mengandungi petak terbesar yang dikesan, mewakili helaian kertas. Untuk mengekstrak titik sudut kertas, kenal pasti petak dengan luas maksimum daripada vektor petak. Empat titik sudut petak ini ialah titik sudut yang dikehendaki pada helaian kertas.

Ringkasnya, pelaksanaan OpenCV kami yang dipertingkatkan membolehkan pengesanan helaian kertas yang boleh dipercayai dengan menghapuskan positif palsu dan mengekstrak titik sudut dengan tepat, menjadikannya alat yang berkuasa untuk aplikasi pemprosesan imej.

Atas ialah kandungan terperinci Bagaimana Mengesan dan Mengekstrak Titik Sudut Sekeping Kertas Dengan Tepat Menggunakan OpenCV?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan