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& 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); } } } } }
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!