OpenCV를 사용하여 종이 시트를 감지하고 모서리 점을 추출하는 방법
이 기사에서는 널리 사용되는 OpenCV 사각형 감지 기능을 개선합니다. 불필요한 결과를 필터링하고 이미지에서 종이의 정확한 모서리 지점을 검색하는 예입니다.
원본 OpenCV 예제는 노이즈를 효과적으로 필터링할 수 없어 출력이 지저분해지고 처리하기 어려워졌습니다. 이 문제를 해결하기 위해 우리는 수정된 구현을 제안합니다.
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); } } } } }
이 향상된 구현을 적용한 후 결과 사각형 벡터에는 종이를 나타내는 가장 큰 감지 사각형이 포함됩니다. 종이의 모서리 점을 추출하려면 사각형 벡터에서 최대 면적을 갖는 사각형을 식별하십시오. 이 사각형의 네 모서리 점은 종이의 원하는 모서리 점입니다.
요약하자면, 향상된 OpenCV 구현을 통해 거짓 긍정을 제거하고 모서리 점을 정확하게 추출하여 종이 시트를 안정적으로 감지할 수 있습니다. 이미지 처리 애플리케이션을 위한 강력한 도구입니다.
위 내용은 OpenCV를 사용하여 종이의 모서리 점을 정확하게 감지하고 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!