草庐IT

智能汽车感知前端处理难点之图像畸变校正技术浅析

Jessie 2023-03-28 原文
我们知道,摄像头在进行图像拍摄时,最理想的位置是能垂直与拍摄平面的,这样能保证图像能按照原来的几何比重重现。然而在智能驾驶汽车的实际应用中,受到智能车车体结构的限制,车体控制要求摄像头有一定的预瞄距离,摄像头的水平和垂直扫射面通常是成扇形扩张的,且摄像头与地面一般成一定角度安装。这种角度的存在会在图像边缘处造成一定的成像畸变。畸变的结果是在后期图像处理过程中产生一系列如下的类似问题:

1)垂直线被拍摄成斜线导致斜率计算错误;

2)远处的弯道可能由于畸变被压缩导致曲率计算错误等等;

3)对于旁车道车辆状态在识别过程中产生严重的畸变,在后期处理的时候会存在匹配不上的问题;

诸如上面各类问题都是可能存在在整个图像感知中,如果畸变处理不得当会对整个图像质量和后续神经网络识别造成较大的风险。为了满足智能车的实时控制需求,一般需要在实际应用场景中针对摄像头图像畸变提出相应的矫正算法。

01 智能汽车主要的畸变种类

相机畸变包含径向畸变、切向畸变、离⼼畸变、薄棱镜畸变等,智能汽车上的相机畸变主要有径向畸变和切向畸变。

径向畸变分为桶形畸变和枕型畸变。

通常我们智能泊车系统一般采用的环视摄像头由于采用广角拍摄,其对应的畸变类型通常是径向畸变。径向畸变产⽣的主要原因是镜头径向曲率的不规则变化,它会导致图像的扭曲变形,这种畸变的特点是以主点为中⼼,沿径向移动,离的距离越远,产⽣的变形量就越⼤。对于⼀个矩形的严重径向失真需要被较正成理想线性镜头的图像才可以进入后端处理过程。

而行车系统一般采用的前视、侧视、后视摄像头由于采用一般的CMOS工艺摄像头进行拍摄,且由于前侧视摄像头安装过程中可能不能保证透镜与成像面严格平行,同时也可能是由于制造上的缺陷使透镜不与成像平面平行,从而产生切向畸变,这种现象通常发⽣于成像仪被粘贴在摄像机的时候。

径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5*1的矩阵,依次包含k1、k2、p1、p2、k3,经常被定义为Mat矩阵的形式。

对于畸变矫正来说,这5个参数就是相机标定中需要确定的相机的5个畸变系数。参数k1、k2、k3被称为径向畸变参数,其中k3是可选参数。对于畸变严重的相机(如⻥眼相机),可能还会有k4、k5、k6。切向畸变可以用两个参数p1 和 p2 来表示:至此,得到了共五个参数:K1、K2、K3、P1、P2,这五个参数是消除畸变所必须的,称为畸变向量,也叫相机外参数。

因此,求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真,下图显示根据镜头畸变系数校正后的效果:

通过5个畸变系数找到这个点在像素平面上的正确位置公式如下:

畸变后的点可以通过内参矩阵投影到像素平面,得到该点在图像上的正确位置(u,v):

02 图像畸变矫正方法

与相机模型方法论不同,图像去畸变是为了补偿透镜缺陷,对原始图像进行径向/切向去畸变,之后在使用该相机模型。处理图像畸变的方法主要涉及选择何种相机模型进行图像投影。

典型相机模型投影方式有球面模型和柱面模型。

1、鱼眼相机成像畸变矫正

通常类似鱼眼镜头会产生极大的形变,比如普通相机成像过程中,直线投影到像平面上还是一定大小的直线,但是鱼眼相机拍摄的图到像平面上则会变成非常大且长的直线,甚至部分场景下直线检测会被投影到无穷大,因此针孔模型无法为鱼眼镜头建模。

为了将尽可能大的场景投影到有限的图像平面内,鱼眼镜头一版由十几个不同的透镜组合而成,在成像过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。

研究表明鱼眼相机成像时遵循的模型近似为单位球面投影模型。这里我们为了更好的适配相机针孔模型的推导过程,常用的方法是采用投影到球面相机模型过程来进行。

对于鱼眼相机成像过程的分析可以分成两步:

  • 三维空间点线性投影到一个球面上,当然这个球面是我们假设的虚拟球面,将其球心看成与相机坐标原点重合。
  • 单位球面上的点投影到像平面上,这个过程是非线性的。
如下图表示了一种智驾系统中从鱼眼相机拍摄变换到球面相机的图像处理过程。假设相机坐标系下的点为X=(x,y,z),像素坐标为x=(u,v)。那么它的投影过程表示如下:   

1)第一步是用摄像机采集世界坐标系下的三维点,并将图像坐标系下的成像点投影到归一化单位球面坐标上;

2)将相机坐标中心沿着z轴偏离个单位,得到如下:

3)考虑单位球面,将球面进行归一化为1个单位:

4)将球面投影模型变换到针孔模型上,得到相应的主点坐标,以该主点坐标可以建立对应的标准的相机坐标系模型:

2、柱面坐标投影

对于诸如前视、侧视摄像头这样的终端来说,通常捕获的图像主要产生的是切向畸变。切向畸变通常推荐采用柱面相机模型,其优点是指用户可以获得诸如鱼眼相机的全景图中360度范围内任意切换视线,也可以在一个视线上改变视角,来取得接近或远离的效果,同时,柱面全景图像也较为容易处理,因为可以将圆柱面沿轴切开并展开在一个平面上,传统的图像处理方法常常可以直接使用,柱面全景图并不要求照相机的标定十分准确。用户在水平方向上有360度的视角,在垂直方向上也可以做一定的视角变化,但是角度范围则受到限制,由于柱面模型的图像质量均匀,细节真实度更高,应用范围比较广泛。

总体来说,柱面全景图显著优点归纳为以下两点:

1)它的单幅照片的获取方式比立方体形式和球面形式的获取方式简单。普通车载相机(如前视、侧视摄像头)基本就可以获取到原始图像。

2)柱面全景图容易展开为一个矩形图像,可以直接用计算机常用的图像格式进行存储和访问。柱面形式的全景图在垂直方向允许参与者视线的转动角度小于180度,但是绝大多数应用中,水平方向的360度环视场景足以表达空间信息。

这里我们重点讲下如何利用柱面相机对原图像进行畸变矫正处理的算法,实际上这是个从获得虚拟相机到原相机映射关系的过程。这里的虚拟相机是指针对真实图像到生成柱面图的映射关系。

如下图表示了一种智驾系统中从普通车载相机拍摄变换到柱面相机的图像处理过程。其中,获得虚拟相机图⽚的实质就是求虚拟相机到原相机的映射关系,通⽤的过程如下:

首先,对于前/侧视原始视频图像可以设置为目标图像dst img;其中该目标图上的主点(u,v)为基础点进行2D到3D的逆投影变换到目标相机坐标图上,该目标相机可重构出世界坐标系下的该点位置(x,y,z);随后,在三维坐标系下通过投影变换算法得到虚拟相机下对应的原始相机图像Src Camera;在对该原始相机图像进行3D到2D的投影变换就可以得到对应的矫正后的图像Src img(u’,v’),该图像可通过重构的方式恢复出虚拟相机下的原始图像dst img。

从柱面相机模型可以看出柱面相机模型到针孔相机模型的变换公式如下:

如上公式中,其中u,v表示针孔相机平面主点(也叫像素坐标系中的坐标),fx、fy、cx、cy表示由于制造或安装误差产生的两个坐标轴偏斜参数。该主点乘以圆柱坐标系下的半径距离则可以得到相应的投影在柱面坐标上。

ρ来进行多项式近似,柱⾯相机2D->3D空间的过程中是不确定ρ的,当Tdst=Tsrc时,ρ取不同值时,从3D空间->侧视/前视相机2D求得的虚拟相机的映射是相同的;若Tdst!=Tsrc, 得到的虚拟相机的图像随ρ的不同⽽变化。对于给定的柱⾯图2D位置(u,v),在给定ρ的条件下,由如上公式可以计算dst camera柱面坐标系下的3D的相机坐标xc , yc, zc。

Φ用来进行多项式近似,Φ是入射光线和图像平面的夹角,这个值和鱼眼相机的参数很像。

接下来是相机变换过程,总结起来包括如下过程。

首先设置虚拟相机图像分辨率为想要获取的鸟瞰IPM图的分辨率;其中虚拟相机图像的主点为IPM图分辨率的中心(一般假设不设置偏移)。其次,设置虚拟相机的fx、fy以及相机位置,其中高度设置为1,与fx、fy设置方式相对应,可以根据需求修改y的偏移量。由此,则可以根据目标相机dst camera的外参(R,T)dst,把dst camera相机坐标(xc,yc,zc)dst转化为观测坐标系vcs坐标,随后再结合src camera的外参(R,T)src,将VCS坐标转化为src camera相机坐标(xc,yc,zc)src 。

03 总结

由于车载相机通常搭载不同的成像镜头,这种多元件的构造结构使得对于车载相机的折射关系分析不能简单采用原来的针孔相机模型进行适配。特别是对于鱼眼相机来说,由于需要扩大可视范围,这种折射率所带来的图像畸变更是明显。本文我们重点介绍了适配于智能驾驶系统各类不同视觉传感器的去畸变方法,主要通过投影方式将世界坐标系下的图像投影到虚拟球面坐标系和虚拟柱面坐标系下,从而依靠2D—>3D的相机变换来去除畸变。部分算法在长期实践基础上相对于经典去畸变算法有所改进。

有关智能汽车感知前端处理难点之图像畸变校正技术浅析的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  6. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  7. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  8. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  9. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  10. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

随机推荐