【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹

这篇具有很好参考价值的文章主要介绍了【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本博客使用的图像是188*120的大津法二值化图像。摄像头安装高度为25cm(离地),前瞻长度约1m。

智能车图像处理的过程就是读取输入的图像,经过处理后向控制部分输出一个偏差值,控制部分根据再这个偏差值输出相应的控制量,对偏差进行修正,这就是最基本的循迹。

​ 在得到二值化图像后,我们如何进行最基本的使用呢?

赛道边界的简单提取

​ 二值化图像中,在没有反光、不均匀光照和场外杂物的影响时,赛道和蓝布应当具有清晰的边界。我使用的是二值化后的原始图像,没有进行图像滤波等平滑毛刺处理,因为我在进行误差计算的时候使用的是均值,这么做的好处是容许因边界存在毛刺或者锯齿造成的误差而不会很大地影响最终计算的偏差值。误差的具体计算方式后面再细讲,这里先说边界的寻找。一般情况下,循迹主要靠图像远端偏差进行误差计算,这样可以有提前量。赛道边界不需要跟踪到迂回弯道之后,跟踪到迂回弯道之后不仅代码编写难度高很多,而且计算的偏差值意义不大。摄像头的优点是前瞻长,但是成也萧何败萧何,前瞻过长也不是好事。赛道边界需要分别保存在左右两个数组中,这两个数组最好是全局变量,以便后续循迹偏差计算和元素识别使用。

​ 赛道边界提取最简单有效的办法就是种子生长法。根据赛道近端一定是白色的特性(不是这样的话车基本已经出赛道了),首先找到图像图像最下方一行白色的中点,作为全图搜索的seed;接着从近到远(也就是图像中的从下到上)开始分别向左和向右搜索黑白交界点,找到黑白交界点就分别保存在左右边线数组中,并且根据(左边+右边)/2的方法计算该行中线横坐标,保存至中线数组中,并且作为下一行的seed,继续如上过程,直至全图搜索完毕。如果在该行某一侧没有搜索到边界,则给该侧边界数组的该行对应元素存入0或者187,标示为丢边。这样,整个过程就像是中线的种子从图像下方生长至图像上方,所以我给它起名种子生长法。这么做的好处就是,可以实现直道以及非迂回弯道的简单中线跟踪,且由于种子是根据最下方一行的白色赛道中点确定的,在小弯中的表现更加稳定,因为如果直接默认从最下方的一行中点作为seed向上搜线的话,在小弯中车的视野中赛道很有可能只在图像的一侧,一旦最下方的白色仅仅处于图像中心的一侧,就会出现边界扫描错误的情况,导致偏差计算出错,车会直接往弯的反方向打舵机冲出赛道。而种子生长法就不会出现这样的问题。

循迹偏差值的计算

​ 关于循迹,其实有很多可以利用的参数,也衍生出了很多方案,我也没有接触过那些高级的制导方法,只能简单讲一讲自己接触过的几种方法了。

  1. 动态中线长度+每行平均偏差法

    ​ 这里的“动态中线长度”指的是从下至上,中线的不截断长度。这里的“截断”,指的是手动设置一个截断阈值,在扫描中线的时候,如果下一行与上一行的中线点像素横坐标差值大于这个阈值,就认为中线发生了截断,发生截断后就停止向上搜索中线,并且记录下已经搜索到的中线长度,认为是“有效中线”。然后,就在这段“有效中线”内,每行与图像中心坐标相减,再求取平均值,就得到了一个偏差值。之所以想到了这样一个“动态中线长”的方法,是因为我考虑到近端图像相较于远端图像更为稳定,且在弯道处远端没有搜索到边线的一段不应该纳入计算。但是这种方法对于弯道和存在元素的地方适应性并不是很好,过弯轨迹并不是很理想,因为这种方法压制了前瞻,在远端出现变化需要做出响应时往往不能很及时地调整误差。

  2. 动态中线长度+各行权值偏差法

    ​ 这种方法是在第一种方法的基础上,给每行都引入了一个偏差权值,这个偏差权值提前计算好存储在一个数组内(权值表)。在PID参数不变的情况下,调整这个权值表中各行的权值,可以微调过弯轨迹(算是变相起到了PID的作用hh)。当然,这个权值的计算也可以在写程序的时候用一个函数计算,但我为了加快运算速度就把每行的权值打了一张表。这个表的获取也可以用简单的MATLAB程序实现。测试当这个权值符合σ(0.5,1)时,效果较好(其实只要基本上符合中间大远近小的规律就行了,这个测试的结果与我最后采用的一种方法得出的结果是一致的)。

  3. 动态中线长+最小二乘斜率法

    ​ 这里引入了最小二乘法进行中线偏差的计算,拟合出一条直线,使之尽可能多地经过中线上的点,接近曲线的形状。这里的中线偏差通过计算出直线的斜率k来体现。在这种机制下,理想的偏差值应当是∞。下面给出最小二乘法拟合直线的公式:

    【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹

  4. 固定区域中线+每行平均偏差法

    在追求了很久的“动态”和“自适应”之后,发现那么多花里胡哨的稳定性其实可能还不如固定的“呆”方法……

    ​ 这个方法就是在图像上选定两条横线,以这两条横线之间的中线为基准进行偏差计算,相当于第二种方法的某些行权值置为1,其他行都置为0。通过调整偏差计算的行数,可以调整循迹前瞻和循迹轨迹,对于抖动的消除也有一定的辅助作用。采用这种方法可以较好地固定过弯轨迹。这种方法最极端的简化版本就是使用单行循迹,只使用一行的边界信息(龙邱的库就是这样的),也就是类似于CCD的原理,实测也是可行的,就是容易在弯道处因为前瞻超出了弯道外,存在一定程度的抖动,所以就不采用了(虽然但是,摄像头不就是一个有很多行的线性CCD么hhh)。

中线与偏差的修正

弯道误差修正

​ 在以上的搜线逻辑中,在遇到边界丢线的情况时,默认该行边线在图像的最左侧或者最右侧,这样在过弯的时候就存在一个问题:无论弯的大小,偏差值的大小都是近似的,即使在急弯误差也非常小,使得过弯时舵机打角不足,从而导致过弯失败。这时候就需要进行左右判别和偏差修正了。因为直道的宽度基本是固定的,所以可以先记录下直道上图像上各行的赛道宽,在过弯时进行左右弯的判别,判定完毕后,在已有的一侧边线上向左或者向右补上这一段赛道宽度,就可以补出另一侧边线,再利用补完后的边线数组进行中线的计算,可以大大降低误差。不过,这种方法对于摄像头的安装高度和安装角度、前瞻距离以及摄像头是否居中都有较高的要求。

左右弯道的判别

​ 在以上修正中,需要先行判定左右弯道,如果判定不好的话,很容易在其他地方出现误判,使得边线修正异常触发,中线发生严重抖动。通过观察弯道处的图像可以发现,弯道的特征是:指向的一侧丢线较多,另一侧丢线较少, 且图像上方应当是黑色的,而且丢线较少的一侧边线横坐标是呈现逐渐递增或者递减的,这个逐渐递增或者递减可以利用从下而上边线斜率绝对值的逐渐递减来进行判定,当然停止判定的边界条件一定要找好,不然极其容易发生误判,这个边界条件是需要具体情况具体分析的,还是得自己慢慢摸索确定。根据这几个特征编写程序,可以有效判别弯道的左右,从而进行相应的中线修正。其实只要PID调整得够好,这种修正也不是必要的,因为防止误判的边界条件最后加了很多依旧会在少数情况下发生误判,所以最后我也弃用了这种方法。

偏差滤波

​ 曾经为了抑制车模运行过程中晃动使图像抖动从而使得偏差抖动过大的情况,我也尝试过对偏差进行滤波,使用的方法有均值滤波、加权平均递推滤波等,但是最终效果并不是很理想,使用滤波后,车子就像喝了假酒一样,过弯响应极其滞后(也有可能是因为图像处理速度跟不上,当时并没有调整过编译器优化),所以最终我还是放弃了偏差滤波,转而采用使得偏差本身更加稳定的方法计算误差。因为使用滤波就注定要使用前几帧的图像信息,图像处理至高50Hz,即使只采用前一帧的信息,延后量也达到了40ms,在2m/s的速度下这足够使车冲出去8cm,这对于元素识别或者循迹已经是很致命的影响了。当然也可能是我采用的滤波方法是我自己草草写的,很不完备,如果大家对于误差的平滑化有什么高见的话,欢迎在评论区一起交流!文章来源地址https://www.toymoban.com/news/detail-411544.html

总结

  1. 利用二值化图像的方法,首先就是将赛道边界提取出来存入边线数组内,使之成为可以直接参与运算的数据。
  2. 边界的搜索可以使用种子生长法,对于弯道效果较好。
  3. 图像的处理最终需要输出一个循迹偏差,这个偏差可以有多种形式,也可以不止是一个参数,甚至可以是一个数组甚至矩阵,但是最终反映到控制量上一定要稳定且可靠。
  4. 循迹偏差计算我采用的是最简单的固定区域平均偏差法,这种方法虽然看起来很笨,但是胜在稳定高效。
  5. 理论上,偏差在弯道处是需要修正的,偏差也需要进行滤波处理,但是实测效果并不是很理想,所以暂时放弃了这个方案。

到了这里,关于【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十七届恩智浦杯室外ROS无人车竞速赛仿真

     学长说让以考促学,用做过的比赛来检验ROS的学习效果,看我们能不能灵活运用。(′д`)ゞ 目录 1.vscode准备工作 2.首先需要搭建gazebo仿真环境 3.launch文件打开gazebo仿真环境代码集成主要包括两大部分         才做了一个开头车还不会动,恩智浦杯的实物车出了点问题,

    2024年02月09日
    浏览(26)
  • 十七届智能车智能视觉组

    总结一下比赛过程,省二菜鸟,欢迎大佬指教 详情见十七届比赛细则第十七届智能车竞赛智能视觉组比赛细则_卓晴的博客-CSDN博客_智能视觉组,我这里简单介绍一下。 任务流程可以概括为:小车在起点出扫描一张A4纸(A4纸上有坐标点进而获得各个目标的位置)-扫描完后出

    2023年04月16日
    浏览(25)
  • Python遥感图像处理应用篇(二十七):Python绘制遥感图像各波段热力图(相关系数矩阵)(续)

    续-https://soderayer.blog.csdn.net/article/details/125757807 上一篇中使用csv文件计算的相关系数热力图,本篇我们直接使用遥感图像来计算图像波段之间的相关系数。 实际上,目前已有的软件,如ENVI就可以直接计算图像波段之间的相关系数,该工具计算的是合成波段之间的相关系数。如

    2023年04月17日
    浏览(35)
  • 数字图像处理(实践篇)二十七 Python-OpenCV 滑动条的使用

    目录 1 涉及的函数 2 实践 1 涉及的函数 ⒈ setWindowProperty()用于设置GUI应用程序的属性 参数 : ① 

    2024年01月25日
    浏览(37)
  • (数字图像处理MATLAB+Python)第十二章图像编码-第一、二节:图像编码基本理论和无损编码

    图像编码 :一种将数字图像转换为压缩表示形式的过程。它的目标是减少图像数据的存储空间,并在传输或存储时减少带宽和存储需求、主要分为两类 无损压缩 :尽可能地保留原始图像的所有信息,以实现无失真的压缩。其中最常见的算法之一是无损JPEG(JPEG-LS)编码,它

    2024年02月10日
    浏览(30)
  • (数字图像处理MATLAB+Python)第十二章图像编码-第三、四节:有损编码和JPEG

    A:概述 预测编码 :是一种数据压缩技术,旨在通过利用数据中的 统计规律来减少存储或传输所需的比特数 。它基于预测模型,根据已经观察到的数据来预测未来的数据,并将预测误差编码和传输。预测编码的过程通常包括以下几个步骤 模型训练 :首先,根据已有的数据,

    2024年02月09日
    浏览(32)
  • 【Python入门系列】第十篇:Python图像处理和计算机视觉

    图像处理和计算机视觉是计算机科学中非常重要的领域之一。Python作为一种功能强大且易于学习的编程语言,提供了许多用于图像处理和计算机视觉的库和工具。本文将介绍一些常用的Python库,并提供一些示例代码。 Python中有几个流行的图像处理库,其中最常用的是OpenCV和

    2024年02月12日
    浏览(29)
  • (数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述

    A:概述 边界链码 :是一种用于图像处理和计算机视觉领域的技术,主要用于 描述二进制图像中物体的轮 廓。边界链码通过将轮廓转化为一系列有序的连续像素点来表示。边界链码的基本思想是 从图像中选择一个起始点,然后按照一定的顺序遍历相邻像素,将它们连接起来

    2024年02月10日
    浏览(37)
  • 智能文档图像处理技术:解决大数据时代文档图像处理难题

    智能文档图像处理技术是指利用计算机视觉和人工智能等技术对文档图像进行处理和分析,实现自动化识别、提取、分类和管理的技术。随着人工智能时代的到来和各行业信息化进程的加速,越来越多的个人和企业用户开始借助智能文档图像处理技术来提高工作效率,降低人

    2024年02月09日
    浏览(31)
  • 智能车图像处理逆透视教程

    去畸变请参考: 图像处理去畸变教程_LoseHu的博客-CSDN博客 去畸变+逆透视请参考: ​​​​​​​​​​​​​​​​​​​​​智能车去畸变+逆透视教程_LoseHu的博客-CSDN博客 逆透视: 如下 对于初做车的同学,看见摄像头图像神奇的侧视角难免会有些烦躁,我刚开始也是

    2024年02月06日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包