第十八届全国大学生智能汽车竞赛——摄像头算法(附带个人经验)

这篇具有很好参考价值的文章主要介绍了第十八届全国大学生智能汽车竞赛——摄像头算法(附带个人经验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

参加了第十六,十七和第十八届全国大学生智能车竞赛,对摄像头的学习有部分心得,分享给大家,三届车赛,车赛生涯也算是到了尽头。打算从基础的算法开始,给各位一些个人看法,也是对车赛的一次总结。

一、摄像头图像处理

闲话:其实摄像头的算法有很多种,弄了两年摄像头,也只是学会了其中很小的一部分,但最终,作用都是大同小异的,也不必太过于追求算法上的完美。只需要达到能稳定提取特征,识别元素其实就够用了。(个人用的是普通大津+二值化+八领域做边界提取)

1、摄像头图像采集

打开摄像头相关例程,可以发现其实最终摄像头所采集的数据都存入了一个二维数组中,工作方式也很简单:图像采集,将图像采集标志置一。手动清零,就可以达到重复采集的目的。(没有相关例程的可以去找客服要,记得B站上也有逐飞的摄像头摄像头图像采集视频讲解)

智能车摄像头图像处理,汽车,计算机视觉,人工智能

2、图像二值化与大津算法

智能车使用的摄像头所采集的图像一般都是灰度图像,将图像分割、数字化成一个个的数(一个个的像素点),0~255,像素点颜色越白数字越大。我们可以看出图像信息很丰富,图像处理方法自然也就多种多样了,首先我们可以将图像二值化

二值化就是将图像上的灰度点分别设置为0,255(0xFF)(有点像二级分化)。图像直观上就会变为黑白图像。我们该按照何种规则分黑和白呢?这时候就需要我们找出黑、白的分界值(也就是阈值)(大于阈值即为白,反之为黑),然后可以遍历图像数组中每一个像素点,大于阈值设为0XFF(白),反之设为0(黑)。(二值化有一个进阶的思想:图像每一个点都需要二值化嘛,我们能不能只将要使用的点二值化呢,这样速度是不是就快了,这个其实开始没有必要弄,有一张完整的二值化图也方便我们理解)

:1,数组均从零开始。
2,二值化不能作用于摄像头采集原图上,应该重新定义一个同大小的数组,专门存放二值化后的图像信息。(防止在进行图像处理时,摄像头重新采集数据,覆盖之前数据)

/*
mt9v03x_image_dvp : 原图像   		 存放摄像头灰度原图
mt9v03x_image_baz :二值化图像        用于存放图像右边界 
WHTIE  宏定义  替换作用 与0xff相同
*/
#define WHTIE 0xff //255
#define BLACK 0x00
 //使用宏 通过单词代替抽象的数字 
    for(uint8_t i=0;i<MT9V03X_DVP_H;i++)             //MT9V03X_DVP_H:图像高
    {
        for(uint8_t j=0;j<MT9V03X_DVP_W;j++)         //MT9V03X_DVP_W:图像宽
        {
            if(mt9v03x_image_dvp[i][j]>=threshold )  //threshold:图像阈值
            {
               mt9v03x_image_baz[i][j]=WHITE;
            }
            else
            {
               mt9v03x_image_baz[i][j]=BLACK;


            }
        }
    }

后面就是确定图像的阈值了,因为真实环境亮度是变化的,单纯的给定阈值二值化就显得不够稳定,在图像的基础上动态的计算阈值适应性更强。我选择的是大津算法,也是常用且基础的一种了,缺点就是运算时间有点稍长。

大津算法的相关我就不说了,网上有很多相关介绍。(其实我理解的也不太透彻, 手动狗头保命)

二、左右边界,中线扫描

在二值化之后,我们得到了一个由黑和白组成的二维数组,而我们的目的是让小车时刻处于赛道中间位置,也就是图像中间位置。我们想要小车不出赛道,如果能让赛道的中线始终贴合图像数组的中间(此处图像数组的中间我们可以想象为图像的宽/2),那我们的小车是不是就不会出赛道了。图像数组的中间就像PID中的理论值,实际赛道的中线就像实际值。这样我们是不是就可以将图像与PID联系起来。
说回边界扫描,想直接找赛道中线还是比较难的,主要是没有明显特征,我们不妨先寻找左右边界(左右边界黑白相夹),左右相加除二求得中线。这样就得到比较真实的中线坐标,再对比理想中线坐标(图像中间,也就是图像宽/2),从而求出中线偏差,用于PID控制。思路大抵都是这样,但找的方法就很多种多样了。

基础的方法就是从中间往两边找,缺点是遍历了整幅图像,消耗时间稍长,而进阶的就有对普通两边找线方法的优化,(如:双最长白列法)。再进一步稍微复杂一点的有八邻域,迷宫法等等。

我们先来看看普通的两边找线法:
智能车摄像头图像处理,汽车,计算机视觉,人工智能

基本思路就是从最下行往上 (利于对之后对中线的处理),每一行从中间往两边,分别寻找左右边界(特征:黑白跳变),存入左右边界数组。
同时存下中线坐标,用于下一行中线的扫描。(这样减小运算量的同时还可以加大中线扫描时的连续性)左右边界相加除2求出该行中线坐标,存入中线数组。
注:

/* 
        last_mid:                   边界扫描起始坐标 每行边界从此开始 起始行为图像宽/2 后为前一行图像中线坐标
        MT9V03X_DVP_W:              图像宽
        MT9V03X_DVP_H:              图像高
        mt9v03x_image_baz[][]:      二值化图像数组
        left_flag[] :               左边界存在数组 左边界存在 标志置1
        left_flag[] :               右边界存在数组 右边界存在 标志置1
        left_border[]:              左边界数组 存放左边界坐标
        right_border[]:             右边界数组 存放右边界坐标
        Mid_border[]:               中线左边数组 存放中线坐标
*/

last_mid = MT9V03X_DVP_W / 2;    
for (int i = MT9V03X_DVP_H - 1; i >= 0; i--)//从下往上扫描
{
    left_flag[i] = 1;
    right_flag[i] = 1;


    for (int j = last_mid; j > 1; j--)//中间往左边扫描
    {

        if (mt9v03x_image_baz[i][j] == 0xff && mt9v03x_image_baz[i][j-1] == 0x00 &&  mt9v03x_image_baz[i][j-2]==0x00)//黑黑白认为找到左边界
        {

            left_border[i] = j;                       //将左边界存入左边界数组
            left_flag[i] = 1;                         //左边界找到,标志置0
            break; 				//跳出循环
        }

    }
    if (left_flag[i]==0) left_border[i]=0;              //补线标志未置一,此行左丢线,取图像左边界

    for (int j = last_mid; j < MT9V03X_DVP_W-2; j++)  //往右扫描
    {
    
        if (mt9v03x_image_baz[i][j]==0xff && mt9v03x_image_baz[i][j+1]==0x00 && mt9v03x_image_baz[i][j+2]==0x00)//白黑黑认为找到右边界
        {

            right_border[i] = j;                        //将右边界存入右边界数组
            right_flag[i] = 1;                         //右边界找到,标志置0
            break; 				//跳出循环
        }
    }
    if (right_flag[i]==0) right_border[i] = MT9V03X_DVP_W-1;           //补线标志未置一,此行右丢线,取图像右边界

    Mid_border[i] = (left_border[i] + right_border[i]) / 2;		//中线坐标
    mt9v03x_image_baz[i][left_border[i]-2] = BLACK; 	//左边界涂黑
    mt9v03x_image_baz[i][Mid_border[i]] = BLACK; 	//中线涂黑
    mt9v03x_image_baz[i][right_border[i]+2] = BLACK; 	//右边界涂黑       
   /* 注意  左右边界-2 +2 很容易存在数组越界 导致程序卡住 如  左边界点  left_border[i]=0;   [right_border[i]=MT9V03X_DVP_W-1
   自己使用时可以加个限制如
   mt9v03x_image_baz[i][(left_border[i]<2?2:left_border[i])-2] = BLACK; 	//左边界涂黑
   */
    last_mid = Mid_border[i];		//中线查找开始点,方便中线寻找
}

可以在图像上把边界显示出来,方便后面观察图像,像这样:
智能车摄像头图像处理,汽车,计算机视觉,人工智能
后续给各位说说我对八领域的理解,欢迎大家关注!!!文章来源地址https://www.toymoban.com/news/detail-730377.html




到了这里,关于第十八届全国大学生智能汽车竞赛——摄像头算法(附带个人经验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【2】--图像

    基本参数有两个,一个是采集标志位,一个是图像数组。 标志位很好理解,当摄像头采集完一帧图像,标志位会被置一,可以在主循环中不断读取标志位、当标志位是1时,你就可以读取该帧图像,处理完图像再把标志位清零,让他开始下一帧数据的采集。 根据习惯不同,也

    2024年04月10日
    浏览(18)
  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【3】--边线提取

    当摄像头成功获取一帧图像,并且预处理(二值化)之后,我们最重要的事情就是获取赛道信息。其中最基本的就是赛道编边界信息,左边,右边,中线等基础数据。 事先声明,没有那种算法是完美的,只要算法能够得到足够多想要的信息,那么他就是好算法。 不同算法之

    2024年02月08日
    浏览(33)
  • 第18届全国大学生智能汽车竞赛四轮车开源讲解【5】--直道、弯道、十字

    智能车花费时间最多的就是元素识别这一环节,经过我们前几章摄像头矫正,边线提取,中线计算,速度/方向控制。这几个环节都做好的话,车子是可以在简单的赛道中间进行基本的寻迹。沿着直道,弯道走。 但是想要完成比赛要求,需要对元素进行处理,包括但不限于:

    2024年02月06日
    浏览(15)
  • 第十五届全国大学生信息安全竞赛部分WriteUp

    做了10个,都是烂大街的题目,分数很低。CTF榜单186,以为稳进分区赛了。理论题算上变一千五百多名,华东南二百多名,进不去了,WriteUp也不想上传了。 不是密码选手,但密码非预期搞出来几个 签到电台 关注公众号给的提示“弼时安全到达了”,查找这几个字的中文电码

    2024年02月06日
    浏览(26)
  • 第十五届全国大学生信息安全竞赛创新实践能力赛

    ​ 这两个应该是属于非预期,查找文件内容,两个flag都出了: find / |xargs grep -ri flag{ 2/dev/null flag{34f5fdaf-c373-47fd-afab-01ed2914c11a} 解题步骤同上 使用hydra爆破获得root密码toor。 登陆查找(find / |xargs grep -ri flag{ 2/dev/null)获得flag flag{7b352ef0-1bb1-41af-a7d7-b74f62ff23f0} 爆破sha256老脚本套

    2024年02月07日
    浏览(21)
  • 第十五届全国大学生信息安全竞赛知识问答(CISCN)

    一、单项选择题 1、国家秘密的保密期限,除另有规定外,绝密级不超过()年 A、10年 B、50年 C、30年 D、20年 2、安卓逆向中,反编译JAVA通常使用以下哪个软件?( ) A、JPEXS B、dnSpy C、JEB D、IDA 3、我国在信息系统安全保护方面制定的最早一部,也是最基本的一部法规是()

    2024年02月04日
    浏览(30)
  • 2022第十五届全国大学生信息安全竞赛(ciscn)西南赛区部分WP

    EzSignin 访问题目flag是假的,F12源代码,看到base64解码 解码得到flag CODE 访问题目,有个aid.php直接访问不行,使用PHP为协议进行读取,input2需要等于Welcone!,这里要使用data协议编码一下,input3可以随便输入 得到aid.php的代码 很明显的反序列化,直接构造payload: exp: base64解码得

    2024年02月06日
    浏览(22)
  • 第十四届全国大学生电工数学建模竞赛A题-高比例风电电力系统储能运行及配置分析

     写在前面 博主:多次获得华为杯,电工杯,小美赛等数学建模一等奖、二等奖,拥有较为丰富的比赛经验,会分享一些建模的思路、算法以及比赛经验。 博主主页: Born for的博客_CSDN博客-预测,数学建模,深度学习领域博主 希望大家多多关注,大家共同进步! 目录 题目背景

    2024年02月05日
    浏览(21)
  • 2021全国大学生电子设计竞赛论文(智能送药小车(F题))(电赛论文模板)

    电赛是一个很奇妙的过程,可能有些人觉得电赛的门槛太高,那便意味着,当你决定要参加电赛的那一刻起,这一段路、这些日子就注定不会太轻松; 我现在回头看真的很感谢电赛,从前期备赛面对自己未曾涉猎的技术不知如何下手的迷茫与怀疑,再到后来四天三夜紧张到不

    2024年02月05日
    浏览(24)
  • 2020年高教社杯全国大学生数学建模竞赛---校园供水系统智能管理(Python代码实现)

    目录 💥1 概述 📚2 问题 🎉3 运行结果 👨‍💻4 Python代码 校园供水系统是校园公用设施的重要组成部分,学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展,校园内已经普遍使用了智能水表,从而可以获得大量的实时供水系统运

    2024年02月11日
    浏览(19)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包