6-4. 허프 변환: 직선 검출
허프 변환(Hough Transform)
2차원 영상 좌표(x,y)에서의 직선 방정식(y = ax + b)을 파라미터 공간(a,b)으로 변환하여 직선을 찾는 알고리즘
영상 좌표의 직선 방정식의 경우 y축과 평행한 수직선을 표현하지 못하기 때문에 극 좌표계(삼각 함수 사용)의 직선 방정식을 파라미터 공간(rho, theta)으로 변환하여

축적 배열(Accumulation Array)
파라미터 공간 변환 후 직선 성분과 관련된 원소 값을 1씩 증가시키는 배열

직선 검출
기존 허프 변환 함수: cv2.HoughLines(image, rho, theta, threshold, lines, srn, stn, min_theta, max_theta) -> lines
image는 입력 에지 영상
rho는 축적 배열에서 rho 값의 간격. 1.0 = 1 픽셀 간격
theta는 축적 배열에서 theta 값의 간격. numpy.pi / 180 = 1 degree 간격
threshold는 죽적 배열에서 직선으로 판단할 임계값
lines는 직선 파라미터 정보(rho, theta)를 담고 있는 numpy.ndarray. shape = (N,1,2), dtype=numpy.float32
srn, stn는 멀티 스케일 허프 변환에서 rho 해상도, theta 해상도를 나누는 값. 기본값은 0으로 이 경우 일반 허프 변환 수행
min_theta, max_theta는 검출할 선의 최소 최대 theta 값
확률적 허프 변환 함수: cv2.HoughLines(image, rho, theta, threshold, lines, minLine_theta, maxLineGap) -> lines
image는 입력 에지 영상
rho는 축적 배열에서 rho 값의 간격. 1.0 = 1 픽셀 간격
theta는 축적 배열에서 theta 값의 간격. numpy.pi / 180 = 1 degree 간격
threshold는 죽적 배열에서 직선으로 판단할 임계값
lines는 직선의 시작과 끝 좌표 정보(x1,y1, x2, y2) 를 담고 있는 numpy.ndarray. shape = (N,1,4), dtype=numpy.int32
minLineLength는 검출할 직선의 최소 길이
maxLineGap은 직선으로 간주할 최대 에지 점 간격
기존 허프 변환 함수의 경우 출력 값이 파라미터 정보이기 때문에 나타내기 어려운 점이 있어 확률적 허프 변환 함수를 더 많이 사용한다.

6-5. 허프 변환: 원 검출
원 검출 방식
원의 방정식에 허프 변환 직선 검출 방식을 응용하여 검출
Hough Gradient 검출 방식 예시:
1. 입력 영상과 동일한 2차원 평면 공간에서 축적 영상을 생성
2. 에지 픽셀에서 그래디언트 계산
3. 에지 방향에 따라 직선을 그리면서 값을 누적
4. 원의 중심을 먼저 찾고, 적절한 반지름을 검출
확률적 허프 변환 함수: cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadium, maxRadius) -> circles
image는 입력 에지 영상
method는 OpenCV 4.2 이하일 경우 cv2.HOUGH_GRADIENT로만 지정 가능. 그 이후 버전 경우 cv2.HOUGH_GRADIANT_ALT도 가능 (자세한 정보는 사용 OpenCV 버전 HoughCircles() 함수 설명 참고)
dp는 입력 영상과 축적 배열의 크기 비율 (1 - 동일 크기, 2 - 입력 영상의 반 ...)
minDist는 검출된 원 중심점들의 최소 거리
circles는 (cx, cy, r) 정보를 담은 numpy.ndarray. shape=(1, N, 3), dtype=np.float32
param1는 Canny 에지 검출기의 높은 임계값
param2는 축적 배열에서 원 검출을 위한 임계값
minRadius, maxRadius는 검출한 원의 최소, 최대 반지름

6-6. 실전 코딩
동전 카운터
영상의 동전을 검출하여 금액이 얼마인지를 자동으로 계산하는 프로그램
가정 (Assumption):
1. 편의상 동전은 100원과 10원만 있다
2. 영상 안에 있는 원 객체는 동전만 있다
3. 입력 영상 크기는 800x600px 이다
구현할 기능 (Functions):
1. 동전 검출하기 (허프 원 검출 사용)
- 동전의 크기: 100원(약 100x100px), 10원(약 80x80px)
2. 동전 구분하기 (색상 정보 사용)
- 동전 영역 검출 후 HSV 색 공간으로 변환
- Hue 색 성분 분포 분석
- 성분 분포에 따라 Hue 검출 방식 선정


인증 타임
허프 변환의 경우 함수들에 사용되는 파라미터들이 중요하기 때문에 처리 정도에 따라 알맞은 값을 선정하는 것이 중요한 포인트였다.
강의에서는 OpenCV 버전 4.2 이하 버전을 사용하라고 했던거 같은데 지금 글쓴이의 컴퓨터에는 OpenCV 4.5.5가 깔려있다. 이 때문인지 아닌지 허프 변환 원 검출 후 결과 값을 원 그리는데 사용하려고 하면 에러가 뜨는데 결과 값은 float인데 비해 circle 함수는 int 인자를 기대하기 때문인 것으로 보인다. 그래서 데이터 타입 변형 후 출력해보니 코드는 돌아가지만 결과가 이상하게 잡히는 것을 볼 수 있었다. 강의 영상에서는 잘 돌아가던데 뭐가 문제가 되는지 모르겠다. 나중에 확인해봐야할 사항이다. 잘 됬으면 HOUGH_GRADIANT_ALT 사용 비교 자료도 올리고 싶었는데 마음처럼 안돼서 아쉽다.
오늘은 오래 외출하느라 이동 중에 수업을 듣고 블로그 글은 돌아와서 마무리했다. 원래 테블릿 유저가 아니였는데 이럴 때 매우 유용해서 요즘은 챙겨다니게 된다.



#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 30일차 - Ch7. 이진 영상 처리 (0) | 2022.02.22 |
|---|---|
| 패스트캠퍼스 챌린지 29일차 - Ch7. 이진 영상 처리 (0) | 2022.02.21 |
| 패스트캠퍼스 챌린지 27일차 - Ch6. 영상의 특징 추출 (0) | 2022.02.19 |
| 패스트캠퍼스 챌린지 26일차 - Ch5. 기하학적 변환 (0) | 2022.02.18 |
| 패스트캠퍼스 챌린지 25일차 - Ch5. 기하학적 변환 (0) | 2022.02.17 |