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& image, vector<vector<Point> >& 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(&blurred, 1, &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); } } } } }
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!