>백엔드 개발 >C++ >OpenCV를 사용하여 종이의 모서리 점을 정확하게 감지하고 추출하는 방법은 무엇입니까?

OpenCV를 사용하여 종이의 모서리 점을 정확하게 감지하고 추출하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-31 12:29:09430검색

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

OpenCV를 사용하여 종이 시트를 감지하고 모서리 점을 추출하는 방법

이 기사에서는 널리 사용되는 OpenCV 사각형 감지 기능을 개선합니다. 불필요한 결과를 필터링하고 이미지에서 종이의 정확한 모서리 지점을 검색하는 예입니다.

원본 OpenCV 예제는 노이즈를 효과적으로 필터링할 수 없어 출력이 지저분해지고 처리하기 어려워졌습니다. 이 문제를 해결하기 위해 우리는 수정된 구현을 제안합니다.

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

이 향상된 구현을 적용한 후 결과 사각형 벡터에는 종이를 나타내는 가장 큰 감지 사각형이 포함됩니다. 종이의 모서리 점을 추출하려면 사각형 벡터에서 최대 면적을 갖는 사각형을 식별하십시오. 이 사각형의 네 모서리 점은 종이의 원하는 모서리 점입니다.

요약하자면, 향상된 OpenCV 구현을 통해 거짓 긍정을 제거하고 모서리 점을 정확하게 추출하여 종이 시트를 안정적으로 감지할 수 있습니다. 이미지 처리 애플리케이션을 위한 강력한 도구입니다.

위 내용은 OpenCV를 사용하여 종이의 모서리 점을 정확하게 감지하고 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.