OpenCV相机标定calibrateCamera坐标系详解

本文详细介绍了OpenCV的calibrateCamera函数在相机标定中的应用,讲解了objectPoints和imagePoints的设定,以及如何理解世界坐标系。通过drawChessboardCorners函数展示检测顺序,明确了坐标方向。此外,还提到了solvePnP函数在外参求解中的使用。
摘要由CSDN通过智能技术生成

在OpenCV中,可以使用calibrateCamera函数,通过多个视角的2D/3D对应,求解出该相机的内参数和每一个视角的外参数。


使用C++接口时的输入参数如下:


objectPoints - 每一个视角中,关键点的世界坐标系。可以使用vector < vector <Point3f> >类型,第一层vector表示每一个视角,第二层vector表示每一个点。

如果使用OpenCV自带的棋盘格,可以直接传入交叉点(不包括边角)的实际坐标,以物理世界尺度(例如毫米)为单位。

写坐标时,要保证z轴为0,按照先x变化,后y变化,从小到大的顺序来写。如果网格尺寸为5厘米,写作:(0,0,0),(5,0,0), (10,0,0)...(0,5,0), (5,5,0), (10,5,0),...

如下图例子,x方向是8个交叉点,y方向3个较差点。

`cv2.calibrateCamera` 是 OpenCV 中用于相机标定的一个函数,它可以帮助估计相机的内部参数和外部参数,以便能够将3D世界坐标映射到2D图像坐标。在使用这个函数之前,你需要准备一组用于标定的棋盘格图像(通常是不同角度的同一棋盘格),然后使用这些图像中的角点来计算相机参数。 以下是使用 `cv2.calibrateCamera` 函数的基本步骤: 1. 准备棋盘格角点数据:首先需要检测出每一幅标定图像上的棋盘格角点,通常使用 `cv2.findChessboardCorners` 函数来实现。 2. 存储角点数据:将检测到的角点数据存储起来,`calibrateCamera` 函数将会使用这些数据来估计参数。 3. 设置世界坐标系:由于棋盘格是已知尺寸的,可以设定棋盘格角点的世界坐标。这些坐标构成了一个3D点集。 4. 调用 `calibrateCamera` 函数:使用检测到的角点数据和世界坐标集来计算相机参数。 以下是一个简单的代码示例: ```python import numpy as np import cv2 import glob # 准备对象点,如 (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) # 假设使用的是 7 x 6 的棋盘格 objp = np.zeros((6*7, 3), np.float32) objp[:,:2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2) # 用于存储所有图像的对象点和图像点的数组 objpoints = [] # 真实世界中的3D点 imgpoints = [] # 图像中的2D点 # 读取标定图像 images = glob.glob('path_to_calib_images/*.jpg') # 用实际的图片路径替换 for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 寻找棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, (7,6), None) # 如果找到足够的角点,则将对象点添加到 objpoints ,图像点到 imgpoints if ret == True: objpoints.append(objp) imgpoints.append(corners) # 绘制并显示角点 img = cv2.drawChessboardCorners(img, (7,6), corners, 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("相机矩阵:\n", mtx) print("畸变系数:\n", dist) print("旋转向量:\n", rvecs) print("平移向量:\n", tvecs) ``` 确保替换 `'path_to_calib_images/*.jpg'` 为实际的标定图像路径,以及调整棋盘格的大小 `(7,6)` 以匹配实际使用的棋盘格大小。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值