以下是使用OpenCV实现张正友相机标定法,并对一幅畸变图像进行矫正的代码示例:
import numpy as np
import cv2
import glob
# 准备对象点和图像点
obj_pts = [] # 3D对象点
img_pts = [] # 2D图像点
# 生成对象点坐标,因为是棋盘格,假设z=0
obj_p = np.zeros((6*8, 3), np.float32)
obj_p[:,:2] = np.mgrid[0:8, 0:6].T.reshape(-1, 2)
# 读取标定图像
images = glob.glob('calibration_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, (8,6), None)
if ret == True:
obj_pts.append(obj_p)
# 优化角点坐标
corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
img_pts.append(corners2)
# 绘制角点并显示
img = cv2.drawChessboardCorners(img, (8,6), corners2, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 进行相机标定
ret, cam_mtx, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_pts, img_pts, gray.shape[::-1], None, None)
# 打印相机内部参数矩阵和畸变系数矩阵
print("相机内部参数矩阵:\n", cam_mtx)
print("畸变系数矩阵:\n", dist_coefs)
# 对一幅畸变图像进行矫正
img = cv2.imread('test_image.jpg')
h, w = img.shape[:2]
new_cam_mtx, roi = cv2.getOptimalNewCameraMatrix(cam_mtx, dist_coefs, (w,h), 1, (w,h))
dst = cv2.undistort(img, cam_mtx, dist_coefs, None, new_cam_mtx)
# 显示畸变矫正前后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Undistorted Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述示例代码中,calibration_images/
目录下存放了用于相机标定的棋盘格图像。首先,通过cv2.findChessboardCorners()
函数找到棋盘格的角点,并优化角点坐标。然后,将对象点和图像点分别存储到obj_pts
和img_pts
中。之后,使用cv2.calibrateCamera()
函数进行相机标定,获取相机内部参数矩阵、畸变系数矩阵等标定结果。最后,对一幅畸变图像进行矫正,并显示矫正前后的图像。
注意:需要根据实际情况调整棋盘格的大小和棋盘格内角点的数量,以及修改图像路径等相关参数。