cameraMatrix = getOptimalNewCameraMatrix parameter alpha distCoeffs = Free scaling parameter alpha = between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image) -> 1에 가까울수록 왜곡을 펼 때 잘라낸 부분들을 더 보여준다. -> 전체를 보고 싶다면 1, 펴진 부분만 보고 싶다면 0에 가깝게 인자 값을 주면 된다.
다음 글에서는 구멍이 뚫리지 않게 왜곡된 이미지를 펴는 방법에 대해 알려드리겠습니다.
5. 코드
import numpy as np
import cv2
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
wc = 10 ## 체스 보드 가로 패턴 개수 - 1
hc = 7 ## 체스 보드 세로 패턴 개수 - 1
objp = np.zeros((wc * hc, 3), np.float32)
objp[:, :2] = np.mgrid[0:wc, 0:hc].T.reshape(-1, 2)
objpoints = []
imgpoints = []
file = 'C:\\Users\\bit\\Downloads\\new test.png' ## 체스 보드 이미지
dist_file = 'C:\\Users\\bit\\Downloads\\lane_test.png' ## 왜곡된 이미지 (같은 화각으로 찍은 이미지)
img = cv2.imread(file)
_img = cv2.resize(img, dsize = (640, 480), interpolation = cv2.INTER_AREA)
# cv2.imshow('img', _img)
gray = cv2.cvtColor(_img, cv2.COLOR_BGR2GRAY) ## gray scale로 바꾸기
# cv2.waitKey(0)
ret, corners = cv2.findChessboardCorners(gray, (wc, hc), None) ## 체스 보드 찾기
print(ret)
## 만약 ret값이 False라면, 체스 보드 이미지의 패턴 개수를 맞게 했는지 확인하거나 (wc, hc)
체스 보드가 깔끔하게 나온 이미지를 가져와야 한다
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (10, 10), (-1, -1), criteria) ## Canny86 알고리즘으로
도형이 겹치는 코너 점을 찾는다
imgpoints.append(corners2)
## 찾은 코너 점들을 이용해 체스 보드 이미지에 그려넣는다
img = cv2.drawChessboardCorners(_img, (wc, hc), corners2, ret)
# cv2.imshow('img', img)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) ## 왜곡 펴기
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1)
## mtx = getOptimalNewCameraMatrix parameter alpha
## dist = Free scaling parameter
## 4번째 인자 = between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image)
## 1에 가까울수록 왜곡을 펼 때 잘라낸 부분들을 더 보여준다
## 전체를 보고 싶다면 1, 펴진 부분만 보고 싶다면 0에 가깝게 인자 값을 주면 된다
dst = cv2.undistort(img, mtx, dist) ## getOptimalNewCameraMatrix 함수를 쓰지 않은 이미지
dst2 = cv2.undistort(img, mtx, dist, None, newcameramtx) ## 함수를 쓴 이미지
cv2.imshow('num1', dst)
cv2.imshow('num2', dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()
[OpenCV]Camera Calibration(카메라 왜곡 펴기)
OpenCV Version = 4.2.0.34
2020/5/3 - [OpenCV] Camera Calibration 2 (카메라 구멍 없이 왜곡 펴기)
1. Chessboard image
wc = 10 ## 체스 보드 가로 패턴 개수 - 1
hc = 7 ## 체스 보드 세로 패턴 개수 - 1
2. drawChessboardCorners
cv2.findChessboardCorners(image, patternSize[, corners[, flags]]) → retval, corners
image - 8비트 grayscale이거나 color image
patternSize - 체스보드 row, column
corners - 코너를 찾으면 array로 return
만약 ret값이 False라면, 체스 보드 이미지의 패턴 개수를 맞게 했는지 확인하거나 (wc, hc) 체스 보드가 깔끔하게 나온 이미지를 가져와야 한다.
cv.cornerSubPix(image, corners, win, zero_zone, criteria)
Canny86 알고리즘(중심 q에서 p 주변 부근에 있는 지점까지의 모든 벡터가 이미지 및 측정 노이즈 q와 p에 따라 이미지 기울기와 직교한다.)으로 도형이 겹치는 코너 점을 찾는다.
cv2.drawChessboardCorners(image, patternSize, corners, patternWasFound)
cornerSubpix에서 return 받은 array를 corners에 넣고 ret값을 patternWasFound에 넣으면 빨간색 원 또는 보드를 찾은 경우 선으로 연결된 컬러 모서리로 감지 된 개별 체스 판 모서리를 그려준다.
3. undistort without getOptimalNewCameraMatrix
4. undistort with getOptimalNewCameraMatrix
cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, alpha[, newImgSize[, centerPrincipalPoint]])→ retval, validPixROI
cameraMatrix = getOptimalNewCameraMatrix parameter alpha
distCoeffs = Free scaling parameter
alpha = between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image)
-> 1에 가까울수록 왜곡을 펼 때 잘라낸 부분들을 더 보여준다.
-> 전체를 보고 싶다면 1, 펴진 부분만 보고 싶다면 0에 가깝게 인자 값을 주면 된다.
다음 글에서는 구멍이 뚫리지 않게 왜곡된 이미지를 펴는 방법에 대해 알려드리겠습니다.
5. 코드
'OpenCV > OpenCV' 카테고리의 다른 글