寻线

  • 1.灰度图像二值化
  • 2.找边线
  • 3.获得中线

1.灰度图像二值化

如果使用的是小钻风摄像(二值化摄像头),就不用再进行软件二值化。
使用灰度摄像头,就需要这步。

以下展示常用的大津法

(1)首先获得分割的阈值

uint8 otsuThreshold(uint8 *GrayImage,uint32 ImageSize){int T;                  //T为动态阈值uint8 threshold = 0;    //最佳阈值uint32 N0 = 0,N1 = ImageSize;      //图像中像素小于阈值T的像素个数记作N0,像素大于阈值T的像素个数记作N1float w0,w1;    //w0为前景像素点占整幅图像的比例 w0 = N0/ImageSize (ImageSize为图像大小)//w1为前景像素点占整幅图像的比例 w1 = N1/ImageSize (ImageSize为图像大小)uint32 u0den = 0,u1den = 0;  //图像中像素小于阈值T的像素加权和记作u0den//图像中像素大于阈值T的像素加权和记作u1denfloat u0,u1;    //u0为前景像素点平均灰度 u0 = u0den/N0//u1为前景像素点平均灰度 u1 = u1den/N1float deltaTmp;         //类间方差 计算公式 w0*w1*(u0-u1)^2//类间方差最大的阈值T为所求最佳阈值uint32 itemp,*pPixelCount = pixelCount;float deltaMax = 0;//获取灰度图像直方图_Getting_GrayHistogram(pPixelCount,GrayImage,ImageSize);//计算动态阈值for (T = 0;T < 255;T ++){itemp = *(pPixelCount + T);u1den += T * itemp;}for (T = 0; T < 255; T++){itemp = *(pPixelCount + T);N0 += itemp;N1 -= itemp;if (N0 == 0 || N1 == 0)continue ;itemp = itemp * T;u0den += itemp;u1den -= itemp;w0 = (float)N0 / (float)ImageSize;w1 = (float)N1 / (float)ImageSize;u0 = (float)u0den / (float)N0;u1 = (float)u1den / (float)N1;deltaTmp = w0*w1*(u0-u1)*(u0-u1);if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = T;}}if(deltaMax < 80){if(threshold >= 50)threshold = 10;else if(threshold < 50)threshold = 100;}return threshold;}

(2)再进行二值化(white=255 black =0)

 //***********************************************////函数名称: image_Gray2Binary                    ////函数版本: V1.0                                 ////函数说明: 灰度图片转化为二值化图片             ////函数输入: BinImage  : 二值化图像指针           ////          GrayImage : 灰度图像指针             ////          ImageSize : 输入图像尺寸(长度*宽度)  ////          threshold : 图像转化阈值             ////函数输出: BinImage  : 二值化图像指针           ////***********************************************//void image_Gray2Binary(uint8 *Binimg,uint8 *GrayImage,uint32 ImageSize,uint8 threshold){uint32 z;uint32 temp,temp_1 = white,temp_2 = black;for (z = 0;z < ImageSize;z++){temp=*(GrayImage + z);if (temp >= threshold)*(Binimg + z) = temp_1;else*(Binimg + z) = temp_2;}}

使用:

//mt9v03x_image是灰度图像数组
pixel=otsuThreshold(&mt9v03x_image[0][0],MT9V03X_W*MT9V03X_H);
//img是二值化后得到的图像
image_Gray2Binary(&img[0][0],&mt9v03x_image[0][0],MT9V03X_W*MT9V03X_H,pixel);//img二值化图像

当然还有很多算法,例如基于sobel算子,动态阈值法等等。有需要可以评论邮箱,我发你。但是我觉得只要能把图像大体的边界信息保留下来,就可以了。并且有部分算法运算量很大,智能车比赛有些指定的单片机运用这些算法会把图像卡成PPT。

2.找边线

找边线可以就用最简单的逻辑,从中间向两边搜黑点。从距离车头较近的行开始从中间向两边搜线。

以下代码思路稍微有点变化:
左边线默认:1 右边线默认:(图像宽度-1)
从车头最近的一行开始,把这行图像单独拿出来,作为一个参考。之后的行,搜左边线时,从前一个搜的左边线的横坐标加一个值向左搜;搜右边线时,从前一个搜的右边线的横坐标减一个值向右搜。这个过程完成,就得到了一幅图像的边界数组。

/*-----------------------------------------------------------------!* @brief    获取边线** @param    imageInput : 二值图像信息* @param    imageOut   : 边线数组** @return   是否丢线** @note     思路:从距离车头较近的行开始从中间向两边搜线---------------------------------------------------------------------- */
uint8_t ImageGetSide(uint8_t imageInput[OV7725_UART_H][OV7725_UART_W], uint8_t imageOut[OV7725_UART_H][2])
{uint8_t i = 0, j = 0,k=0;for(i = OV7725_UART_H-1; i > 0; i--){imageOut[i][left] = 1;imageOut[i][right] = OV7725_UART_W-1;}// 用距离小车比较近的行 判断是否丢线for(i = OV7725_UART_W/2; i > 1; i--){if(!imageInput[OV7725_UART_H-1][i]){imageOut[OV7725_UART_H-1][left] = i;break;}}for(i = OV7725_UART_W/2+1; i < OV7725_UART_W-1; i++){if(!imageInput[OV7725_UART_H-1][i]){imageOut[OV7725_UART_H-1][right] = i;break;}}
//-------------------------------------------------------------// 遍历每行for(i = OV7725_UART_H-2; i > 0; i--){// 向左搜线for(j = imageOut[i+1][left] + 10; j > 0; j--){if(!imageInput[i][j]){imageOut[i][left] = j;break;}}if(imageOut[i][left]  >  OV7725_UART_W/2){imageOut[i][left]=OV7725_UART_W/2;for(k=i;k>0;k--){imageOut[k][left]=OV7725_UART_W/2;}break;}}//遍历每一行for(i = OV7725_UART_H-2; i > 0; i--){//向右搜线for(j = imageOut[i+1][right] - 10; j < OV7725_UART_W-1; j++){if(!imageInput[i][j]){imageOut[i][right] = j;break;}}if(imageOut[i][right]  <  OV7725_UART_W/2){imageOut[i][right]=OV7725_UART_W/2;for(k=i;k>0;k--){imageOut[k][right]=OV7725_UART_W/2;}break;}}

3.获得中线

一般情况:
中线 =(左边线+右边线)/2
特殊情况:
中线 = 左边线+N 或者
中线 = 右边线-N
这个特殊处理根据实际情况自己处理就行了。比如说,在左转弯的时候弧度太大,导致左边线全部丢线,这个时候就可以令中线 = 右边线 - N。当然还是要根据自己摄像头采集到的图像特征来灵活运用

智能车摄像头算法——寻线相关推荐

  1. 智能车摄像头算法——拐点

    拐点分为下拐点和上拐点. 1.上拐点 我们可以看到上拐点类似于一个L形状. 这是我们人肉眼俯视图所看到的. 这是我们摄像头看到的十字形状. 而我们放大上拐点的形状 没错是这样一个形状,有人问你怎么知道 ...

  2. 智能车摄像头算法——车库(识别斑马线)

    车库分为出库和第一圈处理斑马线还有第二圈入库 出库 第一种方法比较简单,适合小白.出库,一个比较明显的特征就是比赛的开始,你可以用按键来开始打脚,配合陀螺仪积分到一定值时(也就是出库到直道上)正常巡线 ...

  3. 智能车摄像头动态打角算法

    智能车摄像头动态打角算法 核心代码 void xiaocao_function() {byte i, j;for (i = 0; i < final_line; i++){for (j = 0; ...

  4. 智能车阳光算法(含大津法)

    ** ## 智能车阳光算法 ** 谈不上真正的阳光算法,但是对于一些光干扰的场景和一些有噪点的图像还是可以进行处理. 在之前主流的摄像头主要是ov7725这个摄像头的优点就是硬件二值化,它的处理速度比 ...

  5. 第十六届全国大学生智能车竞赛全国总决赛线上比赛规范

    简 介: 本文给出了第十六届全国大学生智能车竞赛全国总决赛线上比赛要求. 关键词: 智能车竞赛,全国总决赛,线上比赛 §01 线上比赛 一.背景介绍   全国大学生智能车第十六届竞赛在2021年暑期展 ...

  6. 第十六届全国大学生智能车竞赛广东赛区线上竞赛方案

    简 介: 针对2021年广东省新冠疫情防控要求,针对广东省参加2021年智能车竞赛的高校采用线上比赛的方式.本文给出了线上比赛的实施方案. 关键词: 智能车竞赛,2021年竞赛,广东省线上比赛 §01 ...

  7. 2020年全国大学生智能车竞赛华南赛区线上比赛高校组合

    作者:卓晴博士,清华大学自动化系 更新时间:2020-07-31 Friday □ 高校组合1 序号 高校名称 1 海南大学 2 海南师范大学 队伍数量:10 证书下载: 链接: https://pa ...

  8. 飞思卡尔智能车摄像头上位机…

    原文地址:飞思卡尔智能车摄像头上位机采集程序 作者:玲声依旧美 基于飞思卡尔XS128单片机 摄像头采集测试程序     OV7620采集程序说明:摄像头数据口接PA0-PA7:行中断接PT0,场中断 ...

  9. 智能车摄像头组 障碍处理方法

    智能车摄像头组中最重要的就是图像处理了,这里面的图像处理包括很多方面,比如十字如何处理,弯道如何处理,起跑线,障碍等等问题,接下来我要讲的就是障碍处理方法. 首先我们先描述一下障碍的形状,在智能车竞赛 ...

最新文章

  1. v-vim 代码批量缩进,字符串精确查找及替换
  2. 用SecureCRT在linux系统下载文件
  3. 基于弹性束图匹配的人脸识别
  4. 从浏览器地址栏输入url到显示页面的步骤
  5. ip_conntrack: table full, dropping packet的问题
  6. 数据库连接php_php 连接 数据库
  7. 【写作技巧】毕业论文写作要素和步骤有哪些呢?
  8. linux7删除网卡文件,CentOS 7下删除virbr0网卡信息
  9. C#学习之泛型功能与限制
  10. 接口压测之Locust
  11. 信用卡前6位bin号代表什么
  12. 惠斯通电桥电路 轴扭矩 计算
  13. 《密码编码学与网络安全》和《现代密码学》PDF
  14. 数据库——数据库结构设计
  15. 分享广东联通光猫超级密码
  16. Algorithm Gossp (18) 最大公因数、最小公倍数、因式分解
  17. sim卡没坏但苹果手机无服务_工信部为啥要喊你设置SIM卡密码?如何设置(安卓苹果都有了)|工信部|手机|安卓|安卓手机|iphone...
  18. 教你创建Oracle复合索引(精)
  19. 转 javascip学习笔记
  20. 身份证OCR识别是什么?

热门文章

  1. 关于25Qxx踩坑总结(无法写入)
  2. 8421码、5421码、2421码、余三码
  3. 十进制转余三码或余三码转十进制
  4. 基于微信视频分享平台小程序设计与实现 开题报告
  5. 苹果怎么设置下载软件不要密码?手机技巧分享
  6. 基于zookeeper的瞬时节点实现分布式锁
  7. d3.js 实现企业图谱(基于vue)
  8. 2022年经历太多,大家都太艰难了,听一首悲伤的歌曲,代表现在的心情,送别老朋友
  9. 唤醒计算机教案,智慧课堂教学软件常态化丨镇江中山路实验小学用 智慧“唤醒”课堂...
  10. 虚拟串口VSPD_V10.0.944官方最新版