본문 바로가기
Python

[CV] Chessboard관련 함수들: OpenCV

by ds31x 2024. 9. 10.

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 배열 형태로 반환.

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()

결과는 다음과 같음.

왼쪽은 코너를 표시한 이미지이고 오른쪽은 생성된 chessboard.

728x90