opencv python 标定内参的代码 最好能把标定前后效果也展示出来
时间: 2024-01-13 21:05:00 浏览: 78
好的,下面是一个简单的 OpenCV Python 标定内参的代码,同时也包含了标定前后的效果展示:
```python
import numpy as np
import cv2
import glob
# 定义棋盘格的行列数
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)
# 存储所有棋盘格角点的世界坐标系和图像坐标系中的坐标
obj_points = []
img_points = []
# 获取所有标定图片的文件名
images = glob.glob('calibration_images/*.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:
obj_points.append(objp)
img_points.append(corners)
# 绘制棋盘格角点
cv2.drawChessboardCorners(img, chessboard_size, corners, ret)
# 显示标定前后的图片
cv2.imshow('img', img)
cv2.waitKey(500)
# 标定相机
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)
# 显示标定前后的图片
for fname in images:
img = cv2.imread(fname)
h, w = img.shape[:2]
new_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
new_img = cv2.undistort(img, mtx, dist, None, new_mtx)
cv2.imshow('original', img)
cv2.imshow('undistorted', new_img)
cv2.waitKey(500)
```
在上述代码中,我们首先定义了棋盘格的行列数和世界坐标系中的坐标,然后遍历所有标定图片,找到棋盘格角点并保存它们的世界坐标系和图像坐标系中的坐标。接着,我们使用 `cv2.calibrateCamera()` 函数来标定相机,并打印出内参和畸变系数。最后,我们遍历所有标定图片,对它们进行去畸变处理,并显示标定前后的图片。
注意,在展示标定前后的图片时,我们使用了 `cv2.getOptimalNewCameraMatrix()` 函数来计算新的内参矩阵和图像区域,使得去畸变后的图像不会出现黑边。
阅读全文