OpenCV 라이브러리에서 제공하는 cornerSubPix는
- 코너 검출의 정확도를 높이기 위해 사용되는 함수임.
- 이 함수는 초기 검출된 코너 위치를 서브픽셀 수준으로 정밀하게 조정하기 위해 사용됨.
Function Signature
cv.cornerSubPix(
image, # 입력 이미지 (그레이스케일)
corners, # 초기 코너 위치들 (numpy array)
winSize, # 윈도우 크기 (width, height)
zeroZone, # 제외할 중심 영역 크기 (width, height)
criteria # 종료 조건 (type, max_iter, epsilon)
)
cornerSubPix 함수는 다음과 같은 인자를 받음:
- image (이미지): 입력 이미지로, 반드시 grayscale 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를 선택하면 더 정확한 코너 위치를 얻을 수 있음.
같이 보면 좋은 자료들
https://docs.opencv.org/4.x/da/d0d/tutorial_camera_calibration_pattern.html
OpenCV: Create calibration pattern
Next Tutorial: Camera calibration with square chessboard Original author Laurent Berger Compatibility OpenCV >= 3.0 The goal of this tutorial is to learn how to create calibration pattern. You can find a chessboard pattern in https://github.com/opencv/open
docs.opencv.org
[CV] Chessboard관련 함수들: OpenCV
cv.findChessboardCorners()cv.findChessboardCorners() 함수는 OpenCV 라이브러리에서 제공하는 함수chessboard 패턴의 코너를 찾는 데 사용됨.이 함수는 camera calibration 과정에서 자주 사용됨.입력 이미지에서 chessbo
ds31x.tistory.com
[CV] cv2.calibrateCamera
cv2.calibrateCamerahttps://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga3207604e4b1a1758aa66acb6ed5aa65d OpenCV: Camera Calibration and 3D ReconstructionThe functions in this section use a so-called pinhole camera model. The view of a scene is obtained
ds31x.tistory.com
'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 |