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