opencv相机标定(opencv相机标定和坐标输出)

## OpenCV相机标定

简介

相机标定是计算机视觉中的一个重要步骤,其目的是确定摄像机的内参数和外参数。内参数描述了摄像机的内部几何特性,例如焦距、主点坐标和镜头畸变系数。外参数描述了摄像机在世界坐标系中的位置和姿态,包括旋转矩阵和平移向量。准确的相机标定结果是三维重建、目标跟踪、机器人视觉等许多计算机视觉应用的基础。OpenCV提供了一套完整的工具和函数,可以方便地进行相机标定。本文将详细介绍使用OpenCV进行相机标定的方法和步骤。### 一、 相机模型在进行相机标定之前,我们需要了解摄像机的成像模型。常用的模型是针孔相机模型,它假设光线穿过针孔后在图像平面上形成图像。该模型可以由以下公式描述:``` s

[u, v, 1]^T = K

[R | t]

[X, Y, Z, 1]^T ```其中:

`s`: 比例因子

`[u, v]^T`: 像素坐标

`K`: 相机内参数矩阵,包含焦距(fx, fy)、主点坐标(cx, cy)和畸变系数

`R`: 旋转矩阵,描述相机坐标系与世界坐标系之间的旋转关系

`t`: 平移向量,描述相机坐标系与世界坐标系之间的平移关系

`[X, Y, Z]^T`: 世界坐标系下的三维点坐标### 二、 标定板相机标定需要使用标定板,它是一个带有已知尺寸和位置的棋盘格图案。标定板的精度直接影响标定结果的精度。常用的标定板有棋盘格标定板、圆点标定板等。OpenCV主要支持棋盘格标定板。### 三、 标定步骤使用OpenCV进行相机标定的步骤如下:1.

准备工作:

准备一个标定板(棋盘格标定板),以及能够拍摄清晰标定板图像的相机。你需要拍摄多张不同角度的标定板图片,一般建议至少10张,越多越好,以提高标定精度。2.

图像采集:

使用相机拍摄多张不同角度的标定板图像。注意确保标定板在图像中清晰可见,并且尽可能占据图像的大部分区域。 避免光线过强或过弱,以及模糊的图像。3.

角点检测:

使用OpenCV的`findChessboardCorners()`函数检测标定板上的角点。该函数需要输入图像和标定板的角点数目 (例如,8x6的棋盘格,角点数目为(8-1)x(6-1) = 35)。4.

亚像素精度角点精确定位:

`findChessboardCorners()` 函数找到的角点位置精度较低。为了提高精度,可以使用`cornerSubPix()`函数进行亚像素精度角点精确定位。5.

标定参数计算:

使用OpenCV的`calibrateCamera()`函数计算相机内参数和外参数。该函数需要输入角点坐标、标定板的尺寸、图像尺寸等信息。6.

结果评估:

使用OpenCV的`projectPoints()`函数将三维点投影到图像平面,并计算重投影误差。重投影误差越小,标定结果越准确。### 四、 OpenCV代码示例 (Python)```python import cv2 import numpy as np import glob# 标定板尺寸 CHECKERBOARD = (7, 6) # (内角点个数) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)# 物理棋盘格尺寸 square_size = 25 # mm# 存储角点的列表 objpoints = [] # 3d point in real world space imgpoints = [] # 2d points in image plane.# 创建世界坐标系中的3D点 objp = np.zeros((CHECKERBOARD[0]

CHECKERBOARD[1], 3), np.float32) objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)

square_size# 读取所有图像 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, None)if ret == True:corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)objpoints.append(objp)imgpoints.append(corners2)# 可选:在图像上绘制角点cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)cv2.imshow('img', 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)# 重投影误差计算 (示例) mean_error = 0 for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)mean_error += errorprint("total error: ", mean_error/len(objpoints))# 将标定结果保存到文件 (可选) np.savez('camera_params.npz', mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs)```### 五、 结论本文介绍了使用OpenCV进行相机标定的方法和步骤,并提供了一个Python代码示例。 准确的相机标定对于许多计算机视觉应用至关重要。 记住,图像质量和标定板的精度会直接影响标定结果的准确性。 需要根据实际情况调整参数并进行多次实验以获得最佳结果。 此外,还可以根据实际需求选择不同的相机模型和标定方法。

OpenCV相机标定**简介**相机标定是计算机视觉中的一个重要步骤,其目的是确定摄像机的内参数和外参数。内参数描述了摄像机的内部几何特性,例如焦距、主点坐标和镜头畸变系数。外参数描述了摄像机在世界坐标系中的位置和姿态,包括旋转矩阵和平移向量。准确的相机标定结果是三维重建、目标跟踪、机器人视觉等许多计算机视觉应用的基础。OpenCV提供了一套完整的工具和函数,可以方便地进行相机标定。本文将详细介绍使用OpenCV进行相机标定的方法和步骤。

一、 相机模型在进行相机标定之前,我们需要了解摄像机的成像模型。常用的模型是针孔相机模型,它假设光线穿过针孔后在图像平面上形成图像。该模型可以由以下公式描述:``` s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T ```其中:* `s`: 比例因子 * `[u, v]^T`: 像素坐标 * `K`: 相机内参数矩阵,包含焦距(fx, fy)、主点坐标(cx, cy)和畸变系数 * `R`: 旋转矩阵,描述相机坐标系与世界坐标系之间的旋转关系 * `t`: 平移向量,描述相机坐标系与世界坐标系之间的平移关系 * `[X, Y, Z]^T`: 世界坐标系下的三维点坐标

二、 标定板相机标定需要使用标定板,它是一个带有已知尺寸和位置的棋盘格图案。标定板的精度直接影响标定结果的精度。常用的标定板有棋盘格标定板、圆点标定板等。OpenCV主要支持棋盘格标定板。

三、 标定步骤使用OpenCV进行相机标定的步骤如下:1. **准备工作:** 准备一个标定板(棋盘格标定板),以及能够拍摄清晰标定板图像的相机。你需要拍摄多张不同角度的标定板图片,一般建议至少10张,越多越好,以提高标定精度。2. **图像采集:** 使用相机拍摄多张不同角度的标定板图像。注意确保标定板在图像中清晰可见,并且尽可能占据图像的大部分区域。 避免光线过强或过弱,以及模糊的图像。3. **角点检测:** 使用OpenCV的`findChessboardCorners()`函数检测标定板上的角点。该函数需要输入图像和标定板的角点数目 (例如,8x6的棋盘格,角点数目为(8-1)x(6-1) = 35)。4. **亚像素精度角点精确定位:** `findChessboardCorners()` 函数找到的角点位置精度较低。为了提高精度,可以使用`cornerSubPix()`函数进行亚像素精度角点精确定位。5. **标定参数计算:** 使用OpenCV的`calibrateCamera()`函数计算相机内参数和外参数。该函数需要输入角点坐标、标定板的尺寸、图像尺寸等信息。6. **结果评估:** 使用OpenCV的`projectPoints()`函数将三维点投影到图像平面,并计算重投影误差。重投影误差越小,标定结果越准确。

四、 OpenCV代码示例 (Python)```python import cv2 import numpy as np import glob

标定板尺寸 CHECKERBOARD = (7, 6)

(内角点个数) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

物理棋盘格尺寸 square_size = 25

mm

存储角点的列表 objpoints = []

3d point in real world space imgpoints = []

2d points in image plane.

创建世界坐标系中的3D点 objp = np.zeros((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32) objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2) * square_size

读取所有图像 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, None)if ret == True:corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)objpoints.append(objp)imgpoints.append(corners2)

可选:在图像上绘制角点cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)cv2.imshow('img', 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)

重投影误差计算 (示例) mean_error = 0 for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)mean_error += errorprint("total error: ", mean_error/len(objpoints))

将标定结果保存到文件 (可选) np.savez('camera_params.npz', mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs)```

五、 结论本文介绍了使用OpenCV进行相机标定的方法和步骤,并提供了一个Python代码示例。 准确的相机标定对于许多计算机视觉应用至关重要。 记住,图像质量和标定板的精度会直接影响标定结果的准确性。 需要根据实际情况调整参数并进行多次实验以获得最佳结果。 此外,还可以根据实际需求选择不同的相机模型和标定方法。

标签列表