OpenCV 标定摄像头(Python 版本代码,视频中标定,亲测可用)

本文介绍了如何使用OpenCV在Python中通过视频进行相机标定,详细阐述了相机标定的意义、畸变类型及其校正公式,并提供了利用棋盘格进行标定的流程和关键代码,包括检测棋盘格、计算标定结果、衡量误差以及保存和应用标定参数去畸变的过程。
摘要由CSDN通过智能技术生成

在机器视觉领域,摄像头的标定指通过技术手段拿到相机的内参、外参及畸变参数。

相机内参长这样,利用针孔模型,将 3d 物体透视投影到 2d 的相机屏幕上。

P = [ f x 0 c x 0 f y c y 0 0 1 ] P = \begin{bmatrix} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y}\\ 0 & 0 & 1 \end{bmatrix} P=fx000fy0cxcy1

畸变参数包括 2 类,径向畸变和切向畸变
在这里插入图片描述
径向畸变最明显的例子就是鱼眼相机的效果。

大家仔细观察上面的图片,它就能很好地介绍径向畸变。越往镜头边缘,线条弯曲的越明显,本来是直线,现在都变成了曲线,消除畸变就是为了把这些曲线尽量还原成本来的样子。

径向畸变可以被纠正,公式如下。

在这里插入图片描述

除了径向畸变外,还有一个畸变就是切向畸变

切向畸变一般来说,是因为相机镜头制造工艺精度不够,透镜和感光器原件没有平行。从而造成了图像的变形。

矫正公式如下:

在这里插入图片描述

两个畸变的参数通常用一个向量表示。

在这里插入图片描述
但一般只用 4 个参数。
[ k 1 , k 2 , p 1 , p 2 ] [k_{1} ,k_{2},p_{1},p_{2}] [k1,k2,p

机器人眼,也称为相机或视觉传感器,进行手外标定是一个关键步骤,用于确定相机在三维空间的精确位置和姿态,通常涉及到摄像头的内参数(如焦距、光心坐标等)和外参数(旋转和平移矩阵)。在计算机视觉,常见的标定方法有棋盘法、环形特征法等。 以下是手外标定的一般步骤和Python代码实现(假设使用OpenCV库): 1. 准备棋盘模板:通常使用OpenCV内置的棋盘格模板(calibration\_pattern)生成图像。 ```python import cv2 from cv2 import aruco aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250) board = aruco.CharucoBoard_create(sizes=(7, 5), dictionary=aruco_dict) chessboard_img = board.draw((800, 600)) # 生成800x600大小的棋盘图像 ``` 2. 棋盘角点检测:在实际场景拍摄多张包含棋盘图案的照片,然后用`aruco.detectMarkers()`找到棋盘的角点。 ```python images = ... # 读取或捕获的照片列表 corners, ids, rejected_images = [], [], [] for img in images: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) corners, ids, _ = aruco.detectMarkers(gray, aruco_dict) if ids is not None: corners, ids = aruco.refineDetectedMarkers(gray, board, corners, ids) ``` 3. 标定过程:使用`aruco.interpolateCornersCharuco()`进行插值,并调用`cv2.calibrateCamera()`计算相机的内参数和外参数。 ```python corners_list, ids_list = zip(*[(corners[i], ids[i]) for i in range(len(corners)) if ids[i] is not None]) _, _, _, _, _, K, dist = cv2.aruco.calibrateCameraCharuco(corners_list, ids_list, board, gray.shape[::-1], None, None) ``` 4. 反投影校准:最后,您可以使用这些参数来校正实际物体的坐标到相机坐标系。 完整代码可能涉及更多细节处理(如异常处理、数据预处理等),但以上步骤给出了基本流程。如果你想要更深入地了解,可以提问:
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frank909

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值