본문 바로가기
Python

[CV] cv2.calibrateCamera

by ds31x 2024. 9. 22.

cv2.calibrateCamera

retval, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(
    objectPoints,
    imagePoints,
    imageSize,
    cameraMatrix=None,
    distCoeffs=None,
    rvecs=None,
    tvecs=None,
    flags=0,
    criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)
)

Parameters

  1. objectPoints
    • 타입: 리스트;
      • 각 요소는 (N, 3) 또는 (1, N, 3) 형태의 NumPy 배열.
      • 여기서 N은 이미지당 corner (points)의 갯수.
    • 설명:
      • 실제 세계의 3D 점들의 좌표.
      • 각 캘리브레이션 이미지에 대한 3D 좌표를 가지고 있음.
    • 기본값:
      • 없음 (필수 입력)
  2. imagePoints
    • 타입: 리스트;
      • 각 요소는 (N, 2) 또는 (1, N, 2) 형태의 NumPy 배열.
    • 설명:
      • 이미지 평면상의 2D 점들의 좌표.
      • objectPoints의 3D 점들이 이미지에 투영되어 감지된 좌표들 포함.
    • 기본값:
      • 없음 (필수 입력)
  3. imageSize
    • 타입: 튜플
      • (width, height) 형태.
    • 설명:
      • 캘리브레이션에 사용된 이미지의 크기.
      • 픽셀 단위.
    • 기본값:
      • 없음 (필수 입력)
  4. cameraMatrix (옵션)
    • 타입:
      • (3, 3) 형태의 NumPy 배열 또는 None.
    • 설명:
      • 입력/출력 카메라 매트릭스.
      • argument로 초기 intrinsic parameters를 제공할 때 이용.
    • 기본값:
      • None (함수 내에서 자동으로 초기화)
  5. distCoeffs (옵션)
    • 타입:
      • (4, 1), (5, 1), (8, 1), (12, 1) 형태의 NumPy 배열
      • 또는 None.
    • 설명:
      • 입력/출력 distortion coefficient vector(왜곡 계수 벡터).
      • 초기 왜곡 계수를 제공할 때 이용.
    • 기본값: None (함수 내에서 자동으로 초기화됩니다)
  6. rvecs (옵션)
    • 타입: 리스트;
      • 각 요소는 (3, 1) 형태의 NumPy 배열.
    • 설명:
      • 각 캘리브레이션 이미지에 대한 rotation 벡터: Rodriguse Vector
    • 기본값:
      • None (함수에서 자동으로 계산되므로 일반적으로 지정하지 않음)
  7. tvecs (옵션)
    • 타입: 리스트;
      • 각 요소는 (3, 1) 형태의 NumPy 배열.
    • 설명:
      • 각 캘리브레이션 이미지에 대한 Translation Vector.
    • 기본값:
      • None (함수에서 자동으로 계산되므로 일반적으로 지정하지 않)
  8. flags (옵션)
    • 타입:
      • 정수형.
    • 설명:
      • 캘리브레이션 프로세스를 제어하는 Flags.
      • 여러 Flags를 Bitwise OR 연산자 |를 사용하여 결합.
    • 기본값:
      • 0 (기본 동작)
    • 주요 플래그:
      • cv2.CALIB_USE_INTRINSIC_GUESS (1): cameraMatrix에 제공된 초기 값을 사용.
      • cv2.CALIB_FIX_PRINCIPAL_POINT (4): Principal Point를 고정.
      • cv2.CALIB_FIX_ASPECT_RATIO (2): Aspect Ratio를 고정.
      • cv2.CALIB_ZERO_TANGENT_DIST (8): Tanggent Distortion Coef.를 0으로 설정.
      • cv2.CALIB_FIX_K1~cv2.CALIB_FIX_K6: 특정 Distortion Coef.를 고정.
      • cv2.CALIB_RATIONAL_MODEL (16384): rational distortion coef.을 사용.
  9. criteria (옵션)
    • 타입: 튜플
      • (type, maxCount, epsilon) 형태.
    • 설명:
      • 최적화 알고리즘의 종료 조건.
      • 알고리즘이 원하는 정확도(epsilon)에 도달하거나
      • 최대 반복 횟수(maxCount)에 도달하면 종료.
    • 기본값:
      • (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)
    • 기본 종료 조건 설명:
      • type: cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER (두 조건 모두 사용)
      • maxCount: 30 (최대 30번의 반복)
      • epsilon: 1e-6 (허용 오차)

Return Value

  1. retval
    • 타입:
      • 부동소수점(float).
    • 설명:
      • 전체 RMS Reprojection Error(재투영 오차).
      • 캘리브레이션의 품질을 나타내며, 값이 작을수록 좋.
  2. cameraMatrix
    • 타입:
      • (3, 3) 형태의 NumPy 배열.
    • 설명:
      • 계산된 카메라 매트릭스(Intrinsic Parameters).
  3. distCoeffs
    • 타입:
      • NumPy 배열.
    • 설명:
      • Distortion Error Vector.
  4. rvecs
    • 타입: 리스트;
      • 각 요소는 (3, 1) 형태의 NumPy 배열.
    • 설명:
      • 각 캘리브레이션 이미지에 대한 rotation vector.
  5. tvecs
    • 타입: 리스트;
      • 각 요소는 (3, 1) 형태의 NumPy 배열.
    • 설명:
      • 각 캘리브레이션 이미지에 대한 Translation Vector.

파라미터 상세 설명

1. objectPoints

  • 필수 입력이며, 실제 세계에서의 3D 좌표를 제공.
  • 일반적으로 체스보드 패턴의 코너 좌표를 사용, 단위는 밀리미터나 센티미터 등 일관되게 사용.
  • 각 이미지마다 동일한 패턴의 좌표를 사용.
  • 실제로는 리스트의 각 요소가 이미지마다의 3D 점들의 배열.

2. imagePoints

  • 필수 입력이며, 각 이미지에서 감지된 2D 코너 좌표를 제공.
  • objectPoints의 3D 점들과 정확히 대응되어야 함 (같은 숫자).

3. imageSize

  • 필수 입력이며, 캘리브레이션에 사용된 이미지의 크기를 (width, height) 형태의 튜플로 제공.
  • 이 크기는 imagePoints를 얻을 때 사용된 이미지의 크기와 일치해야 .

4. cameraMatrix

  • 초기 카메라 매트릭스를 제공하고자 할 때 이용.
  • 기본값은 None이며, 이 경우 함수 내에서 합리적인 초기 추정값을 자동으로 생성.
  • flagscv2.CALIB_USE_INTRINSIC_GUESS를 설정하면
  • 이 parameter로 제공된 cameraMatrix를 초기값으로 사용.

5. distCoeffs

  • 초기 distortion coefficient vector를 제공하고자 할 때 사용.
  • 기본값은 None이며, 이 경우 함수 내에서 초기값을 0으로 설정.
  • https://dsaint31.tistory.com/614
 

[DIP] Radial distortion : barrel and pincushion distortions

0. Remappingmatrix equation으로 표현할 수 없는 형태(non-linear)의 이미지 모양 변환을 위한 기능.OpenCV에서 cv2.remap() 함수를 통해 제공되며,lens distortion 및radial distortion등을모델링하거나 제거하는데 사용

dsaint31.tistory.com

 

[DIP] Tangential Distortion (접선왜곡)

접선 왜곡(Tangential distortion)은 일반적인 렌즈를 사용하는 광학 시스템에서 발생하는 렌즈 왜곡(lens distortion)의 한 유형임. 렌즈 축에서 멀어진 객체의 위치가 왜곡되어 이미지 포인트가 이상적

dsaint31.tistory.com

6. rvecstvecs

  • 각 이미지에 대한 회전 및 변환 벡터를 저장.
  • 기본값은 None이며, 함수 실행 후 결과 값으로 반환.

7. flags

  • 캘리브레이션 과정을 제어하는 flags.
  • 기본값은 0으로, 이는 특별한 제약 없이 기본 캘리브레이션을 수행함을 의미.

8. criteria

  • Optimization 의 종료 조건을 지정.
  • 기본값은 (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)로 설정됨.
  • 이 값은 알고리즘이 최대 30번의 반복을 수행하거나, 오차가 1e-6 이하로 떨어지면 종료됨을 의미.

예제 코드

import cv2
import numpy as np
import glob

# 코너 세부 조정을 위한 종료 조건 (기본값과 동일)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)

# 체스보드 패턴의 내부 코너 수 설정
pattern_size = (7, 6)  # x축에 7개, y축에 6개의 내부 코너

# 실제 세계의 3D 점 준비
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)

object_points = []  # 3D 점들의 배열
image_points = []   # 2D 점들의 배열

# 캘리브레이션 이미지 불러오기
images = glob.glob('calibration_images/*.jpg')

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    image_size = gray.shape[::-1]

    # 체스보드 코너 찾기
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

    if ret:
        object_points.append(objp)
        # 코너 위치 세부 조정
        corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
        image_points.append(corners2)

        # 코너 그리기 및 표시 (옵션)
        cv2.drawChessboardCorners(img, pattern_size, corners2, ret)
        cv2.imshow('Calibration Image', img)
        cv2.waitKey(100)

cv2.destroyAllWindows()

# 카메라 캘리브레이션 수행 (기본값 사용)
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(
    object_points,
    image_points,
    image_size,
    cameraMatrix=None,
    distCoeffs=None,
    flags=0,
    criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)
)

# 결과 출력
print("RMS 재투영 오차:", ret)
print("카메라 매트릭스:\n", camera_matrix)
print("왜곡 계수:\n", dist_coeffs)

추가 정보

  • Distortion Coefficient Vector의 형태:
    • 기본적으로 radial distortion coef. k1,k2,k3
    • tangetial distortion coef. p1,p2로 구성된
    • (k1, k2, p1, p2, k3)를 사용.
    • flags를 통해 다른 형태의 distortion coef. vector를 사용 가능.
  • 캘리브레이션 품질 평가:
    • 반환된 retval 값(RMS reprojection error)을 통해 캘리브레이션의 품질을 평가 가능.
    • 값이 작을수록 캘리브레이션이 정확함을 의미.
  • 결과 저장 및 활용:
    • 캘리브레이션 결과를 저장하여
    • 이후 이미지 왜곡 보정이나 3D Reconstruction에 활용.

image 왜곡보정

undistorted_img = cv2.undistort(img, camera_matrix, dist_coeffs)

Videostream에서의 왜곡보정

h, w = img.shape[:2]
new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coeffs, (w, h), 1, (w, h))
mapx, mapy = cv2.initUndistortRectifyMap(camera_matrix, dist_coeffs, None, new_camera_matrix, (w, h), 5)
undistorted_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)

같이 보면 좋은 자료들

https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html

 

OpenCV: Camera Calibration

Goal In this section, we will learn about types of distortion caused by cameras how to find the intrinsic and extrinsic properties of a camera how to undistort images based off these properties Basics Some pinhole cameras introduce significant distortion t

docs.opencv.org

https://dsaint31.tistory.com/748

 

[CV] Geometric Camera Model and Camera Calibration: Pinhole Camera

Geometric Camera Model (or Camera Model)은 real world 와  camera의 pose에 따라,real world 와  camera의 image 간의 관계를approximation 함. 이 문서에서는 기본적인 Pinhole Camera Model에 기반하여 설명함.pinhole camera는

dsaint31.tistory.com

https://ds31x.tistory.com/339

 

[CV] Chessboard관련 함수들: OpenCV

cv.findChessboardCorners()cv.findChessboardCorners() 함수는 OpenCV 라이브러리에서 제공하는 함수chessboard 패턴의 코너를 찾는 데 사용됨.이 함수는 camera calibration 과정에서 자주 사용됨.입력 이미지에서 chessbo

ds31x.tistory.com

https://dsaint31.tistory.com/733

 

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

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

dsaint31.tistory.com

 

'Python' 카테고리의 다른 글

[Py] Debugging: pdb and ipdb  (0) 2024.09.25
[Py] assert 구문 (statement)  (0) 2024.09.24
[Etc] SW Version: Semantic Versioning + package.version  (0) 2024.09.19
[Summary] NumPy(Numerical Python)  (1) 2024.09.12
[Py] sys.exit()  (0) 2024.09.11