OpenCV 라이브러리에서 제공하는 cornerSubPix
는
코너 검출의 정확도를 높이기 위해 사용되는 함수임.
이 함수는 초기 검출된 코너 위치를 서브픽셀 수준으로 정밀하게 조정하기 위해 사용됨.
함수 설명
cornerSubPix
함수는 다음과 같은 인자를 받음:
- image (이미지): 입력 이미지로, 그레이스케일 이미지여야 함.
- corners (코너들): 초기 코너 위치로,
goodFeaturesToTrack
나findChessboardCorners
와 같은 함수로부터 얻은 값임. - winSize (윈도우 크기): 코너를 세밀하게 조정할 때 사용하는 검색 윈도우의 절반 크기임. 예를 들어, (5, 5)로 설정하면 실제 윈도우 크기는 11x11이 됨.
- zeroZone (제로 존): 검색 중 중심 영역을 무시할 영역임. 일반적으로 (-1, -1)로 설정하여 무시하지 않음.
- criteria (종료 기준): 정확도를 높이기 위해 사용하는 종료 기준임.
cv2.TERM_CRITERIA_EPS
또는cv2.TERM_CRITERIA_MAX_ITER
와 같은 플래그를 사용함.
winSize의 역할
winSize
는 서브픽셀 정밀도로 코너 위치를 조정할 때 참조하는 영역의 크기를 결정하는 값임. 이는 검색 윈도우의 절반 크기를 나타내며, 너무 작거나 너무 크면 원하는 결과를 얻기 어려움.
- 작은 winSize:
- 작은 영역 내에서 정밀한 조정을 시도함.
- 노이즈에 민감할 수 있으며, 코너가 정확하게 검출되지 않을 수 있음.
- 처리 속도가 빠를 수 있음.
- 큰 winSize:
- 넓은 영역을 참조하여 코너 위치를 조정함.
- 더 많은 정보(픽셀 값)를 사용하여 정밀한 위치를 계산하므로, 더 정확한 결과를 얻을 수 있음.
- 처리 시간이 길어질 수 있음.
최적의 winSize 설정
- 이미지 해상도 및 특성:
- 고해상도 이미지에서는 큰 winSize가 필요할 수 있음.
- 저해상도 이미지에서는 작은 winSize가 적절할 수 있음.
- 코너 밀도:
- 코너가 밀집된 영역에서는 작은 winSize가 더 적합할 수 있음.
- 코너가 드문드문 있는 경우 큰 winSize가 유리할 수 있음.
- 실험적 접근:
- 다양한 winSize 값을 실험하여 최적의 값을 찾는 것이 중요함.
알고리즘 개요
cornerSubPix
는 다음과 같은 단계를 통해 작동함:
- 초기 코너 위치 설정: 초기 코너 위치는 다른 코너 검출 알고리즘(
goodFeaturesToTrack
,findChessboardCorners
)으로부터 얻음. - 검색 윈도우 설정:
winSize
로 지정된 영역 내의 픽셀 값을 분석함. - 픽셀 값 분석: 초기 코너 위치를 중심으로
winSize
로 지정된 영역 내의 픽셀 값을 분석하여 정밀한 위치를 계산함. - 반복적 위치 조정: 종료 조건(criteria)이 만족될 때까지 반복적으로 코너 위치를 조정함.
예시 코드
다음은 cornerSubPix
함수의 예시 코드임:
import cv2
import numpy as np
# 그레이스케일 이미지 로드
gray = cv2.imread('chessboard.jpg', cv2.IMREAD_GRAYSCALE)
# 코너 검출 (초기 추정)
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
# winSize 설정
winSize = (5, 5) # 코너 위치를 정밀하게 조정할 때 사용할 검색 윈도우의 절반 크기
# 종료 기준 설정
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 코너를 부드럽게 조정
refined_corners = cv2.cornerSubPix(gray, corners, winSize, (-1, -1), criteria)
# 결과 출력
for corner in refined_corners:
x, y = corner.ravel()
cv2.circle(gray, (x, y), 3, 255, -1)
cv2.imshow('Corners', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
이 코드는 cornerSubPix
를 사용하여 초기 코너 위치를 서브픽셀 수준으로 정밀하게 조정하는 예시임. winSize
설정에 따라 검색 영역의 크기가 달라지며, 적절한 winSize
를 선택하면 더 정확한 코너 위치를 얻을 수 있음.
References
https://docs.opencv.org/4.x/da/d0d/tutorial_camera_calibration_pattern.html
'Programming > DIP' 카테고리의 다른 글
[DIP] Image Stitching (0) | 2024.06.13 |
---|---|
[CV] Homography 에 대해서 (0) | 2024.06.13 |
[DIP] functional plot and image plot. (0) | 2024.01.21 |
[DIP] Image Quality 관련 정량화 지표들: Resolution, Contrast, SNR (0) | 2023.10.04 |
[DIP] Function plot and Image display (0) | 2023.09.26 |