import cv2 import numpy as np import glob # 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001(亚像素级别的角点检测) # TERM_CRITERIA_MAX_ITER表示最大迭代次数,cv2.TERM_CRITERIA_EPS表示误差限制,迭代次数上限为300次,误差限制为0.001 criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001) # 获取标定板角点的位置(4*4)标定板格子数-1 objp = np.zeros((4 * 4, 3), np.float32) # 仅算内角点,注意内角点即不靠近边界的角点 # 将世界坐标系建在标定板上,Z坐标全部为0,只需要赋值x和y, objp[:, :2] = np.mgrid[0:4, 0:4].T.reshape(-1, 2) obj_points = [] # 存储3D点 img_points = [] # 存储2D点 # glob模块查找符合特定规则的文件路径名,获取指定路径下的图片 images = glob.glob(r"E:\\DIRPIC\\pic\\camera\\*.png") for fname in images: img = cv2.imread(fname) # 图像灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) size = gray.shape[::-1] # 倒着取值 # 获取图像角点(gray:灰度图,(4,4)棋盘中每行和每列角点的个数)(返回布尔值和找到的角点) ret, corners = cv2.findChessboardCorners(gray, (4, 4), None) if ret: # 存储三维角点坐标 obj_points.append(objp) # 在原角点的基础上寻找亚像素角点,并存储二维角点坐标 corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria) # print(corners2) if [corners2]: img_points.append(corners2) else: img_points.append(corners) # 标定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None) print('------照相机内参与外参------') print("ret:", ret) # 标定误差 print("mtx:\n", mtx) # 内参矩阵(fx,fy, u,v) print("dist:\n", dist) # 畸变参数 distortion coefficients = (k_1,k_2,p_1,p_2,k_3) print("rvecs:\n", rvecs) # 旋转向量 # 外参数 print("tvecs:\n", tvecs) # 平移向量 # 外参数 img = cv2.imread(images[3]) print(images[3]) h, w = img.shape[:2] # 计算一个新的相机内参矩阵和感兴趣区域(ROI),矫正畸变 newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) print('------新内参------') print(newcameramtx) print('------畸变矫正后的图像new_img.jpg------') newimg = cv2.undistort(img, mtx, dist, None, newcameramtx) # x, y, w, h = roi # newimg = newimg[y:y + h, x:x + w] cv2.imwrite('new_img.jpg', newimg) print("new_img的大小为:", newimg.shape)
python相机标定
最新推荐文章于 2024-06-01 23:35:30 发布