鱼眼标定方式

鱼眼作用

人单眼水平视角最大可达156度,垂直方向150度。为了增加可视范围,摄像头可以通过畸变参数扩大视野,一般100度到200度的fov。所以鱼眼是为了看的视野更大,注意在一定分辨率下,fov边缘的像素点稀疏,所以对于识别或是求解世界坐标误差会大点。

内参矩阵K:
    [fx   0    cx]
K = [0    fy   cy] 
    [0    0     1]

内参矩阵K是3X3的矩阵。其中,fx和fy是焦距(focal length)参数。cx和cy是图像平面原点(principal point)的坐标。

畸变参数 D = [k1 k2 p1 p2 k3]

畸变参数矩阵D是1x5的矩阵
其中, k1、k2、k3 是径向畸变系数(radial distortion coefficients) p1、p2 是切向畸变系数(tangential distortion coefficients)

标定原理

成像的过程实质上是几个坐标系的转换。首先空间中的一点由世界坐标系转换到摄像机坐标系 ,然后再将其投影到成像平面图像物理坐标系,最后再将成像平面上的数据转换到图像平面图像像素坐标系。
通过棋盘格标定方式可以确定内参与畸变参数。
定义坐标系:
世界坐标:坐标表示为(X, Y, Z),以摄像头为原点,右手螺旋法则,Z为指向棋盘格的方向,四个手指指向右边为X,正向下为Y。
像素坐标:坐标表示为(U, V),其中图像的左上方为原点O, 向右为U,与世界坐标系的X轴平行;向下为V,与世界坐标系的Y轴平行。
根据棋盘格的角点,小孔成型原理,PNP算法,可以建立多元线性方程,其实就是求解该方程。
推理过程详解参考

代码实现

opencv提供算法接口,直接输入棋盘格的角点个数就可以了,比如 9行* 12列,那就输入8,11既可。关键接口 cv2.findChessboardCorners, cv2.fisheye.calibrate。具体看代码!标定的照片至少30张,越多越好,如果标定的参数不准确,那么矫正后的图片像素坐标会浮动很大。
鱼眼标定代码

AI视觉开发板 openamv(Almachinevision)是一款基于瑞芯微RV1103芯片具有高性价比的微型Linux开发板, 旨在为开发者提供一个简单且高效的开发平台;支持多种接口,包括MIPICSI、GPIO、 UART、SPI、I2C、USB等,便于快速开发和调试。特别是针对AI视觉,可以低成本部署神经网络,做到高性价比的视觉监控功能。
自主研发摄像头支持夜视可选广角mipi接口 :支持300万像素;具备高灵敏度,高信噪比 低照度的性能,能够呈现更加细腻、色彩更 加逼真的夜视成像效果,更好地适应环境光线变化, 批量价格便宜。

### 关于双目鱼眼相机内参标定的方法 对于双目鱼眼相机而言,其内参标定过程涉及到了解并修正由鱼眼镜头引入的独特畸变模式。这不仅限于传统的径向和切向畸变,还包括了更复杂的失真效应。为了实现有效的校准,通常采用特定设计的棋盘格图案作为标定点源,因为这类图案能够提供足够的特征点用于计算。 #### 准备工作 在开始之前,确保拥有高质量的图像数据集至关重要。这些图片应当覆盖整个视野范围,并尽可能均匀分布各个方向上的视角变化。此外,准备一个标准尺寸的黑白交替排列的棋盘格模板是非常必要的[^2]。 #### 数据采集阶段 利用上述提到的棋盘格板,在不同位置与角度下拍摄一系列照片。每一张照片都应清晰可见完整的棋盘格区域。此步骤旨在获取足够丰富的空间信息以便后续处理算法能准确估计内外参数矩阵。 #### 参数估算部分 针对单个摄像单元来说,主要任务是从所收集到的数据集中提取出精确的关键点坐标对(即世界坐标系下的已知物理尺寸对应物和平面成像后的像素位置),进而求得内部几何属性如焦距、主点偏移量等以及外部姿态描述符比如旋转平移矢量组。当涉及到一对同步工作的双眼结构时,则还需额外考虑相互间的相对位姿关系——即所谓的“外参”。 对于鱼眼类型的设备来讲,由于存在显著不同于常规广角透镜系统的投影特性,因此需要应用专门定制化版本的数学模型来进行拟合操作。OpenCV库提供了`cv::omnidir::calibrate`接口支持此类特殊情形下的全面优化流程[^1]。 ```python import cv2 as cv import numpy as np # 假设已经完成了图像读取并将所有检测到的角点存储在一个列表中 object_points = [] # 物体空间中的三维点 (0,0,0), (1,0,0), ... image_points_left = [] image_points_right = [] for i in range(number_of_images): 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) object_points.append(objp) ret_l, corners_l = cv.findChessboardCorners(gray_image_left[i], chessboard_size) ret_r, corners_r = cv.findChessboardCorners(gray_image_right[i], chessboard_size) if ret_l and ret_r: criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners_subpix_l = cv.cornerSubPix(gray_image_left[i],corners_l,(11,11),(-1,-1),criteria) corners_subpix_r = cv.cornerSubPix(gray_image_right[i],corners_r,(11,11),(-1,-1),criteria) image_points_left.append(corners_subpix_l) image_points_right.append(corners_subpix_r) flags = 0 flags |= cv.CALIB_FIX_K4 | cv.CALIB_FIX_K5 # Fixing the higher order distortion coefficients to zero can improve stability. ret, mtxL, distL, rvecsL, tvecsL = cv.omnidir.calibrate( objectPoints=object_points, imagePoints=image_points_left, imageSize=(width,height), K=np.eye(3), D=np.zeros((4)), flags=flags ) ret, mtxR, distR, rvecsR, tvecsR = cv.omnidir.calibrate( objectPoints=object_points, imagePoints=image_points_right, imageSize=(width,height), K=np.eye(3), D=np.zeros((4)), flags=flags ) ``` 这段代码展示了如何使用 OpenCV 的 `omnidir` 模块来完成一次典型的鱼眼光学系统单独组件级别的初步调整作业。值得注意的是这里假设左右两侧采用了相同的硬件配置从而简化了一些输入变量设定;而在实际应用场景里可能还需要进一步微调某些选项以适应具体的实验条件差异。 最后一步则是执行立体匹配程序确定两台装置间确切的空间关联方式: ```python stereo_criteria = (cv.TERM_CRITERIA_COUNT + cv.TERM_CRITERIA_EPS, 100, 1e-5) stereo_flags = cv.CALIB_FIX_INTRINSIC ret, _, _, _, _, R, T, E, F = cv.stereoCalibrate( objectPoints=object_points, imagePoints1=image_points_left, imagePoints2=image_points_right, cameraMatrix1=mtxL, distCoeffs1=distL, cameraMatrix2=mtxR, distCoeffs2=distR, imageSize=(width,height), criteria=stereo_criteria, flags=stereo_flags ) ``` 通过以上步骤可以获得较为理想的双目鱼眼相机内参及互相关联参数设置方案[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值