图像内参标定(张正友)

最近在做相机畸变的矫正,视觉工程师必备技能。

图像标定方法:

相机标定方法有:传统相机标定法、主动视觉相机标定方法、相机自标定法、零失真相机标定法等。这些标定方法的目的就是求出相机的内参、外参和畸变系数

我们使用张正友标定法:

张正友相机标定法是张正友教授在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} 文件夹中。")

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值