|
- # 标定并校正
-
- import cv2
- import numpy as np
- import glob
-
- # Defining the dimensions of checkerboard
- CHECKERBOARD = (4, 4)
- criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
-
- # Creating vector to store vectors of 3D points for each checkerboard image
- objpoints = []
- # Creating vector to store vectors of 2D points for each checkerboard image
- imgpoints = []
-
- # Defining the world coordinates for 3D points
- objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
- objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
- prev_img_shape = None
-
- # Extracting path of individual image stored in a given directory
- images = glob.glob('./images/*.JPG')
- for fname in images:
- img = cv2.imread(fname)
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- # Find the chess board corners
- # If desired number of corners are found in the image then ret = true
- ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD,
- cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
-
- """
- If desired number of corner are detected,
- we refine the pixel coordinates and display
- them on the images of checker board
- """
- if ret == True:
- objpoints.append(objp)
- # refining pixel coordinates for given 2d points.
- corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
- imgpoints.append(corners2)
-
- # Draw and display the corners
- img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
- cv2.imwrite("./save/checkerboardCallbration.jpg", img)
- h, w = img.shape[:2]
-
-
- """
- Performing camera calibration by
- passing the value of known 3D points (objpoints)
- and corresponding pixel coordinates of the
- detected corners (imgpoints)
- """
- ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
- mtx = mtx.astype(float)
- dist = dist.astype(float)
-
- print("Camera matrix : \n") # 内参矩阵
- print(mtx)
- print("dist : \n") # 畸变系数
- print(dist)
- print("rvecs : \n") # 旋转向量
- print(rvecs)
- print("tvecs : \n") # 平移向量
- print(tvecs)
- print("-----------------------------------------------------")
-
- # 畸变校正
- img = cv2.imread(r"./jiaoZheng/uav.JPG")
-
- print("------------------使用undistort函数-------------------")
- dst = cv2.undistort(img, mtx, dist, None, mtx)
- print("dst的大小为:", dst.shape)
- cv2.imwrite("./save/uav-dst-0418.JPG", dst)
-
- print("-------------------计算反向投影误差-----------------------") # 利用反向投影误差对我们找到的参数的准确性进行估计,得到的结果越接近 0 越好。
- tot_error = 0
- for i in range(len(objpoints)):
- img_points2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
- error = cv2.norm(imgpoints[i], img_points2, cv2.NORM_L2) / len(img_points2)
- print("error of " + str(i) + ": ", error)
- tot_error += error
-
- mean_error = tot_error / len(objpoints)
- print("total error: ", tot_error)
- print("mean error: ", mean_error)
-
-
-
-
-
|