1.综述!鱼眼源码鱼眼用于自动驾驶的标定标定全景鱼眼感知:概述、调查和挑战
2.opencv去畸变的相机方法图像去畸变vs点畸变
3.基于Python实现相机标定正畸并生成鸟瞰图
4.小觅双目摄像头D1000-IR-120/Color模组评测(下)
5.鱼眼相机图像如何矫正?
6.AVM环视系统——鱼眼相机去畸变算法
综述!用于自动驾驶的鱼眼源码鱼眼全景鱼眼感知:概述、调查和挑战
摘要:
在自动驾驶的标定标定前沿领域,全景鱼眼摄像机扮演着至关重要的相机商擎mall源码底部角色,它们提供了°无死角的鱼眼源码鱼眼感知,尤其在近距任务中,标定标定如自动泊车。相机然而,鱼眼源码鱼眼数据集的标定标定局限性限制了更深入的研究,目标检测的相机高精度要求(精度达到厘米级)和大径向畸变带来的算法扩展挑战是亟待解决的问题。本文详尽探讨了鱼眼相机模型,鱼眼源码鱼眼如针孔、标定标定经典几何(如等距和Stereographic投影)、相机扩展正交和代数模型,如多项式模型,以及它们在目标检测中的复杂性和应对径向失真和目标形变的策略。
全景视图系统由四只广角相机构成,对计算机视觉技术提出了严峻的挑战,特别是如何处理显著的鱼眼失真。研究重点围绕鱼眼摄像头的模型选择、精确标定以及当前领域的核心问题展开。
论文深入剖析了各种鱼眼模型,从针孔模型的简单几何到DS模型的复杂建模,包括Brown-Conrady模型的变体,以及多项式模型在MATLAB和NVIDIA工具中的应用。这些模型的选择不仅考虑了径向畸变的纠正,如Division模型的扩展,还包括球形、视场和UCM/Enhanced UCM模型的探讨。
标定鱼眼相机是一项关键任务,需要内外参数的精确匹配,通过特征检测和重投影误差的最小化。OpenCV和Kalibr等工具支持离线标定,而在线校准则依赖于车道标记或里程计信息,以应对摄像机姿态的变化。
文章进一步深入讨论了鱼眼图像的特性,如空间关系和深度估计的挑战。FisheyeDet[]强调了模拟数据集的重要性,如失真版Pascal VOC[],宝塔线两平底指标源码以提升模型的准确性。SphereNet[]和FisheyeYOLO[]则探索了定向边界框和曲线bbox等表示法,以优化检测精度。此外,如何处理污垢检测和恢复也是研究热点,如DirtyGAN[]和Das等人[]的工作。
深度估计在鱼眼和普通相机间存在差异,FisheyeDistanceNet[]在图像到3D曲面映射的研究中面临着独特挑战。在自动驾驶场景中,图像到深度的转换、视觉里程计、多摄像机测距技术、运动分割、目标跟踪以及SLAM技术,如FisheyeSuperpoint,都在文中有所涉及,并提出了多任务模型,如Sist等,以整合不同任务的处理能力。
例如,u等人联合开发的MTL模型,集目标检测和语义分割于一体,利用共享编码器和解码器如YOLO v2和FCN8。Leang等人针对鱼眼摄像机任务的权重分配进行了深入研究。FisheyeMultiNet设计了实时多任务深度学习网络,专为自动泊车设计,速度可达fps,涵盖物体检测、语义分割和污垢检测。OmniDet则专注于场景理解,以帧/秒的速度执行几何和语义任务,展示了鱼眼技术的广泛应用。
未来的研究方向将聚焦于失真感知CNN等前沿技术,同时,我们的资源库autodriving-heart/Awesome-Autonomous-Driving提供了丰富的自动驾驶技术综述,包括BEV/多模态融合等,为深入探索提供了宝贵的参考。
opencv去畸变的方法图像去畸变vs点畸变
相机分为窄角相机和广角相机,相机模型主要分为针孔相机模型和鱼眼相机模型。
图像畸变主要分为径向切向畸变模型和鱼眼相机的生死狙击单板人物上色源码Kannala-Brandt畸变模型。
在OpenCV中,进行图像去畸变的方法主要有两种:undistort函数和remap函数。
undistort函数用于处理鱼眼相机畸变,使用方法如下:cv::undistort(temp, view, cameraMatrix, distCoeffs);或cv::fisheye::undistortImage(temp, view, cameraMatrix, distCoeffs)。
remap函数则用于计算无畸变图像,步骤包括估计新的相机内参矩阵newCamMat,并通过initUndistortRectifyMap初始化畸变矫正矩阵,然后使用remap函数计算无畸变图像:Mat newCamMat;fisheye::estimateNewCameraMatrixForUndistortRectify(cameraMatrix, distCoeffs, imageSize, Matxd::eye(), newCamMat, 1);fisheye::initUndistortRectifyMap(cameraMatrix, distCoeffs, Matxd::eye(), newCamMat, imageSize, CV_SC2, map1, map2);initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0), imageSize, CV_SC2, map1, map2);remap(view, rview, map1, map2, INTER_LINEAR)。
此外,OpenCV还提供了针对点畸变的distortPoints函数,它分为鱼眼和窄角两种调用原型。
为了直观展示去畸变的过程,我们可以通过编写示例程序来实现undistort、remap和remap-undistort功能。具体实现方法和步骤可以参考OpenCV官方文档或相关教程。
基于Python实现相机标定正畸并生成鸟瞰图
基于Python实现相机标定正畸并生成鸟瞰图的实验概述
实验目标是利用Python和OpenCV进行相机标定,校正图像畸变,并生成鸟瞰图。实验基于Learning OpenCV的示例-1和-1,首先通过棋盘格图像进行相机参数的定标,将内参写入XML文件。 标定相机参数的过程中,OpenCV考虑了径向和切向畸变。径向畸变使用公式纠正“桶”或“鱼眼”效应,切向畸变则考虑了镜头与成像平面的非平行性。相机参数矩阵包含光学中心坐标和焦距,用于将世界坐标转换为像素坐标。 实验的核心环节是鸟瞰视角转换。通过比较图像中实际棋盘格角点与理想位置,计算出映射矩阵,将每个像素点映射到棋盘格坐标系,从而获得鸟瞰视角。具体步骤包括读取、标注棋盘格、使用calibrateCamera函数获取相机参数,然后进行畸变矫正和图像剪切,最后生成鸟瞰图并进行视角调整。 实验结果显示,使用自己拍摄的照片进行正畸后,棋盘格被正确地映射到左上角,南航物流管理系统源码视角可通过参数调整。然而,过程中也遇到过模糊图像的问题,通过调整视角变换矩阵参数解决了此问题。 总结来说,这次实验加深了对Python在相机标定和图像处理中的应用理解,也解决了实际操作中遇到的问题,如视角转换矩阵的正确使用。小觅双目摄像头D-IR-/Color模组评测(下)
分析 camera 的参数
每个相机镜头都有不同的参数,因此针对每个镜头都需要做光学标定。首先需要对镜头进行参数建模,分投影模型和畸变模型,投影模型我们选用比较通用的 pinhole 模型,包括焦距,光心。畸变模型我们选用 radtan 模型,包括径向畸变,切向畸变。
Pinhole 模型即针孔相机模型,投影方程及示意图为:
其中 fx , fy 为焦距, cx , cy 为光心, (x,y,z) 为相机坐标系下的 3d 点坐标, (ix,iy) 为图像坐标系下的像素点坐标。
Radtan 模型即 radial-tangential 模型,包括径向畸变参数和切向畸变参数。畸变方程及示意图为:
以上是单个相机镜头的一些标定参数,被称为内参。如果具有多个相机镜头,比如现在广泛使用的双目相机,则还存在相机与相机之间的变换关系,被称为外参,模型及示意图如下:
其中 (x0,y0,z0)’ 和 (x1,y1,z1)’ 分别是每个相机自身坐标系下的同一 3d 点坐标,R 是旋转矩阵,T 是平移向量,R 和 T 被称为外参,表示相机间的相对旋转和相对平移。
相机标定是计算机视觉领域经久不衰的研究方向,一般都是使用非线性的迭代优化方法求迭代解。下面我们将使用两个工具包来标定手上的小觅相机,并与相机本身自带标定参数做对比。
首先是被广泛使用的 opencv 的标定方法. 我们使用了 opencv 自带的 stereo_calib 例子。使用小觅相机采集了 * 分辨率大小(下同)的图像, opencv 默认是使用黑白棋盘格作为标定板,我们使用 A4 纸打印了一个9X6大小的手游大主宰游戏源码棋盘格,采集了一组对的双目图像,共三组,用于标定。其中一对图像样例及特征提取结果如下图所示:
基于标定板的标定算法一般是先为待求解参数设置初值,由于标定板上的特征点(如果是黑白棋盘格则是格子角点)分布及坐标已知,则采用 PnP 初始化所有相机的 pose ,然后使用非线性优化方法迭代优化。目标函数则是投影误差方程。
程序优化结束后,利用优化得到的内外参数值,可以得到去畸变及双目校正后的结果图:
图中红色方框为图像有效区域,而绿色直线为双目的对极线。可以看出,左右图中任意一个相同的点,都在同一条水平直线上,即完成了双目校正。我们还可以看到校正后的图像形变比较大,这是因为小觅相机采用的是 FOV 视角比较大比较接近鱼眼的镜头,而 pinhole 投影模型是平面投影模型,因此这样会导致形变比较大。如果 FOV 视角过大,则应该采用鱼眼投影模型比如 omni 模型来建模。
下面我们采用更加专业的标定工具包 Kalibr 来进行双目标定。Kalibr 不仅支持多种相机模型,畸变模型,还支持多相机标定,卷帘相机标定,imu-camera 联合标定。是目前开源工具包中功能较为全面的一个。
Kalibr 也支持多种类型标定板目标,如棋盘格,原点整列,二维码棋盘格,这里我们使用了 kalibr 默认的二维码棋盘格,其中图像样例及特征提取效果图如下,其中左图是角点提取效果, 而右图是二维码中心的提取结果,这种基于区域的特征提取相比基于角点的特征提取的优势是,对运动模糊更加鲁棒:
运行完 kalibr 标定程序后, 会生成一个详细的标定结果报告, 以下是一些标定结果示例:
从图中及标定结果可以看出小觅这款相机基本是平行的,相机间的相对旋转非常小。而我们得到重投影误差比较大,这一般与采集数据的过程,及标定板的精密程度非常相关。
在使用两种工具包的多组数据进行了标定之后,我们同时使用小觅相机的 api 获取了相机出厂自带的内外参,与我们自身标定的结果对比,我们使用 kalibr 标定了 5 组数据,使用 opencv 标定了 3 组数据,主要对比三类参数,camera0 的内参, camera1 的内参,camera1 相对 camera0 的外参:
由于 opencv 中的相机内参没有径向畸变参数,我们将其设置为 0 , 从表中数据可以看出,不同 kalibr 数据组之间的一致性比较好,与小觅出厂数据也较为接近。 但是与 opencv 的标定结果相差较大。
分析 imu-camera 联合标定
Kalibr 最大的优势在于可以实现 imu 和 camera 的联合标定,相比 visual-odometry , visual-internal-odometry 具有尺度可知,重力方向可知,旋转预测精确等许多优势,因此在 camera 系统中加入 imu 是许多 slam 系统的选择,但是 imu 和 camera 之间相对关系的标定还是一个相对复杂的问题。而 Kalibr 将这个问题纳入了工具包,提供了标定的算法。
Kalibr 做 imu-camera 联合标定的前提是提供 camera 标定参数, 及 imu 是已经校正好的 (kalibr 也提供更复杂的算法联合标定时同时标定 imu 的 scale 和 misalignment , 但本文不考虑这个问题) 。因此我们在对手中的小觅相机做联合标定时, 使用了上一节 kalibr 标出的相机内外参作为固定参数, 在采集 imu 的时候还设定了 PROC_IMU_ALL 模式,即同时校正了温漂问题和 scale/misalignment 问题。
Kalibr 做 imu-camera 联合标定的框架与camera标定的框架基本一致。需要标定 imu 与camera 的相对旋转和平移。但与 camera 标定最大的不同是,camera 标定是静态的标定,而 imu 数据是时序相关的,每个数据都带一个时间戳,即动态标定。camera 产生的图像数据的时间戳与 imu 产生的 gyro/acc 数据的时间戳并不一定完全同步,所以涉及到不同硬件的时间戳同步问题。因此 Kalibr 还将 camera 与 imu 之间时间戳的延时加入了优化参数中。
参照 Kalibr 的文档,我们同样采集了 5 组数据用于标定,在数据采集过程中需要注意的主要有两点,一是需要经量激励加速度计的各个轴,因此只有 imu 产生足够的数据变化,一些参数才能变得可观,即可优化。二是需要提高外部环境光强度,降低快门和曝光时间,因为需要运动,如果曝光时间长,则图像会产生运动模糊,会影响特征提取的精度。下图是运行 kalibr 动态标定的重投影误差结果示意图:
从上图可知,结果有一些误差比较大的 outlier 点,这可能会影响标定的效果。
在和小觅的技术同学沟通后,小觅的技术也进行了 Kalibr 标定,从重投影误差看,标定的结果还可以,outlier 较少。
标定的结果有很多影响因素,这个问题,还可以进一步深挖。
小觅的技术标定结果如下图:
我们使用 api 从小觅相机中读出出厂标定的结果,与我们 kalibr 的标定结果做对比,数据如下:
从表中可以看出,在 imu 与 camera 的相对平移值上,我们的标定结果与出厂数据差别较大,达到厘米级,但是 kalibr 结果本身的分布是相对一致的。
鱼眼相机图像如何矫正?
相机分为窄角相机和广角相机,相机模型主要分为针孔相机模型和鱼眼相机模型。图像畸变根据模型可以分为径向切向畸变模型和鱼眼相机的Kannala-Brandt畸变模型。OpenCV提供了针对鱼眼相机图像去畸变的函数。
在OpenCV中,涉及图像去畸变的函数为undistort和remap。undistort函数有两版,分别对应普通相机和鱼眼相机。remap函数用于计算无畸变图像。
去畸变过程中,需要引入新的相机内参矩阵newCamMat,用于调节去畸变后的视野大小。通过Estimates new camera matrix for undistortion or rectification函数来估计此矩阵。之后,利用initUndistortRectifyMap函数初始化畸变矫正矩阵,并转换为map1和map2。通过remap函数,利用map1和map2计算无畸变图像。
在使用remap函数进行图像矫正时,需要调用remap函数,并将view图像、新的内参矩阵newCamMat、map1和map2作为参数输入。INTER_LINEAR插值方式用于图像矫正。
在OpenCV中,还提供了针对点的去畸变函数distortPoints,分别适用于鱼眼相机和窄角相机。
为了更好地理解和实现图像去畸变的过程,可以参考示例程序。这些程序展示了如何使用上述函数,完成图像的去畸变操作。
请注意,为了提高算法运行速度,OpenCV将undistort函数扩展为initUndistortRectifyMap函数。通过输出两个查找表map1和map2,可以更高效地进行图像矫正。
以上内容详细介绍了OpenCV中针对鱼眼相机图像去畸变的函数和过程,包括undistort和remap函数的使用方法,以及点去畸变的distortPoints函数。通过这些函数,可以有效地处理和矫正鱼眼相机拍摄的图像。为了更深入地学习和实践这些技术,可以查阅OpenCV文档或相关教程。关注我,获取更多关于计算机视觉的资源和信息。
AVM环视系统——鱼眼相机去畸变算法
在AVM全景环视系统的研发中,我亲历了鱼眼相机去畸变的挑战,通过自定义算法和OpenCV的深厚支持,实现了高效处理。以下将深入解析这一过程,包括模型理解、参数估计、标定方法,以及去畸变背后的科学原理和C++实践。
首先,鱼眼相机模型并非传统的等距或线性投影,而是光线在经过特殊镜头后,图像中心呈现汇聚。OpenCV中,Kannala-Brandt模型是常见的处理手段,它内置于库中,为我们的工作提供了便利。
标定阶段,我们借助标定板法来计算相机参数,包括内参和畸变系数。然而,在实际应用中,快速标定往往仅获取外参,而出厂相机的内参如焦距和内参矩阵则可以作为初始值使用。
去畸变的核心在于理解光线的折射与成像点的关系。畸变表提供了这一桥梁,通过多项式拟合,例如Python的`curve_fit`,我们得以确定畸变参数。在拟合过程中,必须考虑实际焦距,它可能与内参矩阵中的f/dx不同。
在C++实现中,OpenCV的`cv::fisheye::initUndistortRectifyMap`函数扮演关键角色,它需要输入内参K、畸变参数D、校正变换R和新内参P,以及输出图像的尺寸。K参数表示镜头的焦距与感光元件尺寸的比例,主点位置则是内参矩阵的焦点。
去畸变时,我们可能需要调整输出图像的相机参数,如增大图像尺寸。例如,将主点坐标扩大一倍(`intrinsic_undis(0,2) *= 2, intrinsic_undis(1,2) *= 2`)或四倍(`intrinsic_undis(0,2) *= 4, intrinsic_undis(1,2) *= 4`),以最大化视野。为了优化性能,我们可能还需要调整f值,使去畸变后的图像更紧密贴合原图像。
代码示例展示了如何在C++中操作这些参数,通过计算每个像素在去畸变和鱼眼图像之间的映射关系,确保图像的正确显示。
去畸变过程的每一步,从归一化平面的转换,到Kannala-Brandt模型的应用,再到像素坐标的调整,都体现了算法的精密与复杂。特别是角点检测,它在鱼眼图像中的表现尤为重要,而OpenCV的undistortPoints函数则提供了一种从鱼眼到去畸变的高效转换。
值得注意的是,去畸变后的角点检测通常在原始鱼眼图像上进行,而非去畸变后的图像。这要求我们在设计算法时灵活处理,可能需要自定义函数,如`CalibrateInit::warpFisheye2Undist`,来优化多项式拟合,提高处理速度。
总结来说,鱼眼相机去畸变是一个技术密集型的挑战,它涉及相机模型理解、参数精确计算和高效算法设计。在AVM全景环视系统中,每个环节的优化都是提升系统性能的关键。我们期待与行业同仁共享经验,共同探索更优的去畸变方法。