图像标定 求相机内参外参

下文为使用最小二乘的方法对一幅图像进行标定,求得相机的内参、外参的参数。

Calibration

Process of camera calibration:

1.      Load calibration piture andfind the corner by using “cvFindChessboardCorners” Opencv function. Then drawit in the raw piture.


2.      Store the corner information,Create the matrix U (160*12) in the formula below.


3.      Use to estimate the parameters of M.




Use the formula below to solve IntrinsicParameters and Extrinsic Parameters.



  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是相机标定相机内参外参的代码,使用OpenCV库实现: ```python import numpy as np import cv2 # 定义棋盘格内角点的数量 pattern_size = (9, 6) # 定义世界坐标系中的三维坐标 objp = np.zeros((np.prod(pattern_size), 3), np.float32) objp[:, :2] = np.indices(pattern_size).T.reshape(-1, 2) # 用于存储世界坐标系中的三维坐标和对应的二维图像坐标 obj_points = [] # 存储世界坐标系中的三维坐标 img_points = [] # 存储对应的二维图像坐标 # 加载图像并寻找棋盘格内角点 for i in range(1, 21): img = cv2.imread(f"chessboard_imgs/{i}.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) if ret: obj_points.append(objp) corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) img_points.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(obj_points, img_points, gray.shape[::-1], None, None) # 输出相机内参矩阵和畸变系数 print("Camera Matrix:") print(mtx) print("Distortion Coefficients:") print(dist) # 选择一张棋盘格图像进行测试 img = cv2.imread("chessboard_imgs/1.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) # 旋转向量和平移向量转换为旋转矩阵 R, _ = cv2.Rodrigues(rvecs[0]) T = tvecs[0] # 输出相机外参矩阵 print("Rotation Matrix:") print(R) print("Translation Matrix:") print(T) ``` 代码注释如下: - `pattern_size`:定义棋盘格内角点的数量,这里是9行6列。 - `objp`:定义世界坐标系中的三维坐标,这里使用两个二维数组表示,第一个数组的元素为x方向的坐标值,第二个数组的元素为y方向的坐标值,第三个数组的元素为z方向的坐标值,这里z方向的坐标值都为0。 - `obj_points`和`img_points`:用于存储世界坐标系中的三维坐标和对应的二维图像坐标。 - `cv2.findChessboardCorners`:寻找图像中的棋盘格内角点。 - `cv2.cornerSubPix`:对粗略提取的内角点进行亚像素级别的精细化定位。 - `cv2.drawChessboardCorners`:在图像上绘制棋盘格内角点。 - `cv2.calibrateCamera`:对相机进行标定,返回相机内参矩阵、畸变系数、旋转向量和平移向量等信息。 - `cv2.getOptimalNewCameraMatrix`:计算新的相机内参矩阵。 - `cv2.undistort`:对图像进行畸变矫正。 - `cv2.Rodrigues`:将旋转向量转换为旋转矩阵。 - `rvecs[0]`和`tvecs[0]`:表示第一张棋盘格图像相对于相机坐标系的旋转向量和平移向量。 - `R`和`T`:表示相机外参矩阵。 注意:在运行代码之前,需要提前准备好棋盘格图像,并将它们放在一个名为`chessboard_imgs`的文件夹中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值