注册 登录
查看: 1631|回复: 30

[摄像头组] 关于赛道识别中提取中心线的一些想法【附上我的代码】,欢迎各位高手批评指点!!

[复制链接]
发表于 2014-5-6 19:52:52 | 显示全部楼层 |阅读模式
关于赛道识别或者说方向控制,我是这样理解的:
首先,提取两边黑线,然后计算拟合中线,再用来和参考中线进行比较,最后将得出的偏差进行PD运算求出方向控制输出。

那么,接下来就是如何提取拟合中心线的问题了,我是这样做的:
1.只扫描数组中间的十行数据
2.将每一行计算出的中线进行相加,最后除以10进行平均求得平均中线
3.用平均中线和参考中线进行运算
4.如果两边都找不到黑线,则使用上一次的值

不知我想的对不对,欢迎各位高手指点批评!!!能够得到大家的指点是我的荣幸,在此表示感谢!!!

代码如下:
  1. //****************************************************************************
  2. //            提取中心线
  3. //****************************************************************************
  4. void Extract_Centerline()    //提取中心线
  5. {

  6.     uint8 i,j,k=0;
  7.     for(i=35;i>25;i--)       //只扫描近处10行的图像数据
  8.     {
  9.         for(j=40;j>0;j--)  //从中间向左边扫描,寻找黑点
  10.         {
  11.           if((img[i][j]+img[i][j-1]+img[i][j-2])>2)
  12.           {
  13.              Left_Black=j;    //找到左边黑点
  14.              Left_Black_Old=Left_Black;
  15.              break;
  16.           }
  17.           else
  18.           {
  19.             Left_Black=0;    //未找到左边黑点
  20.           }
  21.         }
  22.         for(j=41;j<=80;j++)  //从中间向右边扫描,寻找黑点
  23.         {
  24.           if((img[i][j]+img[i][j+1]+img[i][j+2])>2)
  25.           {
  26.              Right_Black=j;    //找到右边黑点
  27.              Right_Black_Old=Right_Black;
  28.              break;
  29.           }
  30.           else
  31.           {
  32.             Right_Black=0;    //未找到右边黑点
  33.           }
  34.         }
  35.         if(Left_Black==0 && Right_Black==0)      //如果两边均未找到黑线
  36.         {
  37.           Left_Black=Left_Black_Old;          //则使用上一场扫描到的黑线
  38.           Right_Black=Right_Black_Old;
  39.         }
  40.         k=60-i;
  41.         Fit_middleline[k]=(Left_Black + Right_Black)/2;
  42.         //用于存放每行计算出来的中点,这里我们只存10行
  43.         //后面用这10行中点进行平均,当作拟合的中点,用于方向判断
  44.         f_Fit_Centre_Line += Fit_middleline[k];
  45.     }
  46.     f_Fit_Centre_Line /= 10;              //将计算得到的10行中点进行平均,当作拟合的中点,用于方向判断
  47.     Fit_Centre_Line = f_Fit_Centre_Line;
  48. }
回复

使用道具 举报

 楼主| 发表于 2014-6-4 21:54:54 | 显示全部楼层
feeling_kill 发表于 2014-6-4 21:53
你不是横着搜索吗,更横相反就是纵向

纵向搜索怎么实现的,虽然不知道具体怎么做的,但感觉很厉害
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2014-5-6 20:11:12 | 显示全部楼层
额,忘了说了,提取中心线我是放在主函数的while循环中进行的
回复 支持 反对

使用道具 举报

发表于 2014-5-6 20:54:51 | 显示全部楼层
敢问楼主,现在能跑吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 20:56:04 | 显示全部楼层
925901184 发表于 2014-5-6 20:54
敢问楼主,现在能跑吗

当然可以跑啦,要不然怎么做赛道识别。只是不知这样做对不对
回复 支持 反对

使用道具 举报

发表于 2014-5-6 20:57:29 | 显示全部楼层
想法不错,可以改进,继续加油
回复 支持 反对

使用道具 举报

发表于 2014-5-6 22:13:54 | 显示全部楼层
你是扫描近处10行,每次都从中间扫描,这样效率会低一些,其实一开始第一行从中间往两边找,然后后续的行就直接从原先的黑点找就好了。

你可以看看很多队伍show的图片,都是先找左边,然后再找右边,然后直接根据左右求得中间。
而找左右两边的时候,都不是从中间找起的,不然效率太低。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 22:19:38 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-6 22:13
你是扫描近处10行,每次都从中间扫描,这样效率会低一些,其实一开始第一行从中间往两边找,然后后续的行就 ...

嗯,受教了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-7 11:33:04 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-6 22:13
你是扫描近处10行,每次都从中间扫描,这样效率会低一些,其实一开始第一行从中间往两边找,然后后续的行就 ...

嗯,我之前的理解是错误的。我以为从中间扫描的话会更快些,因为从左边开始的话还要扫描一些多余的数据。不过现在我还是不明白为什么从中间扫描会比较慢,我对单片机的工作原理不太理解
回复 支持 反对

使用道具 举报

发表于 2014-5-7 11:37:14 | 显示全部楼层
草原上的星星 发表于 2014-5-7 11:33
嗯,我之前的理解是错误的。我以为从中间扫描的话会更快些,因为从左边开始的话还要扫描一些多余的数据。 ...

是第一行中间扫描,然后左右两边找到黑点后,因为边界是黑线,那么直接从黑点边界处找边界就更快了,而无需又从中间找起。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-7 11:40:07 | 显示全部楼层
栾端静 发表于 2014-5-7 11:37
是第一行中间扫描,然后左右两边找到黑点后,因为边界是黑线,那么直接从黑点边界处找边界就更快了,而无 ...

嗯,明白了,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-7 12:29:23 | 显示全部楼层
栾端静 发表于 2014-5-7 11:37
是第一行中间扫描,然后左右两边找到黑点后,因为边界是黑线,那么直接从黑点边界处找边界就更快了,而无 ...

也就是说当从第一行得到左右两边的黑线后,那么后面的9行(假设只扫描10行)都在找到的左右黑线位置的附近找,而没有必要又从中间开始扫描。
那么,我有两个想法:
1.直接专门选取一行来找左右黑线,然后再根据这一行得出的数据分别写两个for循环进行左右黑线的查找(在黑线的附近查找)。
2.不用专门设一行来从中间开始扫描提取左右的黑线,直接在大循环for(i=35;i>25;i--)下进行,那这就要费一番心思了。
回复 支持 反对

使用道具 举报

发表于 2014-5-7 14:57:11 | 显示全部楼层
是的, 边缘跟踪算法! 再把十字处理好就 没多大问题了!
回复 支持 反对

使用道具 举报

发表于 2014-5-9 23:08:11 | 显示全部楼层
虽然我是做电磁的  还是学习一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-9 23:11:04 | 显示全部楼层
头上两只角 发表于 2014-5-9 23:08
虽然我是做电磁的  还是学习一下。

相互学习,共同进步!不过这个算法是有问题的,我改进了好多,现在好多了
回复 支持 反对

使用道具 举报

发表于 2014-5-10 19:42:48 | 显示全部楼层
请问你是要采集十次数据然后求平均值,在控制一次舵机吗?
回复 支持 反对

使用道具 举报

发表于 2014-5-10 19:47:30 | 显示全部楼层
看错了,你是摄像头啊。。
回复 支持 反对

使用道具 举报

发表于 2014-6-4 17:33:03 | 显示全部楼层
我只纵向找,不从横向找
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-4 18:21:25 | 显示全部楼层
feeling_kill 发表于 2014-6-4 17:33
我只纵向找,不从横向找

纵向找是什么意思?
回复 支持 反对

使用道具 举报

发表于 2014-6-4 21:53:00 | 显示全部楼层
草原上的星星 发表于 2014-6-4 18:21
纵向找是什么意思?

你不是横着搜索吗,更横相反就是纵向
回复 支持 反对

使用道具 举报

发表于 2014-6-4 22:36:29 | 显示全部楼层
草原上的星星 发表于 2014-6-4 21:54
纵向搜索怎么实现的,虽然不知道具体怎么做的,但感觉很厉害

纵向搜索,就是不考虑边界和中心线,只考虑拐点。
直接中间从近往远搜索,然后找到最顶部的边界,如果边界很远,说明直走,如果边界很近,就判断弯道的方向
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-4 22:38:31 | 显示全部楼层
韦嘉淑 发表于 2014-6-4 22:36
纵向搜索,就是不考虑边界和中心线,只考虑拐点。
直接中间从近往远搜索,然后找到最顶部的边界,如果边 ...

哦,原来还可以这样
回复 支持 反对

使用道具 举报

发表于 2014-7-6 10:28:39 | 显示全部楼层
草原上的星星 发表于 2014-6-4 22:38
哦,原来还可以这样

你们是找出来的中线差值直接乘以P参数控制,还是用了复杂的PID控制?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-6 10:31:37 | 显示全部楼层
111xian 发表于 2014-7-6 10:28
你们是找出来的中线差值直接乘以P参数控制,还是用了复杂的PID控制?

跟官方的一样,官方的那个程序只用了P参数
回复 支持 反对

使用道具 举报

发表于 2014-7-6 10:40:28 | 显示全部楼层
草原上的星星 发表于 2014-7-6 10:31
跟官方的一样,官方的那个程序只用了P参数

左右跟踪中线,您们是一边左右各扫多少?
感觉5的就够了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-6 10:41:41 | 显示全部楼层
111xian 发表于 2014-7-6 10:40
左右跟踪中线,您们是一边左右各扫多少?
感觉5的就够了吧

差不多吧,扫太多了也没用,具体还要通过实践来验证
回复 支持 反对

使用道具 举报

发表于 2014-7-6 10:42:41 | 显示全部楼层
草原上的星星 发表于 2014-7-6 10:41
差不多吧,扫太多了也没用,具体还要通过实践来验证

我试试,,
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-7-19 15:48:45 | 显示全部楼层
你们 速度负反馈用的什么函数??可否参考下,
我们的函数有点BUG,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-20 19:29:13 | 显示全部楼层
111xian 发表于 2014-7-19 15:48
你们 速度负反馈用的什么函数??可否参考下,
我们的函数有点BUG,,,

不明白什么意思。我们速度控制用的是官方的程序
回复 支持 反对

使用道具 举报

发表于 2015-1-8 09:41:59 | 显示全部楼层
学长,看了你的帖子。你们提到两次的官方程序是什么呢?
回复 支持 反对

使用道具 举报

发表于 2015-1-8 09:58:40 | 显示全部楼层
草原上的星星 发表于 2014-5-6 22:19
嗯,受教了

什么叫根据原先的黑点找下一个黑点
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部