opencv 内参标定源码
时间: 2023-09-05 20:13:56 浏览: 38
以下是使用OpenCV进行相机内参标定的示例代码:
```python
import numpy as np
import cv2
# 设置棋盘格的行和列数
rows = 6
cols = 9
# 准备棋盘格的世界坐标,这里假设棋盘格在世界坐标系的z轴为0,棋盘格每个方格的边长为30毫米
objp = np.zeros((rows*cols, 3), np.float32)
objp[:, :2] = np.mgrid[0:cols, 0:rows].T.reshape(-1, 2)
objp *= 30
# 创建存储世界坐标和图像坐标的数组
obj_points = []
img_points = []
# 读取图像
img = cv2.imread('test.jpg')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找棋盘格的角点
ret, corners = cv2.findChessboardCorners(gray, (cols, rows), None)
if ret:
# 如果找到了角点,则添加世界坐标和图像坐标到对应的数组中
obj_points.append(objp)
img_points.append(corners)
# 在图像上绘制角点
cv2.drawChessboardCorners(img, (cols, rows), corners, ret)
# 进行相机内参标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
# 打印内参矩阵和畸变系数
print("Camera Matrix:\n", mtx)
print("Distortion Coefficients:\n", dist)
# 可以使用cv2.undistort()函数对图像进行去畸变处理
undist = cv2.undistort(img, mtx, dist, None, mtx)
# 显示结果
cv2.imshow('img', img)
cv2.imshow('undist', undist)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("No chessboard corners found!")
```
需要注意的是,这里假设棋盘格在世界坐标系的z轴为0,并且每个方格的边长为30毫米。在实际应用中,需要根据情况进行调整。