智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4157|回复: 19
打印 上一主题 下一主题

【阐释者】单双处理 引导线黑白背景兼容 实车验证

  [复制链接]

14

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1056
威望
497
贡献
285
兑换币
278
注册时间
2014-7-23
在线时间
137 小时
毕业学校
辽宁科技大学
跳转到指定楼层
1#
发表于 2015-4-2 10:04:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CCD数据通过线数分析赛道类型,这是我自创的方案,具体方法见我之前的帖子(那个版本还不完善,有很多问题,但是思路一样),望多多交流,多多指导。
回复

使用道具 举报

28

主题

2228

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
15822

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章资源大师奖章

QQ
威望
7433
贡献
4215
兑换币
5195
注册时间
2013-12-9
在线时间
2087 小时
推荐
发表于 2015-4-2 10:33:06 | 只看该作者
坐等上图
回复 支持 1 反对 0

使用道具 举报

14

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1056
威望
497
贡献
285
兑换币
278
注册时间
2014-7-23
在线时间
137 小时
毕业学校
辽宁科技大学
2#
 楼主| 发表于 2015-4-2 10:14:57 | 只看该作者
手机发不了图片,中午补上。
回复 支持 反对

使用道具 举报

32

主题

3009

帖子

0

精华

杰出人士

学期班的来卖萌?

Rank: 12Rank: 12Rank: 12

积分
14832

在线王奖章活跃会员奖章优秀会员奖章论坛元老奖章资源大师奖章

威望
5952
贡献
3172
兑换币
4257
注册时间
2013-11-26
在线时间
2854 小时
3#
发表于 2015-4-2 10:26:39 | 只看该作者
不明觉厉的样子
回复 支持 反对

使用道具 举报

16

主题

746

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4951
威望
2517
贡献
1610
兑换币
1718
注册时间
2013-12-12
在线时间
412 小时
4#
发表于 2015-4-2 10:28:30 | 只看该作者
:D:D:D:D:D
回复 支持 反对

使用道具 举报

25

主题

1451

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7523

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章

威望
4527
贡献
1518
兑换币
2167
注册时间
2013-11-22
在线时间
739 小时
5#
发表于 2015-4-2 10:30:17 | 只看该作者
open and share:lol:lol浪险到不行
回复 支持 反对

使用道具 举报

14

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1056
威望
497
贡献
285
兑换币
278
注册时间
2014-7-23
在线时间
137 小时
毕业学校
辽宁科技大学
7#
 楼主| 发表于 2015-4-2 12:45:08 | 只看该作者
/***************************************************************
名称:CCD相关函数
输入:
输出:
描述:
    :
****************************************************************/
#include "common.h"
#include "include.h"

/***************************************************************
名称:基本定义
输入:
输出:
描述:
    :
****************************************************************/
#define SOBEL_MIN 10                              //最小跳变沿距离
#define SOBEL_BIN_MIN 100                         //CCD最小处理跳变沿阈值
#define CCD_recovery 0.8                          //角度校正 CCD 数据
#define CCD_BIN_RATE 0.6                          //CCD导数二值化阈值数据
#define LINE_width_MIN       40                   //允许的最小路宽
#define CCD_CENTER_WIDTH_MAX 5
#define WAY_anxious          0                   //切线比例 越大跑法内切越大


uint8 CCD_BUFF[TSL1401_SIZE];                     //0 原图   1      2 二值化图
int16 tempArray[TSL1401_SIZE];                    //SOBEL  导数图
uint8 tempArray_bin[TSL1401_SIZE];                //SOBEL  导数二值图
uint8 tempArray_creat[TSL1401_SIZE];              //边线图

int16 WAY_value =   0;                            //方向偏移   - 左偏   + 右偏
uint8 right_angle_state = 0;
char CCD_exposure_time = 2;                      //曝光时间
int16 WAY_value_sorce = 0;                        //CCD???????
uint8 LINE_width = 0;

int16 thresholding_max = 0;                           //导数阈值 (程序计算)
int16 thresholding_min = 0;                           //导数阈值 (程序计算)

int16 LINE_L[10];
int16 LINE_R[10];
  
char LINE_L_number = 0;                             //线数
char LINE_R_number = 0;                             //线数

char temp;
char CROSS_static = 0;                            //  1直线 2弯道 3人字路口 4障碍 6右直角 7左直角 8十字路口


/***************************************************************
名称:函数声明
输入:
输出:
描述:
    :
****************************************************************/
void CCD_sobel(void);            //求导声明
void CCD_line_count(void);       //线数计算
void CCD_measure(void);

/***************************************************************
名称:CCD初始化
输入:
输出:
描述:
    :
****************************************************************/
void CCD_init(void)
{
    tsl1401_set_addrs(TSL1401_MAX,(uint8 *)&CCD_BUFF[0]);
    tsl1401_init();                               //初始化 线性CCD ,配置 中断时间为 time  
}

/***************************************************************
名称:CCD采集与处理
输入:
输出:
描述:
    :
****************************************************************/
void CCD_hand(void)
{
    tsl1401_get_img();                             //采集 线性CCD 图像
    CCD_sobel();  //导数计算
    CCD_line_count();//线数计算
    CCD_measure();
}

/***************************************************************
名称:导数计算
输入:
输出:
描述:
    :
****************************************************************/
void CCD_sobel()
{
  
  int16 gradX;
  
  int16 thresholding_deal_max = 0;
  int16 thresholding_deal_min = 0;
  
  //CCD_BUFF[0] = CCD_BUFF[1];
  //CCD_BUFF[127] = CCD_BUFF[126];

  for (int j = 2; j <= 125; j++)
  {
   
      gradX = CCD_BUFF[j + 1] + CCD_BUFF[j + 2] - CCD_BUFF[j - 1] - CCD_BUFF[j - 2];
      
      tempArray[j] = gradX;                 //CCD 导数图 tempArray
      
      if(tempArray[j] > thresholding_deal_max)      
      {
        thresholding_deal_max = tempArray[j];
      }
      
      if(tempArray[j] < thresholding_deal_min)      
      {
        thresholding_deal_min = tempArray[j];
      }
  }
  


  thresholding_max = thresholding_deal_max;                 //保存导数最大值
  thresholding_min = thresholding_deal_min;                 //保存导数最大值

  
  if(thresholding_max < SOBEL_BIN_MIN)
  {
    thresholding_max = SOBEL_BIN_MIN;
  }

  if(thresholding_min > -SOBEL_BIN_MIN)
  {
    thresholding_min = -SOBEL_BIN_MIN;
  }
  
  for (int i = 0; i < 128; i++)
  {
      tempArray_bin[i] = 120;
      
      if (tempArray[i] > (int16)(thresholding_max*CCD_BIN_RATE) )
      {
          tempArray_bin[i] = 250;                             //bin 存储导数阈值
      }
      
      if (tempArray[i] < (int16)(thresholding_min*CCD_BIN_RATE) )
      {
          tempArray_bin[i] = 0;                             //bin 存储导数阈值
      }

  }
  

}


/***************************************************************
名称:
输入:
输出:
描述:
    :
****************************************************************/
void CCD_line_count()
{

  
  
  char line_L_num = 1;  
  char line_R_num = 1;  
  
  temp = (char)(ABS(ANGLE_final) * CCD_recovery);    //计算还原数据
  
  int16 LINE_all_L[10];
  int16 LINE_all_R[10];

  LINE_all_L[0] = -SOBEL_MIN;
  LINE_all_R[0] = 127 + SOBEL_MIN;
  
/*********************************************
  *名称:查线
  ********************************************/
  for(int i = 0; i < 128; i++)
  {
    if(tempArray_bin[i] == 250)
    {   
      
      if(i - LINE_all_L[line_L_num - 1] >= SOBEL_MIN)
      {
        LINE_all_L[line_L_num] = i;
        line_L_num++;
      }
      else
      {
        LINE_all_L[line_L_num - 1] = (int16) (    ( i + LINE_all_L[line_L_num - 1])   /2 );
      }
    }
  }
  
  for(int i = 127; i >= 0; i--)
  {
    if(tempArray_bin[i] == 0)
    {   
      
      if(i - LINE_all_R[line_R_num - 1] <= -SOBEL_MIN)
      {
        LINE_all_R[line_R_num] = i;
        line_R_num++;
      }
      else
      {
        LINE_all_R[line_R_num - 1] = (int16) (    ( i + LINE_all_R[line_R_num - 1])   /2 );
      }
    }
  }   
  
  LINE_L_number = line_L_num - 1;                          //LINE_number为图中的线数
  LINE_R_number = line_R_num - 1;                          //LINE_number为图中的线数
  
  
  for(int i = 0; i < LINE_L_number; i++)
  {
        LINE_L[i] = (int16)(  (LINE_all_L[i + 1] - 64) -  temp*(LINE_all_L[i + 1] - 64)/64);
  }


  for(int i = 0; i < LINE_R_number; i++)
  {
        LINE_R[i] = (int16)(  (LINE_all_R[i + 1] - 64) -  temp*(LINE_all_R[i + 1] - 64)/64);
  }

     
  
  
  
  for(int i = 0; i < 128; i++)
  {
    tempArray_creat[i] = 120;
  }
  
  for(int i = 0; i < LINE_L_number; i++)
  {
    tempArray_creat[LINE_L[i] + 64] = 250;                           //CRE 为生成线后的图  没有使用 仅是看
  }

   for(int i = 0; i < LINE_R_number; i++)
  {
    tempArray_creat[LINE_R[i] + 64] = 0;                           //CRE 为生成线后的图  没有使用 仅是看
  }
  
  

  
}

/***************************************************************
名称:
输入:
输出:
描述:
    :
****************************************************************/
void CCD_measure(void)
{
  switch(LINE_L_number)
  {
    case 0:
      {
        switch(LINE_R_number)
        {
          case 0:
            {
              WAY_value = 0;
            }break;
            
          case 1:
            {
              
      //      if(right_angle_state == 1)
      //      {
      //        
      //        right_angle_state = 0;
      //        WAY_value = 90;
      //      }
      //      else
      //      {
                 WAY_value = LINE_R[0] - LINE_width/2;
//            }
                 
            }break;
            
          case 2:
            {
              ;
            }break;
            
          default:
            {
              ;
            }break;
        }
      }break;
      
      
      
      
    case 1:
      {
        switch(LINE_R_number)
        {
          case 0:
            {
      //      if(right_angle_state == 1)
      //      {
      //        
      //        right_angle_state = 0;
      //        WAY_value = 90;
      //      }
      //      else
      //      {
                 WAY_value = LINE_L[0] + LINE_width/2;
//            }
            }break;
            
          case 1:
            {
              if(LINE_L[0] < LINE_R[0])
              {
                 WAY_value = (LINE_L[0] + LINE_R[0])/2;
                 
                 if((LINE_R[0] - LINE_L[0]) > LINE_width_MIN)
                 {
                    LINE_width = LINE_R[0] - LINE_L[0];
                 }
              }
              else
              {
                if(LINE_L[0] - LINE_R[0] <= CCD_CENTER_WIDTH_MAX)
                {
                  WAY_value = (LINE_L[0] + LINE_R[0])/2; //重复流程
                }
              }
            }break;
            
          case 2:
            {
              ;
            }break;
            
          default:
            {
              ;
            }break;
        }
      }break;
      
      
      
      
      
    case 2:
      {
        switch(LINE_R_number)
        {
          case 0:
            {
              ;
            }break;
            
          case 1:
            {
              ;
            }break;
            
          case 2:
            {
              //CROSS_static = 4;
              //led(BEEP,LED_OFF);                        //蜂鸣器响
              //DELAY_MS(500);
              //led(BEEP,LED_ON);                        //蜂鸣器响

            }break;
            
          default:
            {
              ;
            }break;
        }
      }break;
      
      
      
      
  default:
    {
      ;
    }break;
  }

  
  
  /*********************************************
  *名称:切内道补偿数值
  ********************************************/  
   WAY_value_sorce = WAY_value;
   WAY_value = (int)(WAY_value + (float)(WAY_value)/64*WAY_anxious);

   
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

24

主题

1090

帖子

0

精华

常驻嘉宾

不会做车,只会瞎BB的毕业考研狗

Rank: 8Rank: 8

积分
5429

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

QQ
威望
3088
贡献
663
兑换币
2343
注册时间
2012-11-4
在线时间
839 小时
毕业学校
河北联合大学
8#
发表于 2015-4-2 14:28:59 | 只看该作者
不明觉厉的样子。。
回复 支持 反对

使用道具 举报

2

主题

561

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3833

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章

威望
2078
贡献
1105
兑换币
1150
注册时间
2014-6-8
在线时间
325 小时
9#
发表于 2015-4-2 14:53:37 | 只看该作者
6666666666
回复 支持 反对

使用道具 举报

24

主题

79

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4865
威望
1939
贡献
1108
兑换币
1259
注册时间
2014-9-9
在线时间
909 小时
10#
发表于 2015-4-2 15:07:40 | 只看该作者
顶啊顶
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-25 01:53 , Processed in 0.059447 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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