OpenCV 张正友标定法的实现

本文介绍了如何使用OpenCV库中的张正友相机标定法进行摄像头标定,包括角点提取、内参外参计算和图像矫正。通过找到棋盘格的角点,使用calibrateCamera函数计算摄像头的内参、外参和畸变参数,并应用undistort函数矫正图像。详细阐述了标定流程和关键函数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  关于张正友标定法的原理,网上的资料很多,本人虽然看了一些,但觉得还没有到能讲的非常清楚的程度,因此不在这里做太多原理描述。有兴趣了解细节的可以看张大神的原文,或者这篇文章

  需要大概知道的是,相机标定中内参、外参和畸变参数的概念。

  内参有五个,分别是:

  摄像头拍摄到的物体和实际物体在x,y轴上的映射关系(两个参数)。

  摄像头中心和图像中心的偏移关系(两个参数)。

  摄像头和镜头安装非完全垂直,存在一个角度的偏差。(一个参数)

  外参有六个,分别是x,y,z方向上的平移和旋转。

张正友标定法是一种用于相机标定的经典方,由张正友在1998年提出。该方通过使用平面标定板(如棋盘格)来估计相机的内参和外参。以下是使用OpenCV实现张正友标定法的主要步骤: 1. **准备标定板**:通常使用棋盘格标定板。确保标定板上有足够的角点,以便相机能够清晰捕捉到。 2. **采集图像**:从不同角度和位置拍摄多张标定板的图像。图像数量越多,标定结果越准确。 3. **检测角点**:使用OpenCV的函数检测图像中的棋盘格角点。 4. **计算相机矩阵和畸变系数**:使用检测到的角点计算相机的内参矩阵和畸变系数。 5. **优化标定结果**:通过最小化重投影误差来优化标定结果。 以下是一个简单的OpenCV代码示例,展示了如何实现张正友标定法: ```python import cv2 import numpy as np import glob # 设置棋盘格参数 chessboard_size = (9, 6) square_size = 1.0 # 棋盘格方格的实际大小 # 准备对象点,如 (0,0,0), (1,0,0), ..., (8,5,0) objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) objp *= square_size # 存储所有图像的对象点和图像点 objpoints = [] # 3d 点在真实世界空间 imgpoints = [] # 2d 点在图像平面 # 读取所有标定图像 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, chessboard_size, None) # 如果找到角点,添加到对象点和图像点中 if ret: objpoints.append(objp) imgpoints.append(corners) # 可视化角点 cv2.drawChessboardCorners(img, chessboard_size, corners, ret) cv2.imshow('Chessboard Corners', img) cv2.waitKey(500) cv2.destroyAllWindows() # 标定相机 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) print("相机内参矩阵:\n", mtx) print("畸变系数:\n", dist) # 保存标定结果 np.savez('calib_result.npz', mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs) ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值