Heim > Backend-Entwicklung > C++ > Wie kann man mit OpenCV Eckpunkte eines Blattes Papier genau erkennen und extrahieren?

Wie kann man mit OpenCV Eckpunkte eines Blattes Papier genau erkennen und extrahieren?

Susan Sarandon
Freigeben: 2024-12-31 12:29:09
Original
408 Leute haben es durchsucht

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

So erkennen Sie Papierblätter und extrahieren Eckpunkte mit OpenCV

In diesem Artikel verbessern wir die weit verbreitete OpenCV-Quadraterkennung Beispiel, um überflüssige Ergebnisse herauszufiltern und genaue Eckpunkte eines Blattes Papier aus einem Bild abzurufen.

Das ursprüngliche OpenCV-Beispiel war dazu nicht in der Lage Filtert Rauschen effektiv heraus, was die Ausgabe unordentlich und schwierig zu verarbeiten macht. Um dieses Problem anzugehen, schlagen wir eine modifizierte Implementierung vor:

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);
                }
            }
        }
    }
}
Nach dem Login kopieren

Nach der Anwendung dieser verbesserten Implementierung enthält der resultierende Quadratvektor das größte erkannte Quadrat, das das Blatt Papier darstellt. Um die Eckpunkte des Papiers zu extrahieren, identifizieren Sie das Quadrat mit der größten Fläche aus dem Quadratvektor. Die vier Eckpunkte dieses Quadrats sind die gewünschten Eckpunkte des Blattes Papier.

Zusammenfassend lässt sich sagen, dass unsere verbesserte OpenCV-Implementierung eine zuverlässige Erkennung von Papierblättern ermöglicht, indem sie Fehlalarme eliminiert und Eckpunkte genau extrahiert ein leistungsstarkes Werkzeug für Bildverarbeitungsanwendungen.

Das obige ist der detaillierte Inhalt vonWie kann man mit OpenCV Eckpunkte eines Blattes Papier genau erkennen und extrahieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage