cv2.HoughLines(): 라인 감지
2023. 3. 30. 15:55ㆍOpenCV
cv2.HoughLines(img, rho, theta, threshold, lines, srn=0, stn=0, min_theta, max_theta)
- img: 입력 이미지 (1 채널 바이너리 스케일)
- rho: 거리 측정 해상도 (0~1)
- theta: 각도, 라디안 단위 (np.pi/0~180)
- threshold: 직선으로 판단할 최소한의 동일 개수 (작은 값: 정확도 감소, 검출 개수 증가 / 큰 값: 정확도 증가, 검출 개수 감소)
- lines: 검출 결과, N x 1 x 2 배열 (r, Θ)
- srn, stn: 멀티 스케일 허프 변환에 사용, 선 검출에서는 사용 안 함
- min_theta, max_theta: 검출을 위해 사용할 최대, 최소 각도
rho와 theta 파라미터로 거리와 각도를 얼마나 세밀하게 할지 조정가능
threshold는 같은 직선에 몇 개의 점이 등장해야 직선으로 판단할지를 나타내는 최소한의 개수
예시
### 13.Line Detection - Using Hough Lines
### 13. 라인 감지 - 굵은 라인 사용
# cv2.HoughLines(binarized/thresholded image, 𝜌 accuracy, 𝜃 accuracy, threshold)
# 여기서 임계값은 라인으로 간주되는 최소 표
image = cv2.imread("sudoku.png")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(20,20))
# 그레이스케일과 캐니 엣지 추출
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 170, apertureSize = 3)
plt.subplot(2,2,1)
plt.title("edges")
plt.imshow(edges)
# 1픽셀의 Rho 정확도를 사용하여 HoughLines 실행
# 1도인 np.pi / 180의 세타 정확도
# 라인 임계값은 240(라인 상의 포인트 수)으로 설정됩니다
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
# 각 행을 반복하여 형식으로 변환
# cv.line에 의해 요구됨(즉, 끝점 필요)
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
cv2.line(image, (x1, y1), (x2, y2), (255, 0, 0), 2)
plt.subplot(2, 2, 2)
plt.title("Hough Lines")
plt.imshow(image)
'OpenCV' 카테고리의 다른 글
cv2.moments(): 이미지 모멘트 (0) | 2023.03.30 |
---|---|
사각형 만들기 (0) | 2023.03.28 |
cv2.find(draw)Contours(): 윤곽선 설정 (0) | 2023.03.28 |
cv2.Canny(): 엣지 검출 함수 (0) | 2023.03.28 |
Blurring: 흐리게 만들기 (0) | 2023.03.28 |