HoughCircles() 함수를 사용하여 영상에서 원을 찾는 예제 코드를 코드 9-5에 나타냈습니다. 코드 9-5에 나타난 hough_circles() 함수는 은색 동전이 놓여 있는 영상에서 원을 검출하고, 검출된 원을 빨간색으로 표시합니다. hough_circles() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch09/hough 프로젝트에서 확인할 수 있습니다.
코드 9-5 허프 원 검출 예제 [ch09/hough]
01 void hough_circles() 02 { 03 Mat src = imread("coins.png", IMREAD_GRAYSCALE); 04 05 if (src.empty()) { 06 cerr << "Image load failed!" << endl; 07 return; 08 } 09 10 Mat blurred; 11 blur(src, blurred, Size(3, 3)); 12 13 vector<Vec3f> circles; 14 HoughCircles(blurred, circles, HOUGH_GRADIENT, 1, 50, 150, 30); 15 16 Mat dst; 17 cvtColor(src, dst, COLOR_GRAY2BGR); 18 19 for (Vec3f c : circles) { 20 Point center(cvRound(c[0]), cvRound(c[1])); 21 int radius = cvRound(c[2]); 22 circle(dst, center, radius, Scalar(0, 0, 255), 2, LINE_AA); 23 } 24 25 imshow("src", src); 26 imshow("dst", dst); 27 28 waitKey(0); 29 destroyAllWindows(); 30 }
• 3행 coins.png 동전 영상을 불러와 src에 저장합니다.
• 11행 입력 영상 src의 잡음을 제거하는 용도로 blur() 함수를 적용합니다.
• 14행 HoughCircles() 함수를 이용하여 원을 검출합니다. 축적 배열 크기는 입력 영상과 같은 크기로 사용하고, 두 원의 중심점 거리가 50픽셀보다 작으면 검출하지 않습니다. 캐니 에지 검출기의 높은 임계값은 150으로 지정하고, 축적 배열 원소 값이 30보다 크면 원의 중심점으로 선택합니다. 검출된 원의 중심 좌표와 반지름 정보는 circles 변수에 저장됩니다.
• 16~17행 입력 영상 src를 3채널 컬러 영상으로 변환하여 dst에 저장합니다.
• 19~23행 dst 영상 위에 검출된 원을 빨간색으로 그립니다.