Maison > développement back-end > C++ > Comment détecter et extraire avec précision les points d'angle d'une feuille de papier à l'aide d'OpenCV ?

Comment détecter et extraire avec précision les points d'angle d'une feuille de papier à l'aide d'OpenCV ?

Susan Sarandon
Libérer: 2024-12-31 12:29:09
original
408 Les gens l'ont consulté

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

Comment détecter des feuilles de papier et extraire des points d'angle à l'aide d'OpenCV

Dans cet article, nous améliorerons la détection de carrés OpenCV largement utilisée exemple pour filtrer les résultats superflus et récupérer les points d'angle précis d'une feuille de papier à partir d'une image.

L'exemple OpenCV original n'a pas pu filtre efficacement le bruit, ce qui rend la sortie désordonnée et difficile à traiter. Pour résoudre ce problème, nous proposons une implémentation modifiée :

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);
                }
            }
        }
    }
}
Copier après la connexion

Après avoir appliqué cette implémentation améliorée, le vecteur carrés résultant contiendra le plus grand carré détecté, représentant la feuille de papier. Pour extraire les points d'angle du papier, identifiez le carré avec la surface maximale à partir du vecteur carrés. Les quatre points d'angle de ce carré sont les points d'angle souhaités de la feuille de papier.

En résumé, notre implémentation améliorée d'OpenCV permet une détection fiable des feuilles de papier en éliminant les faux positifs et en extrayant avec précision les points d'angle, ce qui en fait un outil puissant pour les applications de traitement d'images.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal