OPENCV python 相机标定
时间: 2023-11-26 16:49:05 浏览: 103
相机标定是指确定相机的内部参数和外部参数的过程,以便在图像中进行准确的测量。下面是使用OpenCV Python进行相机标定的步骤:
1.拍摄棋盘图。首先需要打印一张棋盘图,并将其固定在一个平面上。然后使用相机从不同的角度和位置拍摄这张棋盘图,并将这些图像保存下来。
2.提取角点。使用OpenCV中的`findChessboardCorners()`函数来检测每个图像中的角点。如果检测到了足够数量的角点,则将其保存下来。
3.计算相机的内部参数。使用`calibrateCamera()`函数来计算相机的内部参数,包括相机的焦距、主点和畸变系数。
4.计算相机的外部参数。使用`calibrateCamera()`函数来计算相机的外部参数,包括相机的旋转和平移向量。
5.评估标定结果。使用`getOptimalNewCameraMatrix()`函数来计算新的相机矩阵,并使用`undistort()`函数来校正图像。最后,使用`reprojectionError()`函数来评估标定结果的准确性。
下面是一个示例代码,用于演示如何使用OpenCV Python进行相机标定:
```python
import numpy as np
import cv2
# 棋盘格尺寸
CHESSBOARD_SIZE = (9, 6)
# 准备棋盘格角点
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)
# 存储棋盘格角点的世界坐标和图像坐标
objpoints = [] # 世界坐标
imgpoints = [] # 图像坐标
# 加载棋盘格图像
images = ['image1.jpg', 'image2.jpg', 'image3.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 == True:
objpoints.append(objp)
imgpoints.append(corners)
# 在图像上绘制角点
cv2.drawChessboardCorners(img, CHESSBOARD_SIZE, corners, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 评估标定结果
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 += error
print("total error: ", mean_error / len(objpoints))
# 校正图像
img = cv2.imread('image1.jpg')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# 显示校正前后的图像
cv2.imshow('original', img)
cv2.imshow('corrected', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
阅读全文