본문 바로가기

IT

OpenCV Hough 변환을 활용한 직선 및 원 검출

Hough 변환(Hough Transform)을 활용한 직선(Line) 및 원(Circle) 검출 방법은 

이미지에서 형태가 명확한 도형을 수학적으로 찾는 데 

매우 강력하고, 특히 차선 인식, 원형 객체 탐지, 부품 검사 등에 자주 활용됩니다.

 

OpenCV Hough 변환을 활용한 직선 및 원 검출

Hough 변환이란?

Hough 변환은 이미지에서 직선, 원, 타원처럼 수학적으로 정의된 형태를 검출하는 알고리즘이에요.

이진 엣지 이미지에서 특정 형태의 도형을 찾기 위해,

픽셀의 조합을 누적 공간(accumulator)에 매핑해 패턴을 찾아냅니다.

 

 

직선의 경우 y = ax + b 형태보다는 극좌표(ρ, θ) 기반의 표현을 사용하고,

원은 중심 좌표와 반지름(r)을 찾는 구조예요.

 

OpenCV는 이 알고리즘을 최적화해서

HoughLines()와 HoughCircles() 함수로 간단히 제공하고 있어요.

엣지 검출(Canny)과 함께 사용하는 것이 일반적인 전처리 흐름이에요.

 

직선 검출: HoughLines() 예제

cv::Mat img = cv::imread("lines.jpg");
cv::Mat gray, edges;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::Canny(gray, edges, 50, 150);

std::vector<cv::Vec2f> lines;
cv::HoughLines(edges, lines, 1, CV_PI/180, 100);

for (auto& line : lines) {
    float rho = line[0], theta = line[1];
    double a = cos(theta), b = sin(theta);
    cv::Point pt1(cvRound(rho*a - 1000*b), cvRound(rho*b + 1000*a));
    cv::Point pt2(cvRound(rho*a + 1000*b), cvRound(rho*b - 1000*a));
    cv::line(img, pt1, pt2, cv::Scalar(0, 0, 255), 2);
}

 

위 예제는 이미지에서 Canny 엣지를 검출한 후, 직선을 찾아 빨간 선으로 그려줘요.

직선은 극좌표 형식 (ρ, θ)으로 반환됩니다.

 

원 검출: HoughCircles() 예제

cv::Mat img = cv::imread("circles.jpg");
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::medianBlur(gray, gray, 5);

std::vector<cv::Vec3f> circles;
cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, 30, 100, 30, 10, 100);

for (auto& c : circles) {
    cv::Point center(cvRound(c[0]), cvRound(c[1]));
    int radius = cvRound(c[2]);
    cv::circle(img, center, radius, cv::Scalar(0, 255, 0), 2);
    cv::circle(img, center, 2, cv::Scalar(0, 0, 255), 3);
}

 

이 코드는 이미지에서 원을 검출하고, 초록색 테두리와 빨간 중심점을 표시해줍니다.

HoughCircles()는 밝기 변화 기반으로 동작하기 때문에 GaussianBlur나 MedianBlur 전처리가 중요해요.

 

파라미터 조정과 성능 팁

Hough 변환은 정확한 검출을 위해 파라미터 튜닝이 필수예요.

HoughLines()에서는 누적 공간의 임계값(threshold)이 크면 적은 직선만 검출되고,

작으면 잡음까지 검출될 수 있어요.

 

HoughCircles()에서는 거리 파라미터(minDist), 내부 Canny 임계값,

그리고 원의 반지름 범위(minRadius, maxRadius) 설정이 중요해요.

또한, 너무 큰 해상도의 이미지에서는 성능 저하가 발생할 수 있으므로,

이미지를 리사이징해서 처리하거나 ROI를 사용하는 것이 효율적입니다.

 

디버깅을 위해 원본 이미지와 엣지 이미지를 함께 출력해보는 것도 좋은 전략이에요.

 

실전 응용: 차선 인식, 동전 분류 등

Hough 변환은 실전에서 매우 다양하게 활용돼요.

예를 들어, 차선 인식에서는 HoughLines()로 차선 직선을 추출한 후,

경사도(θ)를 기준으로 왼쪽/오른쪽 차선을 분류해요.

또, 동전 분류기캔 검사기에서는 HoughCircles()로 원을 검출하고,

반지름을 기준으로 크기 분류를 할 수 있죠.

 

OCR 전처리에서 문서 가장자리 라인 검출에도 사용돼요.

이처럼 형태가 명확한 구조물의 검출에는 Hough 변환이 매우 효과적이며,

다른 검출 알고리즘과 조합하면 더욱 강력한 영상 분석 도구로 발전시킬 수 있어요.

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~

OpenCV Hough 변환을 활용한 직선 및 원 검출.mp3
3.64MB