1.综述!鱼眼源码鱼眼用于自动驾驶的标定标定全景鱼眼感知:概述、调查和挑战
2.opencv去畸变的相机方法图像去畸变vs点畸变
3.基于Python实现相机标定正畸并生成鸟瞰图
4.小觅双目摄像头D1000-IR-120/Color模组评测(下)
5.鱼眼相机图像如何矫正?
6.AVM环视系统——鱼眼相机去畸变算法
综述!用于自动驾驶的鱼眼源码鱼眼全景鱼眼感知:概述、调查和挑战
摘要:
在自动驾驶的标定标定前沿领域,全景鱼眼摄像机扮演着至关重要的相机asp源码手机版角色,它们提供了°无死角的鱼眼源码鱼眼感知,尤其在近距任务中,标定标定如自动泊车。相机然而,鱼眼源码鱼眼数据集的标定标定局限性限制了更深入的研究,目标检测的相机高精度要求(精度达到厘米级)和大径向畸变带来的算法扩展挑战是亟待解决的问题。本文详尽探讨了鱼眼相机模型,鱼眼源码鱼眼如针孔、标定标定经典几何(如等距和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函数获取相机参数,然后进行畸变矫正和图像剪切,最后生成鸟瞰图并进行视角调整。 实验结果显示,使用自己拍摄的照片进行正畸后,棋盘格被正确地映射到左上角,pixiv游戏源码视角可通过参数调整。然而,过程中也遇到过模糊图像的问题,通过调整视角变换矩阵参数解决了此问题。 总结来说,这次实验加深了对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大小的国外threejs源码棋盘格,采集了一组对的双目图像,共三组,用于标定。其中一对图像样例及特征提取结果如下图所示:
基于标定板的标定算法一般是先为待求解参数设置初值,由于标定板上的特征点(如果是黑白棋盘格则是格子角点)分布及坐标已知,则采用 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全景环视系统中,每个环节的优化都是提升系统性能的关键。我们期待与行业同仁共享经验,共同探索更优的去畸变方法。