计算机视觉:OpenCV相机标定
1.针孔照相机模型:
针孔照相机模型是一种经典的相机模型,它将相机视为一个针孔,将场景中的点投影到成像平面上。在这个模型中,相机的内参和外参描述了相机的几何形状和相机的姿态。
相机的内参矩阵描述了相机的内部几何形状,包括相机的焦距、像素尺寸和像素坐标原点。相机的内参矩阵可以表示为:
K = [ f_x 0 c_x ]
[ 0 f_y c_y ]
[ 0 0 1 ]
其中,f_x 和 f_y 是相机的水平和垂直焦距,c_x 和 c_y 是相机的像素坐标原点。这个矩阵通常被称为相机的内参矩阵。
相机的外参矩阵描述了相机的姿态,包括相机的位置和方向。相机的外参矩阵通常用旋转矩阵和平移向量来表示,即:
[R | T]
其中,R 是一个 3x3 的旋转矩阵,T 是一个 3x1 的平移向量。这个矩阵通常被称为相机的外参矩阵。
2.相机标定
相机标定是指确定相机的内参矩阵和外参矩阵的过程。
在这个过程中,我们需要使用已知的场景和相机拍摄的图像来计算相机的内参矩阵和外参矩阵。
下面是相机标定的一般步骤:
- 拍摄多张图像,图像中包含已知的场景(例如棋盘格)。
- 提取图像中的特征点,例如角点。
- 使用角点来计算相机的内参矩阵和外参矩阵。
Python+OpenCV实现相机标定
准备了下面10张棋盘格图片
若需要自己准备棋盘格,参考博客:http://t.csdn.cn/EOpir
实现代码:
import numpy as np
import cv2
import glob
# 准备棋盘格的角点坐标
pattern_size = (8, 11)
objpoints = [] # 存储棋盘格角点的世界坐标系
imgpoints = [] # 存储棋盘格角点的图像坐标系
# 生成棋盘格角点的世界坐标系
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
# 获取棋盘格图像文件列表
images = glob.glob('ex4/calimg/*.jpg')
for image_path in images:
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow(image_path,gray)
# cv2.waitKey(0)
# 检测棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
# print(ret)
# print(corners)
if ret:
objpoints.append(objp)
imgpoints.append(corners)
# 进行相机标定
ret, camera_matrix, distortion_coeffs, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], None, None
)
# 打印相机内参矩阵
print("相机内参矩阵:")
print(camera_matrix)
# 打印相机畸变系数
print("相机畸变系数:")
print(distortion_coeffs)
# 打印相机外参矩阵
print("相机外参矩阵:")
for i in range(len(rvecs)):
print("第 %d 张图像:" % (i + 1))
rotation_matrix, _ = cv2.Rodrigues(rvecs[i])
extrinsic_matrix = np.concatenate((rotation_matrix, tvecs[i]), axis=1)
print(extrinsic_matrix)
实验结果:
输出的内参外参矩阵以及畸变系数如下:
实验结果分析:已知有十张棋盘格图像,结果只输出七张图像的对应外参矩阵,其原因是下列三张标定图像:无法被cv2.findChessboardCorners()检测出角点,因此无法求外参矩阵,可以使用质量更好的图像或者更换角点检测算法、调整角点检测算法的参数来解决此问题。
文章来源:https://www.toymoban.com/news/detail-804300.html
文章来源地址https://www.toymoban.com/news/detail-804300.html
到了这里,关于计算机视觉:OpenCV相机标定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!