본문 바로가기
목차
Python

[CV] Chessboard관련 함수들: OpenCV

by ds31x 2024. 9. 10.
728x90
반응형

cv.findChessboardCorners()

cv.findChessboardCorners() 함수는 OpenCV 라이브러리에서 제공하는 함수

chessboard 패턴의 코너를 찾는 데 사용됨.

  • 이 함수는 camera calibration 과정에서 자주 사용됨.
  • 입력 이미지에서 chessboard의 코너를 정확하게 찾아냄.

cv.cornerSubPix와 자주 같이 사용됨.

https://dsaint31.tistory.com/733

 

[OpenCV] cornerSubPix : 코너 검출 정확도 향상

OpenCV 라이브러리에서 제공하는 cornerSubPix는코너 검출의 정확도를 높이기 위해 사용되는 함수임.이 함수는 초기 검출된 코너 위치를 서브픽셀 수준으로 정밀하게 조정하기 위해 사용됨.함수 설

dsaint31.tistory.com


Function Signature

retval, corners = cv.findChessboardCorners(
    image, 
    patternSize, 
    flags=None
)

 

Parameters

  • image:
    • chessboard corner를 찾을 gray-scale 이미지 (Grayscale만 가능함).
    • 보통 cv.cvtColor() 함수에서 cv.COLOR_BGR2GRAY 사용하여 컬러 이미지를 그레이스케일로 변환.
  • patternSize:
    • chessboard의 각 치수,
      • corner는 chessboard에서 검은색 square가 만난 점 들의 grid의 dimension을 가리킴.
    • 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 등의 플래그를 사용할 수 있음.

return value (turple)

  • 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 point들의 dimensions
      • corner는 chessboard에서 검은색 square가 만난 점을 가리킴.
    • corner의 수를 (가로, 세로) tuple로 표현: (# 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.


같이 보면 좋은 자료들

2024.09.22 - [Python] - [CV] cv2.calibrateCamera

 

[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

2025.07.04 - [Python] - cv.getOptimalNewCameraMatrix()

 

cv.getOptimalNewCameraMatrix()

관련 공식 문서OpenCV 공식 튜토리얼:https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html OpenCV: Camera CalibrationGoal In this section, we will learn about types of distortion caused by cameras how to find the intrinsic and extrinsic

ds31x.tistory.com

 

2025.07.04 - [Python] - cv.undistort()와 cv.initUndistortRectifyMap() + cv.remap()

 

cv.undistort()와 cv.initUndistortRectifyMap() + cv.remap()

OpenCV는cv.calibrateCamera() 를 통해 얻은camera matrix와 distortion coefficients를 이용하여undistorted image를 생성하는 방법으로다음 2가지를 지원함:cv.undistort()cv.initUndistortRectifyMap() + cv.remap()관련 gist URLhttps://g

ds31x.tistory.com

 

https://gist.github.com/dsaint31x/5c5dfe8e2a57bd6ffe8560d6a2f3b86b

 

dip_camera_calibration.ipynb

dip_camera_calibration.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


 

728x90

'Python' 카테고리의 다른 글

[Py] sys.exit()  (1) 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