恩智浦杯(飞思卡尔)全国大学生智能车竞赛摄像头简单的图像失真矫正技术原理与实现(透视变换)

很多小伙伴留言要资料的,贴了一个链接貌似也失效了,这里我把一些有关矫正的资源放在这里,大家如果有需要可以从这里下载:恩智浦杯智能车矫正、透视变换资料下载https://download.csdn.net/download/m0_37454852/10924951

 

一、图像为什么会失真,为什么会发生梯形形变?

  我个人认为,摄像头和人眼的作用是差不多的。梯形形变就像是我们站在路上,会感觉近大远小,会感觉到路两边的路肩在远处交汇于一点。而之所以我们仍然感觉路是直的,是因为我们的大脑对道路进行了矫正处理,把咱们的视角从侧方变成了上方,把梯形矫正成了矩形。那么车的哪部分执行的是我们大脑的功能呢?毫无疑问,是单片机和咱们程序员写的程序,程序相当于思维。(下图一相当于发生了梯形畸变)

(两张图源于百度图片,侵删)

二、为什么要进行矫正?

  首先,摄像头的优势在于数据多,但如果应用不好反而会成为劣势。在对图像进行矫正之后,我们便可以更加精准地提取图像信息,例如偏差、斜率、曲率等。如果不对图像进行矫正的话,偏差、斜率、曲率的值都是错误的,根本没有正确地反应出赛道的有效信息。以曲率为例,学过高等数学的都知道,曲率是半径的倒数,曲率越大则说明赛道弯曲度更大。相比于偏差和斜率来说,曲率则更加地能反映出赛道的弯曲度信息。矫正之后,我们便可以利用曲率进行控速,直道加速弯道减速。

三、常见图像失真都有哪些类?

  常见有梯形畸变、桶形畸变(貌似手机相机的鱼眼镜头?)、枕形畸变等。

(源于百度图片,侵删)

三、如何矫正?

  我个人理解,矫正要做的就是把图像的像素点从一个平面映射到另一个平面。假如只是简单地考虑最最简单的梯形失真,那么我们只需要把梯形的四个角重新拉成我们所需要的矩形即可。

  

 

  随手画了图,汗……

  我们只需要把梯形上面的两个角拉成它实际的比例大小即可完成梯形失真的矫正。

 

 

  ——————————————分割线—————————————

 

  有同学评论说还是不太懂怎么矫正,我再修改一下本博客——————(上图2是现在补充的)

  

  做智能车摄像头组的应该都知道,其实所有的图像都是一个二维数组,或者说是一个矩阵。那么图像变换其实说白了,在程序里的表现就是矩阵变换而已。

  请大家看上图2和第四点中我贴出来的矫正图。这里对上图2做一下声明——里面的黑色小方框表示原本的图像矩阵,外面的蓝色大方框表示矫正后的图像矩阵,棕色梯形表示赛道,棕色长方形表示矫正后的赛道图像,红色表示矫正后各个关键点的位置变化(以最底层的像素点不移动为例,这种情况最简单)。

  我们在矫正的时候只需要考虑中间棕色梯形变成棕色矩形的变化就可以了,其他的像素点在乘以同一套参数的同时会自动矫正好。

  注意,我们只需要计算出一套参数!大概只有9个数 或者可以用查表法,所谓查表法就是用计算好的参数预先算好原图像数组的每个像素点对应矫正数组的每个点的位置,需要算某个点的时候直接查表即可。

  那么我们应该如何计算变换的比例呢?假定最底层的那一行不移动的话,那么我们只需要测量出最底层那一行所代表的实际的长度大小downlen和像素点个数downnum、图像最上层所代表的大小uplen和像素点个数upnum,图像纵向所表示的实际长度(即前瞻)prospect。那么便可以计算矫正后的图像所需要的像素点……emmm,不想写了……再写就有点费脑子了……我这有点从智能车论坛搜刮来的矫正资料就是讲这一点的(两个矩阵间的映射变换,膜拜朱大神),贴链接:http://www.znczz.com/forum.php?mod=viewthread&tid=239510。(链接貌似失效了,大家可以点击文章开头那里的超链接去下载)

  简单说,就是求梯形变矩形应该把该边放大多少倍而已,我们只需要计算出这个矩阵的像素点映射到另一个矩阵的像素点应该乘以的倍数,这应该是小学数学范围内的知识。

  至于程序方面,千万不要被我下面那张矫正效果图迷惑,那张图只是我在matlab里做的仿真而已。我们不必把每个点都做矫正处理,这样的话会非常浪费计算资源,导致程序周期变长、使车反应变慢,从而会使车压露肩、过弯不灵敏等。我们只需要把我们需要用的点,比如已经找好了的左右边界线和中线做矫正,然后用矫正好的点计算偏差等即可。

  另外再提醒程序员一点,矫正图像的二维数组的大小是可以计算出来的,千万不要数组越界,当数组下标是个变量时IAR是不会给你警告这个数组会越界的,然而数组越界又会导致一些很灵异的bug,所谓的玄学……

  对于其他的图像失真情况,我们只需要找到合适的数学模型,然后做映射就行了,大概异曲同工吧,我在十二届只遇到了梯形失真,所以大家要是遇到了其他的,自己想想吧,就别问我了,我可能不会(逃)。

  可能还说得不够清楚,如果哪里还不太明白可以继续留言,我尽量补充。


  —————————————分割线————————————

 

四、完成矫正

  给大家看一下我做的矫正的效果图吧。

 

  可能因为上传的原因,校正图有点变形了

 

  ———————————————分割线—————————

 

  再次研究矫正算法,加入插值处理。采用了最简单的最临近插值方法。下面展示效果,程序后面会努力完善。

 

 

 

 

 

 

以上四张图分别是:原图像、矫正后、插值后、反矫正

(由于上传原因变形了,点击图片放大后可以查看原图)

(最后那张图的黑点我个人认为是误差导致,那道黑色横线放大之后是没有的,压缩之后反而有)

 

相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页