最近在做相机畸变的矫正,视觉工程师必备技能。
图像标定方法:
相机标定方法有:传统相机标定法、主动视觉相机标定方法、相机自标定法、零失真相机标定法等。这些标定方法的目的就是求出相机的内参、外参和畸变系数。
我们使用张正友标定法:
张正友相机标定法是张正友教授在1998年提出的基于单平面棋盘格的相机标定方法。该方法介于传统标定法和自标定法之间,但克服了传统标定法需要高精度三维标定物的缺点,而仅需使用一个打印出来的棋盘格就可以。同时相对于自标定法而言,提高了精度,便于操作。因此张氏标定法被广泛应用于计算机视觉方面。
离线标定代码:
棋盘格10*7 ,计算内参矩阵+畸变系数。
import cv2
import numpy as np
import glob
import os
# 定义标定板的尺寸
board_size = (10, 7) # 棋盘格的内部角点数目
# 创建标定板坐标
obj_points = [] # 存储标定板上的三维坐标
objp = np.zeros((10*7, 3), np.float32)
spacing = 2.2 # 新的像素间距,单位为厘米
objp[:, :2] = np.mgrid[0:10, 0:7].T.reshape(-1, 2) * spacing
# 遍历文件夹中的图像文件并读取图像
images = []
image_files = glob.glob('your/path/*.jpg') # 您图片所在文件夹的路径和文件扩展名
for image_file in image_files:
img = cv2.imread(image_file)
images.append(img)
# 检查是否有图像可处理
if not images:
print("未找到图像文件。请检查图像文件夹路径和文件扩展名是否正确。")
else:
# 用于存储图像上的角点坐标
img_points = []
# 使用第一个图像的形状来获取 gray 的形状
gray = cv2.cvtColor(images[0], cv2.COLOR_BGR2GRAY)
gray_shape = gray.shape[::-1]
# 在每个图像上查找角点
for img in images:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, board_size, None)
if ret:
obj_points.append(objp)
img_points.append(corners)
# 进行相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray_shape, None, None)
# 打印相机标定结果
print("相机内参矩阵 (Camera Matrix):")
print(mtx)
print("\n畸变系数 (Distortion Coefficients):")
print(dist)
# 保存标定结果到文件
fs = cv2.FileStorage('calibration_results.yaml', cv2.FILE_STORAGE_WRITE)
fs.write('camera_matrix', mtx)
fs.write('distortion_coefficients', dist)
fs.release()
# 进行图像矫正
corrected_images = []
for img in images:
corrected_img = cv2.undistort(img, mtx, dist)
corrected_images.append(corrected_img)
# 保存矫正后的图像到指定文件夹
output_folder = 'your/path/folder' # 指定保存矫正后图像的文件夹路径
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for i, corrected_img in enumerate(corrected_images):
output_file = os.path.join(output_folder, f'corrected_image_{i}.jpeg')
cv2.imwrite(output_file, corrected_img)
print(f"矫正后的图像已保存在 {output_folder} 文件夹中。")