cv.findChessboardCorners()
cv.findChessboardCorners()
함수는 OpenCV 라이브러리에서 제공하는 함수
chessboard 패턴의 코너를 찾는 데 사용됨.
- 이 함수는 camera calibration 과정에서 자주 사용됨.
- 입력 이미지에서 chessboard의 코너를 정확하게 찾아냄.
Function Signature
retval, corners = cv.findChessboardCorners(
image,
patternSize,
flags=None
)
- image:
- chessboard corner를 찾을 gray-scale 이미지.
- 보통
cv.cvtColor()
함수에서cv.COLOR_BGR2GRAY
사용하여 컬러 이미지를 그레이스케일로 변환.
- patternSize:
- chessboard의 각 치수,
- 즉 corner의 수를 (가로, 세로) 튜플로 표현:
(# of cols, # of rows)
- 예를 들어,
patternSize = (7,6)
은 chessboard 가로 방향으로 7개, 세로 방향으로 6개의 코너를 가지고 있음 - 실제 chessboard에서는 이 보다 가로 및 세로에 각각 1씩 더 많은 선을 가지고 있음.
- flags:
- 이 parameter는 함수가 corner를 찾는 방식을 조정하는 데 사용됨.
- 기본값은
None
.- 예를 들어
cv.CALIB_CB_ADAPTIVE_THRESH
또는cv.CALIB_CB_FAST_CHECK
등의 플래그를 사용할 수 있음.
- 예를 들어
- retval:
- 코너 탐지의 성공 여부를 나타내는 boolean value.
True
면 코너를 성공적으로 찾았고,False
면 실패했음을 의미.
- corners:
- 탐지된 corners의 위치를 나타내는
list
. (x, y)
좌표를 가진 points의 리스트- Numpy 배열 형태로 반환.
- 탐지된 corners의 위치를 나타내는
cv.drawChessboardCorners
cv.drawChessboardCorners()
함수는 OpenCV 라이브러리에서 제공하는 기능
검출된 corners of chessboard를 이미지에 시각적으로 표시하는 데 사용
Function Signature
cv.drawChessboardCorners(
image,
patternSize,
corners,
patternWasFound)
- image:
- corner를 그릴 이미지.
- 일반적으로 컬러 이미지를 권장.
- patternSize:
- chessboard의 각 치수,
- 즉 corner의 수를 (가로, 세로) 튜플로 표현:
(# of cols, # of rows)
- 예를 들어,
patternSize = (7,6)
은 chessboard 가로 방향으로 7개, 세로 방향으로 6개의 코너를 가지고 있음 - 실제 chessboard에서는 이 보다 가로 및 세로에 각각 1씩 더 많은 선을 가지고 있음.
- corners:
- 검출된 corner의 위치가 포함된 배열.
- 이는 cv2.findChessboardCorners() 함수에 의해 반환된 객체를 사용.
- 배열은 실수형 좌표를 포함하고 있으며, (x, y) 형태로 각 corner의 위치를 나타냄.
- patternWasFound:
- corner가 성공적으로 검출되었는지를 나타내는 boolean value.
- 이 값이 True 일 때만 corner를 이미지에 그림.
사용 예
import numpy as np
import cv2 as cv
def create_chessboard(corners_cols, corners_rows, tile_size=50):
"""
chessboard 이미지를 생성하는 함수입니다.
:param corners_cols: 체스보드의 열 방향 코너 수
:param corners_rows: 체스보드의 행 방향 코너 수
:param tile_size: 각 타일(셀)의 크기 (픽셀 단위)
:return: 생성된 체스보드 이미지 (NumPy 배열)
"""
# 실제 칸 수는 코너 수보다 한 개 더 많음
cols = corners_cols + 1
rows = corners_rows + 1
# 체스보드 총 크기 계산
board_width = cols * tile_size
board_height = rows * tile_size
# 체스보드 이미지 생성
chessboard = np.zeros((board_height, board_width), dtype=np.uint8)
# 흰색(255)과 검은색(0) 타일 생성
for row in range(rows):
for col in range(cols):
if (row + col) % 2:
chessboard[row*tile_size:(row+1)*tile_size,
col*tile_size:(col+1)*tile_size] = 255 # 흰색 셀
return chessboard
# 함수 사용 예
corners_cols = 9 # 열 방향 코너 수
corners_rows = 5 # 행 방향 코너 수
tile_size = 50 # 각 타일의 크기는 50x50 픽셀
# 체스보드 생성
chessboard_image = create_chessboard(corners_cols, corners_rows, tile_size)
# 생성된 체스보드 이미지 보여주기
cv.imshow('Generated Chessboard', chessboard_image)
ret, corners = cv.findChessboardCorners(chessboard_image, (corners_cols,corners_rows), None)
if ret:
img = chessboard_image.copy()
img = cv.cvtColor(img, cv.COLOR_GRAY2BGR)
cv.drawChessboardCorners(img, (corners_cols, corners_rows), corners, ret)
cv.imshow('Detected Corners', img)
cv.waitKey(0)
cv.destroyAllWindows()
결과는 다음과 같음.
728x90
'Python' 카테고리의 다른 글
[Py] sys.exit() (0) | 2024.09.11 |
---|---|
[Py] Namespace Package (0) | 2024.09.11 |
[NumPy] ravel() 메서드 with flatten() 메서드 (0) | 2024.09.09 |
[NumPy] 생성 및 초기화, 기본 조작 (1) (0) | 2024.09.09 |
[Py] Python에서 string formatting. (0) | 2024.09.04 |