张正友相机标定opencv实现(完整程序+棋盘图)实例源码
时间: 2023-05-09 08:03:10 浏览: 199
张正友相机标定是一种用于计算机视觉领域中的相机标定方法,利用棋盘图像来确定相机内外参数。OpenCV是一个常用的开源计算机视觉库,支持多种相机标定方法。下面是一个实现张正友相机标定OpenCV的完整程序棋盘图实例的源码。
```python
import numpy as np
import cv2
import glob
square_size = 1.0 # 棋盘格尺寸,单位毫米
pattern_size = (8, 6) # 棋盘格的行列数
images = glob.glob("images/*.jpg") #图像路径
# 准备标定板的“物理坐标”
objp = np.zeros((np.prod(pattern_size), 3), np.float32)
objp[:,:2] = np.indices(pattern_size).T.reshape(-1, 2) # x, y 坐标
objp *= square_size
# 存储 3D 坐标和对应的 2D 坐标
objpoints = []
imgpoints = []
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 获得棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size)
if ret:
objpoints.append(objp)
# 改善角点的坐标,提高精度
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1),
(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
imgpoints.append(corners2)
# 在图像上标定角点并显示结果
img = cv2.drawChessboardCorners(img, pattern_size, 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("相机内参数:")
print(mtx)
print("相机畸变参数:")
print(dist)
```
首先,我们定义了一个棋盘格的大小和行列数,在“物理坐标”中确定棋盘格的每个角点的位置。然后,从图像文件夹中加载图像,使用OpenCV的findChessboardCorners函数获得棋盘格角点。接下来,通过cornerSubPix函数对角点坐标进行改善,提高精度。最终,我们使用calibrateCamera函数对图像进行相机标定,得到相机的内外参数。
这个程序使用了OpenCV的主要标定函数和几个辅助函数,包括findChessboardCorners,cornerSubPix和calibrateCamera。在执行程序之前,需要准备一组棋盘格图像,并将它们放在一个图像文件夹中。运行程序后,相机的内参数和畸变参数将被输出到控制台上。
使用OpenCV实现张正友相机标定可以高精度的获取到相机的内外参数,可以在计算机视觉、机器人、增强现实等领域得到广泛应用。