opencv相机标定(OpenCV相机标定例程)

# 简介在计算机视觉领域中,相机标定是一个至关重要的步骤,它用于确定相机的内外参数,包括焦距、主点位置、畸变系数等。OpenCV 是一个广泛使用的开源计算机视觉库,提供了强大的工具来实现相机标定功能。通过 OpenCV 的相机标定功能,可以显著提高图像处理和分析的准确性。本文将详细介绍如何使用 OpenCV 进行相机标定。# 相机标定的基本原理## 内参与外参-

内参

:描述了相机的内部特性,如焦距、主点位置。 -

外参

:描述了相机相对于世界坐标系的位置和方向。## 畸变校正由于镜头制造工艺的原因,实际拍摄的图像可能会出现径向畸变和切向畸变。通过标定可以校正这些畸变,从而提高图像的质量。# 使用OpenCV进行相机标定## 准备工作### 棋盘格图片采集1. 选择一个标准的棋盘格图案。 2. 在不同的角度和距离下拍摄多张照片。### 安装OpenCV确保你的开发环境中已经安装了最新版本的 OpenCV 库。```bash pip install opencv-python ```## 标定步骤### 1. 加载棋盘格图片首先需要加载之前拍摄的所有棋盘格图片。```python import cv2 import numpy as np import glob# 设置棋盘格尺寸 CHECKERBOARD = (6,9) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)# 创建对象点 objp = np.zeros((1, CHECKERBOARD[0]

CHECKERBOARD[1], 3), np.float32) objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)# 存储对象点和图像点 objpoints = [] imgpoints = []images = glob.glob('

.jpg')for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 寻找角点ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)if ret == True:objpoints.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)imgpoints.append(corners2)# 绘制并显示角点cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)cv2.imshow('img', img)cv2.waitKey(500)cv2.destroyAllWindows() ```### 2. 执行标定利用收集到的对象点和图像点,执行相机标定。```python ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)print("相机矩阵:\n", mtx) print("畸变系数:\n", dist) print("旋转向量:\n", rvecs) print("平移向量:\n", tvecs) ```### 3. 畸变校正最后一步是应用标定结果对图像进行畸变校正。```python img = cv2.imread('test_image.jpg') h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))# 使用校正方法1 dst = cv2.undistort(img, mtx, dist, None, newcameramtx)# 使用校正方法2 mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, (w,h), 5) dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)x, y, w, h = roi dst = dst[y:y+h, x:x+w]cv2.imwrite('calibresult.png', dst) ```# 结论通过上述步骤,我们可以成功地使用 OpenCV 对相机进行标定,并纠正图像中的畸变。这不仅提高了图像处理的精度,还为后续的计算机视觉任务奠定了坚实的基础。希望本文能够帮助你更好地理解和应用 OpenCV 的相机标定功能。

简介在计算机视觉领域中,相机标定是一个至关重要的步骤,它用于确定相机的内外参数,包括焦距、主点位置、畸变系数等。OpenCV 是一个广泛使用的开源计算机视觉库,提供了强大的工具来实现相机标定功能。通过 OpenCV 的相机标定功能,可以显著提高图像处理和分析的准确性。本文将详细介绍如何使用 OpenCV 进行相机标定。

相机标定的基本原理

内参与外参- **内参**:描述了相机的内部特性,如焦距、主点位置。 - **外参**:描述了相机相对于世界坐标系的位置和方向。

畸变校正由于镜头制造工艺的原因,实际拍摄的图像可能会出现径向畸变和切向畸变。通过标定可以校正这些畸变,从而提高图像的质量。

使用OpenCV进行相机标定

准备工作

棋盘格图片采集1. 选择一个标准的棋盘格图案。 2. 在不同的角度和距离下拍摄多张照片。

安装OpenCV确保你的开发环境中已经安装了最新版本的 OpenCV 库。```bash pip install opencv-python ```

标定步骤

1. 加载棋盘格图片首先需要加载之前拍摄的所有棋盘格图片。```python import cv2 import numpy as np import glob

设置棋盘格尺寸 CHECKERBOARD = (6,9) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

创建对象点 objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32) objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)

存储对象点和图像点 objpoints = [] imgpoints = []images = glob.glob('*.jpg')for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

寻找角点ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)if ret == True:objpoints.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)imgpoints.append(corners2)

绘制并显示角点cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)cv2.imshow('img', img)cv2.waitKey(500)cv2.destroyAllWindows() ```

2. 执行标定利用收集到的对象点和图像点,执行相机标定。```python ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)print("相机矩阵:\n", mtx) print("畸变系数:\n", dist) print("旋转向量:\n", rvecs) print("平移向量:\n", tvecs) ```

3. 畸变校正最后一步是应用标定结果对图像进行畸变校正。```python img = cv2.imread('test_image.jpg') h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))

使用校正方法1 dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

使用校正方法2 mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, (w,h), 5) dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)x, y, w, h = roi dst = dst[y:y+h, x:x+w]cv2.imwrite('calibresult.png', dst) ```

结论通过上述步骤,我们可以成功地使用 OpenCV 对相机进行标定,并纠正图像中的畸变。这不仅提高了图像处理的精度,还为后续的计算机视觉任务奠定了坚实的基础。希望本文能够帮助你更好地理解和应用 OpenCV 的相机标定功能。

标签列表