畸变矫正后 是不是undistort参数不对
import cv2
import numpy as np
import glob
import os
# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)
save_dir ='./carb/'
# 获取标定板角点的位置
objp = np.zeros((11 * 8, 3), np.float32)
objp[:, :2] = np.mgrid[0:11, 0:8].T.reshape(-1, 2) # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y
obj_points = [] # 存储3D点
img_points = [] # 存储2D点
images = glob.glob("./imagedownResize/*.png")
print(images)
# print(len(images))
i=0;
for fname in images:
cv2.namedWindow('FoundCorners', cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
img = cv2.imread(fname)
i += 1;
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
size = gray.shape[::-1]
ret, corners = cv2.findChessboardCorners(gray, (11, 8), None)
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) # 在原角点的基础上寻找亚像素角点
if [corners2]:
img_points.append(corners2)
else:
img_points.append(corners)
cv2.drawChessboardCorners(img, (11, 8), corners, ret) # 记住,OpenCV的绘制函数一般无返回值
cv2.imshow('FoundCorners', img)
cv2.waitKey(1)
print(len(img_points))
cv2.destroyAllWindows()
# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)
print("ret:", ret)
print("mtx:\n", mtx) # 内参数矩阵
print("dist:\n", dist) # 畸变系数 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs) # 旋转向量 # 外参数
print("tvecs:\n", tvecs ) # 平移向量 # 外参数
print("-----------------------------------------------------")
for frame in images:
# cv2.namedWindow('FoundCorners', cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
img_name = frame.split(os.sep)[-1]
img = cv2.imread(frame)
h, w = img.shape[:2]
# print("h,w",h,w)
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))#显示更大范围的图片(正常重映射之后会删掉一部分图像)
dst = cv2.undistort(img,mtx,dist,None,newcameramtx)
x,y,w,h = roi
# print("x y w h", x,y,w,h)
# dst1 = dst[y:y+h,x:x+w]
cv2.imwrite(save_dir + os.sep + img_name, dst)