- 허프 변환을 응용하여 원을 검출할 수 있음
- 속도 향상을 위해 Hough gradient method 사용
- 입력 영상과 동일한 2차원 평면 공간에서 축적 영상을 생성
- 에지 픽셀에서 그래디언트 계산
- 에지 방향에 따라 직선을 그리면서 값을 누적
- 원의 중심을 먼저 찾고, 적절한 반지름 검출
- 단점: 여러개의 동심원을 검출 못함 --> 가장 작은 원 하나만 검출됨
- 허프 변환 원 검출 함수
cv2.HoughCircles(image,method,dp,minDist,circles=None,param1=None,param2=None,minRadius=None,maxRadius=None) -> circles
• image: 입력영상. (에지영상이아닌일반영상)
• method: OpenCV4.2 이하에서는 cv2.HOUGH_GRADIENT 만 지정 가능
• dp: 입력 영상과 축적 배열의 크기 비율. 1이면 동일 크기. 2이면 축적배열의 가로, 세로 크기가 입력 영상의 반.
• minDist: 검출된 원 중심점들의 최소 거리
• circles: (cx, cy, r) 정보를 담은 numpy.ndarray. shape=(1, N, 3), dtype=np.float32.
• param1: Canny 에지 검출기의 높은 임계값
• param2: 축적 배열에서 원 검출을 위한 임계값
• minRadius, maxRadius: 검출할 원의 최소, 최대 반지름
- 허프 변환 원 검출 예제
import sys
import numpy as np
import cv2
# 입력 이미지 불러오기
src = cv2.imread('dial.jpg')
if src is None:
print('Image open failed!')
sys.exit()
gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
blr=cv2.GaussianBlur(gray,(0,0),1.0) #cv2.Hough.GRADIENT 방법 사용시 블러링 권장
def on_trackbar(pos):
rmin=cv2.getTrackbarPos('minRadius','img')
rmax=cv2.getTrackbarPos('maxRadius','img')
th=cv2.getTrackbarPos('threshold','img')
circles=cv2.HoughCircles(blr,cv2.HOUGH_GRADIENT,1,50,
param1=120,param2=th,minRadius=rmin,
maxRadius=rmax)
dst=src.copy()
if circles is not None:
for i in range(circles.shape[1]):
cx,cy,radius=circles[0][i]
cv2.circle(dst,(cx,cy),int(radius),(0,0,255),2,cv2.LINE_AA)
cv2.imshow('img',dst)
cv2.imshow('img',src)
cv2.createTrackbar('minRadius','img',0,100,on_trackbar)
cv2.createTrackbar('maxRadius','img',0,150,on_trackbar)
cv2.createTrackbar('threshold','img',0,100,on_trackbar)
cv2.setTrackbarPos('minRadius','img',10)
cv2.setTrackbarPos('maxRadius','img',80)
cv2.setTrackbarPos('threshold','img',40)
cv2.waitKey()
cv2.destroyAllWindows()
'Computer Vision > opencv(python)' 카테고리의 다른 글
[40] 2) 자동 이진화: otsu 방법 (0) | 2021.03.23 |
---|---|
[39] 7.이진 영상 처리 1) 영상의 이진화 (0) | 2021.03.23 |
[37] 4) 허프 변환: 직선 검출 (0) | 2021.03.22 |
[36] 3) 캐니 에지 검출 (0) | 2021.03.22 |
[35] 2) 그래디언트와 에지 검출 (0) | 2021.03.22 |