找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2401|回复: 4
打印 上一主题 下一主题
收起左侧

飞思卡尔智能车图像处理c文件

[复制链接]
跳转到指定楼层
楼主
ID:298053 发表于 2018-8-11 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include "processing.h"

extern uint8 img[CAMERA_H][CAMERA_W];//图像数组
extern uint8 add_mid;//显示中线标志位
extern struct PID sPID;//舵机PID结构体

extern int center_10;
extern uint8  var1, var2;//按键调试变量
extern uint16 var3, var4;//按键调试变量
extern uint32 var5, var6;//按键调试变量
extern uint8 ring_start;
extern uint8 ring_off;
extern uint32 ring_add;
extern uint32 xh;
extern int gg;



int flag = 0;

extern int kaiguan1;
extern int kaiguan2;
extern int kaiguan3;
extern int kaiguan4;
extern int kaiguan5;


uint32 clear_add=0;
uint8 clear=0;


uint8 zhi = 0;//舵机保持
uint8 zhi_start = 0;


struct LOAD
{
   int16 left[CAMERA_H];        //左边沿
   int16 center[CAMERA_H];      //中心
   int16 right[CAMERA_H];       //右边沿
   
   
   float width[CAMERA_H];       //宽度
   
   uint8 left_lost[CAMERA_H];   //左丢线标志,LOSTLINE:丢线,GETLINE:捕捉到
   uint8 right_lost[CAMERA_H];  //右丢线标志,LOSTLINE:丢线,GETLINE:捕捉到

   uint8 leftflag;              //找右线发现左线
   uint8 rightflag;             //找左线发现右线
   
   uint8 left_valid;            //左有效行
   uint8 right_valid;           //右有效行
   uint8 left_invalid;          //左无效行
   uint8 right_invalid;         //右无效行
}load;

static uint8 H_MIN = 0;//图像边界变量
static uint8 H_MAX = 59;
static uint8 W_MIN = 0;
static uint8 W_MAX = 79;

uint16 load_center;
extern uint8 ring_delay;


uint8 left_btm, right_btm ;//下左右边界点



//static uint8 centerline = CAMERA_W/2;
//static uint8 last_btm_mid = CAMERA_H/2;//上次图像底部中点
static int16 steer_control;//舵机控制静态变量,当未更新它时,它的值保持与上一次相同
static uint8 load_mid;//赛道中心

uint8 left_stop = 0, right_stop = 0, stop = 0;//停止线检测变量
uint8 CROSS = 0, OBSTACLE = 0, CURVE = 0;//赛道元素检测变量


uint8 H_CNT;
uint8 W_CNT;
uint8 H_CNT_MIN;
uint8 H_CNT_MAX;
uint8 MINCOUNT;
uint8 left_lost_flag;
uint8 right_lost_flag;
uint8 left_curve;
uint8 right_curve;
uint8 stop_flag = 0;
uint8 ring_flag = 0;
uint8 stop_right_add;//add-->累加型变量
uint8 stop_left_add;
uint8 hc_add;
uint8 hc_get_add;
extern int hc_flag;
int black_count=0;//白点数
extern int time_start;

uint8 sleep=0; //延时变量,此处以处理一幅图片为单位
uint8 ring_overlap = 0;//覆盖变量,此用于覆盖左圆环
uint16 ring_center_memory;//缓存变量,此处用于记录舵机打角

void delay()
{
  uint32 x;
  uint32 y;
  for(y =500; y > 1; y--)
  {
    for(x=10000 ;x > 1; x--);
  }
}



int8 img_handle(void)
{
    load.left_valid = 0;
    load.right_valid = 0;
    load.left_invalid = 0;
    load.right_invalid = 0;
    left_lost_flag = 0;
    right_lost_flag = 0;
    CROSS = 0;
    left_curve = 0;
    right_curve = 0;
    stop_right_add = 0;
    stop_left_add = 0;
    hc_add=0;

   
//    search_btmline();//找底部三行线
//    search_blckline();//找黑线
   
    search_centerline();//从中线往两边找线
   
    if(add_mid){
        display_com(H_MIN);//上位机显示
    }
   
    load_mid = calculate_mid(H_MIN);//计算中心点,采取加权方式也许会好点
   

    if(load_mid > 0 && load_mid <= 23)
    {
      sPID.Kp = 28;
      sPID.Kd = 18;
    }
    else if(load_mid > 59 && load_mid <= 79)
     {
      sPID.Kp = 28;
      sPID.Kd = 18;
    }
    else if(load_mid > 23 && load_mid <= 27){
        sPID.Kp = var1;
        sPID.Kd = var2;
    }
    else if(load_mid > 48 && load_mid <= 59){
        sPID.Kp = var1;
        sPID.Kd = var2;
    }
    else if(load_mid > 27 && load_mid <= 48){
        sPID.Kp = var3;
        sPID.Kd = var4;
    }
    else {
        sPID.Kp = var5;
        sPID.Kd = var6;
    }
   
    steer_control = Steer_PIDCalc(load_mid);//计算舵机输出
   
  
   
    return steer_control;
}

void search_centerline(void)//从中心点往两边找线
{

//————————————————————标志位初始化,找基础元素值————————  
//  load.leftflag = 0;
//  load.rightflag = 0;
//  left_btm_flag = 0;
//  right_btm_flag = 0;
//  
//  for(W_CNT = W_MIN;W_CNT < W_MAX;W_CNT++)//找右底线边线
//  {
//    if(img[H_MAX][W_CNT] == 255 && img[H_MAX][W_CNT+1] == 0)//找到右底线边线
//    {
//      right_btm_flag = 1;
//      H_CNT_MAX = H_MAX;
//      load.right[W_MAX]=W_CNT+1;
//    }
//  }
//  
//   for(W_CNT = W_MAX;W_CNT > W_MIN;W_CNT--)//找左底线边线
//  {
//    if(img[W_MAX][W_CNT] == 0 && img[W_MAX][W_CNT-1] == 255)//找到左底线边线
//    {
//      left_btm_flag = 1;
//      H_CNT_MAX = W_MAX;
//      load.left[W_MAX]=W_CNT;
//    }
//  }
//  
//  if(left_btm_flag == 0 && right_btm_flag == 0 && right_btm_flag == 0)
//  {
  
  

  
  
  
    for(H_CNT_MAX = H_MAX;H_CNT_MAX > H_MIN;H_CNT_MAX--)//找底限
    {         
        if(img[H_CNT_MAX][W_MIN] == 0)break;
        if(img[H_CNT_MAX][W_MAX] == 0) break;
    }
//  }
//  
  for(H_CNT_MIN = H_MAX;H_CNT_MIN >H_MIN;H_CNT_MIN--)//找上限
  {
      MINCOUNT = 0;
      for(W_CNT = W_MIN;W_CNT < W_MAX;W_CNT++)
      {
        if(img[H_CNT_MIN][W_CNT] == 0)  MINCOUNT++;
      }  
      if(MINCOUNT >= 70) break;
      if(H_CNT_MIN == H_CNT_MIN+1) H_CNT_MIN = 0;
  }
  
  for(H_CNT = H_MAX;H_CNT > H_CNT_MIN;H_CNT--)//图像处理
  {
   
   
/*————————————————————以下为找底线边线————————————————————————*/   
  

    if(H_CNT == H_MAX)
    {
        
      
      
      for(W_CNT = W_MIN;W_CNT < W_MAX;W_CNT++)//找左边线
        {
            if(img[H_CNT][W_CNT] == 0 && img[H_CNT][W_CNT+1] == 255)//找到左边线
            {
              load.left[H_CNT] = W_CNT;
              load.left_valid++;            
              load.left_invalid = 0;
              right_curve = 1;
              break;            
            }
            
              if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT+1] == 0)//找到右边线
            {
              left_lost_flag=1;
              left_curve = 1;
              break;            
            }
        }
      
        if(W_CNT == W_MAX || left_lost_flag == 1)//左丢线
        {
          load.left[H_CNT] = W_MIN;
          load.left_invalid++;
          load.left_valid = 0;
        }


        for(W_CNT = W_MAX;W_CNT > W_MIN;W_CNT--)//找右边线
        {
            if(img[H_CNT][W_CNT] == 0 && img[H_CNT][W_CNT-1] == 255)//找到右边线
            {
              load.right[H_CNT]=W_CNT;
              load.right_valid++;            
              load.right_invalid = 0;
              left_curve = 1;
              break;
            }
            if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT-1] == 0)//找到左边线
            {
              right_lost_flag = 1;
              right_curve = 1;
              break;
            }
        }
      
        if(W_CNT == W_MIN || right_lost_flag == 1)//右丢线
        {
          load.right[H_CNT] = W_MAX;
          load.right_invalid++;
          load.right_valid = 0;
        }
      
       if(left_lost_flag == 1 && right_lost_flag ==1)//大弯处理
       {
         for(H_CNT = 0;H_CNT < H_MAX;H_CNT++)
         {
           if(img[H_CNT][W_MIN] == 0)  
           {
             left_lost_flag = 0;
             break;
           }
           if(img[H_CNT][W_MAX] == 0)
           {
             right_lost_flag = 0;
             break;
           }
         }
         
         if(left_lost_flag == 0)
         {
           load.left[H_MAX]=0;
           for(W_CNT = W_MIN;W_CNT < W_MAX;W_CNT++)
           {
             if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT+1] == 0)//找到右边线
             {
               load.right[H_MAX]=W_CNT;
               break;
             }
           }
         }
         
         if(right_lost_flag == 0)
         {
           load.right[H_MAX]=0;
           for(W_CNT = W_MAX;W_CNT > W_MIN;W_CNT--)
           {
             if(img[H_CNT][W_CNT] == 0 && img[H_CNT][W_CNT-1] == 255)//找到左边线
             {
               load.left[H_MAX]=W_CNT;
               break;
             }
           }
         }
         
       }
        
      
      load.center[H_CNT]=(uint8)((load.left[H_CNT] + load.right[H_CNT])/2);   //底线中点
      
      
      if(left_curve)                                    //左弯道滤反光
      {
        for(H_CNT = 59;H_CNT < H_CNT_MIN;H_CNT--)
        {
          if(img[H_CNT][W_MIN] == 0)
          {
            H_CNT_MIN = H_CNT;
            break;
          }
          if(H_CNT == H_CNT_MIN)
            H_CNT_MIN = (uint8)((H_MAX+H_MIN)/2);
        }
      }
      
      if(right_curve)                                    //右弯道滤反光
      {
        for(H_CNT = 59;H_CNT < H_CNT_MIN;H_CNT--)
        {
          if(img[H_CNT][W_MAX] == 0)
          {
            H_CNT_MIN = H_CNT;
            break;
          }
          if(H_CNT == H_CNT_MIN)
            H_CNT_MIN = (uint8)((H_MAX+H_MIN)/2);
        }
      }
      
      H_CNT=H_MAX;
  }   
      
/*————————————————————————以上为找底线边线——————————————————————————*/      


/*————————————————————————以下为剩下部分处理——————————————————————————*/      

    else//此部分可继续分化处理
    {
      
/*————————————————————————以下为十字补线——————————————————————————————————*/      

      W_CNT = load.center[H_CNT+1];
      if(W_CNT != W_MIN && W_CNT != W_MAX)//防止数组越界
      {
        if(img[H_CNT][W_CNT] == 0 &&  img[H_CNT][W_CNT+1] == 0 && img[H_CNT][W_CNT-1] == 0)
        {
          for(W_CNT = 1;W_CNT < W_MAX;W_CNT++)
          {
            if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT+1] == 0)//找到右边线
            {
              load.right[H_CNT]=W_CNT;
              load.left[H_CNT]=W_MIN;
              CROSS = 1;
              break;
            }
            if(img[H_CNT][W_CNT-1] == 255 && img[H_CNT][W_CNT] == 0)//找到左边线
              {
                load.right[H_CNT]=W_MAX;
                load.left[H_CNT]=W_CNT;
                CROSS = 1;
                break;               
              }
          }
//          if(W_CNT == W_MAX)
//          {
//            for(W_CNT = W_MAX;W_CNT > W_MIN;W_CNT--)
//            {
//              if(img[H_CNT][W_CNT-1] == 255 && img[H_CNT][W_CNT] == 0)//找到左边线
//              {
//                load.right[H_CNT]=W_MAX;
//                load.left[H_CNT]=W_CNT;
//                break;
//              }
//            }
//          }
        }
         if(CROSS == 1)
        {
          load.center[H_CNT]=(uint8)((load.left[H_CNT] + load.right[H_CNT])/2); //行中点
          CROSS = 0;
          continue;
        }
        
      }
      
      
     
      
/*————————————————————————以上为十字补线——————————————————————————————————*/      
      for(W_CNT = load.center[H_CNT+1];W_CNT > W_MIN;W_CNT--)//找左边线
      {
      
        if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT-1] == 0)//找到左边线
        {
          load.left[H_CNT]=W_CNT;
          load.left_valid++;
          load.left_invalid = 0;
          break;
        }        
      }
      
      if(W_CNT == W_MIN)//左丢线
      {
        load.left_invalid++;
        load.left_valid = 0;
        load.left[H_CNT]=W_MIN;
      }

     
      for(W_CNT = load.center[H_CNT+1];W_CNT < W_MAX;W_CNT++)//找右边线
        {
          if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT+1] == 0)//找到右边线
          {
            load.right[H_CNT]=W_CNT;
            load.right_valid++;
            load.right_invalid = 0;
            break;
          }        
        }
      
      if(W_CNT == W_MAX)//右丢线
      {
        load.right_invalid++;
        load.right_valid = 0;
        load.right[H_CNT]=W_MAX;
      }
   
     
      
//      if(load.left_invalid != 0 && load.right_invalid == 0)
//      load.center[H_CNT]= load.left[H_CNT] + 20;
//      else if(load.right_invalid != 0 && load.left_invalid == 0)
//      load.center[H_CNT]= load.right[H_CNT] - 20;
//      else
      load.center[H_CNT]=(uint8)((load.left[H_CNT] + load.right[H_CNT])/2); //行中点
    }
      

  }//搜线for循环
  
   
  
   
  



/*———————————————————————————以下停止线检测———————————-*/
if(xh>0xf4 && kaiguan5 == 1)//if(xh>0x44)
{
        for(H_CNT = 25; H_CNT > H_MIN + 1; H_CNT--)
        {
          for(W_CNT = 0; W_CNT <W_MAX-1;)
          {
            W_CNT++;
            if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT+1] == 0)
              stop_left_add++;
          }
          for(W_CNT = W_MAX; W_CNT >W_MIN+1;)
          {
            W_CNT--;
            if(img[H_CNT][W_CNT] == 255 && img[H_CNT][W_CNT-1] == 0)
            stop_right_add++;
          }
          if(stop_right_add >= 6 && stop_left_add >= 6)
          {
            //stop_flag = 1;
            H_CNT_MIN = H_CNT;
            flag = 1;
          //  break;
         
//          ftm_pwm_duty(FTM0,FTM_CH0,0);//右电机
//          ftm_pwm_duty(FTM0,FTM_CH1,0);
//          ftm_pwm_duty(FTM0,FTM_CH4,0);//右电机
//          ftm_pwm_duty(FTM0,FTM_CH5,0);
//          ftm_pwm_duty(FTM3, FTM_CH0, INIT_STEER_DUTY - 55);
//          systick_delay_ms(250);
//          ftm_pwm_duty(FTM3, FTM_CH0, INIT_STEER_DUTY + 60);
//          systick_delay_ms(400);
//          ftm_pwm_duty(FTM3, FTM_CH0, INIT_STEER_DUTY );
//          //Dsystick_delay_ms(200);
//           ftm_pwm_duty(FTM0,FTM_CH0,3000);//右电机
//          ftm_pwm_duty(FTM0,FTM_CH1,0);
//          ftm_pwm_duty(FTM0,FTM_CH4,3000);//右电机
//          ftm_pwm_duty(FTM0,FTM_CH5,0);
//          systick_delay_ms(200);
//          while(1)
//          {
//            ftm_pwm_duty(FTM0,FTM_CH0,0);//右电机
//            ftm_pwm_duty(FTM0,FTM_CH1,0);
//            ftm_pwm_duty(FTM0,FTM_CH4,0);//右电机
//            ftm_pwm_duty(FTM0,FTM_CH5,0);
            
//          }
          }
          stop_right_add = 0;
          stop_left_add = 0;
        }
}

      


/*——————————————————————————以上停止线检测——————————*/
  
/*——————————————————————————以下会车区检测——————————*/
if(hc_flag == 0 && kaiguan1 == 1 && xh >0xe0)
{
    if(hc_add >=3)
     {
       hc_add = 0;
       hc_get_add = 0;
     }
/*     else if(img[0][30] == 255 && (img[0][0] ==0 && img[0][79] == 0))
    {
      hc_add++;
      for(H_CNT = H_CNT_MAX;H_CNT > H_CNT_MIN+2;H_CNT--)
      {
        if((load.right[H_CNT] - load.right[H_CNT-1]) >= 3)
        {
              H_CNT += 3;
          for(H_CNT=H_CNT+1;H_CNT > H_CNT_MIN+1;H_CNT--)
          {
            
            if(load.right[H_CNT-1] - load.right[H_CNT] >=3)
            {
              hc_get_add++;
              break;
            }
          }
           break;
        }      
      }
    }

*/
   
    else if(img[0][30] == 255 && (img[0][0] ==0 && img[0][79] == 0))
    {
      hc_add++;
      for(H_CNT = H_CNT_MAX;H_CNT > 2;H_CNT--)
      {
        if((load.right[H_CNT] - load.right[H_CNT-1]) >= 2)
        {
              H_CNT += 1;
          for(H_CNT=H_CNT+1;H_CNT > H_CNT_MIN+1;H_CNT--)
          {
            
            if(load.right[H_CNT-1] - load.right[H_CNT] >=1)
            {
              hc_get_add++;
              break;
            }
          }
           break;
        }      
      }
      
      for(H_CNT = H_CNT_MAX;H_CNT > 2;H_CNT--)
      {
        if((load.left[H_CNT] - load.left[H_CNT-1]) >=2)
        {
              H_CNT += 1;
          for(H_CNT=H_CNT+1;H_CNT > H_CNT_MIN+1;H_CNT--)
          {
            
            if(load.left[H_CNT-1] - load.left[H_CNT] >=1)
            {
              hc_get_add++;
              break;
            }
          }
           break;
        }      
      }
      
    }
}
   

   
   
   
  if(hc_flag == 0 && kaiguan2 == 1)
  {
    if(hc_add >=3)
     {
       hc_add = 0;
       hc_get_add = 0;
     }


    else if(img[0][30] == 255 && (img[0][0] ==0 && img[0][79] == 0))
    {
      hc_add++;
      for(H_CNT = H_CNT_MAX;H_CNT > H_CNT_MIN+2;H_CNT--)
      {
        if((load.right[H_CNT] - load.right[H_CNT-1]) >= 3)
        {
              H_CNT += 3;
          for(H_CNT=H_CNT+1;H_CNT > H_CNT_MIN+1;H_CNT--)
          {
            
            if(load.right[H_CNT-1] - load.right[H_CNT] >=3)
            {
              hc_get_add++;
              break;
            }
          }
           break;
        }      
      }
      
       for(H_CNT = H_CNT_MAX;H_CNT > H_CNT_MIN+2;H_CNT--)
      {
        if((load.left[H_CNT] - load.left[H_CNT-1]) >= 3)
        {
              H_CNT += 3;
          for(H_CNT=H_CNT+1;H_CNT > H_CNT_MIN+1;H_CNT--)
          {
            
            if(load.left[H_CNT-1] - load.left[H_CNT] >=3)
            {
              hc_get_add++;
              break;
            }
          }
           break;
        }      
      }
    }








//    else if(img[0][30] == 255 && (img[0][0] ==0 && img[0][79] == 0))
//    {
//      hc_add++;
//     
//    }
  }
   
   
    if(hc_get_add >= 3)
    {
   
//    gpio_set(PTC4,0);
//     delay();
//      gpio_set(PTC8,0);
        hc_get_add=0;
        hc_flag = 2;
        gpio_set (PTC4, 0);
        gg=1;
//        ftm_pwm_duty(FTM0,FTM_CH0,0);
//        ftm_pwm_duty(FTM0,FTM_CH1,0);
//        ftm_pwm_duty(FTM0,FTM_CH5,0);
//        ftm_pwm_duty(FTM0,FTM_CH4,0);
  //
  //      while(1);
//      
////        systick_delay_ms(200);
//        for(y=20;y>0;)
//        {
//          y--;
//          for(x=0xfffff;x > 0;x--);
//        }
//        ftm_pwm_duty(FTM0,FTM_CH0,0);
//        ftm_pwm_duty(FTM0,FTM_CH1,0);
//        ftm_pwm_duty(FTM0,FTM_CH5,0);
//        ftm_pwm_duty(FTM0,FTM_CH4,0);
//      
//        while(1);
      }

      
     
/*——————————————————————————以上会车区检测————————*/  


/*—————————————————————————以下为圆环检测————————*/

  if(kaiguan4 == 1) {
  
  for(H_CNT = 59; H_CNT > 0;H_CNT--) //测量左下限         //试试if(ring_start == 0)下检测
  {
    if(img[H_CNT-1][0] == 0)
    {
      left_btm = H_CNT -1;
      break;
    }
  }
  
   for(H_CNT = 59; H_CNT > 0;H_CNT--)//测量右下限
  {
    if(img[H_CNT-1][79] == 0)
    {
      right_btm = H_CNT -1;
      break;
    }
  }
  
  clear = 0;
  clear_add = 0;
  
  for(H_CNT = 20;H_CNT > 0;H_CNT--)
  {
    for(W_CNT = 0;W_CNT < 79; W_CNT++)
    {
      if(img[H_CNT][W_CNT] == 0)
      {
        clear_add++;
      }
    }
  }
  if(clear_add >= 800) //入环结束检测,此时清除相关入环标志位
  {
    clear = 1;
  }

/////////////////////////////////以上为入环前准备
  
  if(ring_start == 1 || ring_start == 2)     //入环
    {
     if(left_btm <= right_btm)   //先测左环
     {
        if(ring_overlap == 0 || ring_overlap == 1)//检测左圆环,覆盖右圆环
        {
          for(H_CNT = 2; H_CNT < 30; H_CNT++)
          {
            if(load.left[H_CNT-1] - load.left[H_CNT] >= 4)//左圆环
            {
              ring_start = 2;
              ring_overlap = 1;
              if(H_CNT < 8)
              {
                load_center = 38 - H_CNT;
                break;
               }              
              else
              {
                load_center = 38 - H_CNT;
                break;
              }         
            }
          }
        }
      

       if(ring_overlap == 0 || ring_overlap == 2)
       {
         for(H_CNT = 3; H_CNT < 30; H_CNT++)//右圆环
        {
           if(load.right[H_CNT] - load.right[H_CNT-1] >= 4 )//检测右圆环,覆盖左圆环
          {
            ring_start = 2;
            ring_overlap = 2;
            //if(load.left[H_CNT] - load.left[H_CNT+1] >= 0 && load.left[H_CNT] - load.left[H_CNT+1] <= 2 && load.left[H_CNT-2] - load.left[H_CNT-1] >= 0 && load.left[H_CNT-2] - load.left[H_CNT-1] <= 2)
            if(1)
            {
              if(H_CNT <= 7)
              {
                load_center = 35 +H_CNT;
                 break;
              }
              else
              {
                load_center = 35 + H_CNT;
                break;
              }
            }
          }
        
       }
     }
     }
     
     
     else    //先测右环
     {
       if(ring_overlap == 0 || ring_overlap == 2)
       {
       for(H_CNT = 3; H_CNT < 30; H_CNT++)//右圆环
        {
           if(load.right[H_CNT] - load.right[H_CNT-1] >= 44 )//&& (ring_overlap == 0 || ring_overlap == 2))//检测右圆环,覆盖左圆环
          {
            ring_start = 2;
            ring_overlap = 2;
            //if(load.left[H_CNT] - load.left[H_CNT+1] >= 0 && load.left[H_CNT] - load.left[H_CNT+1] <= 2 && load.left[H_CNT-2] - load.left[H_CNT-1] >= 0 && load.left[H_CNT-2] - load.left[H_CNT-1] <= 2)
            if(1)
            {
              if(H_CNT <= 7)
              {
                load_center = 35 +H_CNT;
                 break;
              }
              else
              {
                load_center = 35 + H_CNT;
                break;
              }
            }
          }
        
       }
       }
      
       if(ring_overlap == 0 || ring_overlap == 1)
       {
       for(H_CNT = 2; H_CNT < 30; H_CNT++)//左圆环
      {
        if(load.left[H_CNT-1] - load.left[H_CNT] >= 3 )//检测左圆环,覆盖右圆环
        {
         
          //if(load.left[H_CNT] - load.left[H_CNT+1] >= 0 && load.left[H_CNT] - load.left[H_CNT+1] <= 2 && load.left[H_CNT-2] - load.left[H_CNT-1] >= 0 && load.left[H_CNT-2] - load.left[H_CNT-1] <= 2)
          if(1)
          {
            ring_start = 2;
            ring_overlap = 1;
            if(H_CNT < 8)
              {
                load_center = 38 - H_CNT;
                break;
               }              
              else
              {
                load_center = 38 - H_CNT;
                break;
              }         
          }
        }
      }
     }
     }
     
     
      if(H_CNT == 30 && ring_start == 2 )//&& clear ==1)
      {
         //time_start = 1;
        if(sleep == 2)
        {
          ring_start = 3;
          time_start = 1;         
        }
        sleep++;
      }
    }
   
   
// /* 出环二
  if(ring_overlap == 1 && ring_start == 3 )//&& time_start == 0)
    for(W_CNT = 79 ;W_CNT > 5; W_CNT --)
    {
      black_count = 0;
      for(H_CNT = 59 ;H_CNT > 0;H_CNT--)
      {
        if(img[H_CNT][W_CNT] == 0)
        {
          black_count++;
        }
      }
      if(black_count <= 3)
      {
        for(H_CNT = 59 ;H_CNT > 0;H_CNT--)
        {
          if(img[H_CNT][W_CNT] == 0)
            break;
        }
        
        if(H_CNT > 5 && H_CNT <= 20)
        {
          if((load.center[H_CNT-5] - load.center[H_CNT]) > 8 && (load.center[H_CNT+5] - load.center[H_CNT]) >8)
          {
            ring_off = 2;
          }
        }
        else if(H_CNT > 20 && H_CNT <= 40)
        {
          if((load.center[H_CNT-10] - load.center[H_CNT]) > 15 && (load.center[H_CNT+10] - load.center[H_CNT]) >15)
          {
            ring_off = 2;
            load_center -= 5;
          }
        }
      }
    }
   
//   */
   
/*    if(sleep == 3 && time_start == 0 && ring_off != 2 )     //出环
    {
      if(ring_overlap == 1)   //出左环
      {
        for(W_CNT = 0 ;W_CNT < 79; W_CNT++)
        {
          if(img[0][W_CNT] == 255  && img[5][W_CNT] == 255 )//&& img[9][W_CNT] == 255 )//|| img[3][W_CNT] == 255 || img[4][W_CNT] == 255 || img[5][W_CNT] == 255 || img[6][W_CNT] == 255 || img[7][W_CNT] == 255)
          {
            black_count++; //此处白色点计数
          }
        }
      }
      
      if(ring_overlap == 2)   ////出右环
      {
        for(W_CNT = 0 ;W_CNT < 79; W_CNT++)
        {
          if(img[0][W_CNT] == 255 )// && img[5][W_CNT] == 255 )//&& img[9][W_CNT] == 255 )//|| img[3][W_CNT] == 255 || img[4][W_CNT] == 255 || img[5][W_CNT] == 255 || img[6][W_CNT] == 255 || img[7][W_CNT] == 255)
          {
            black_count++; //此处白色点计数
          }
        }
//        for(W_CNT = 40 ;W_CNT < 55; W_CNT++)
//        {
//          for(H_CNT = 59 ;H_CNT > 0 ;H_CNT --)
//          {
//            if(img[H_CNT][W_CNT] == 0)// || img[2][W_CNT] == 255 || img[3][W_CNT] == 255 || img[4][W_CNT] == 255 || img[5][W_CNT] == 255 || img[6][W_CNT] == 255 || img[7][W_CNT] == 255)
//            {
//              black_count++; //此处黑色点计数
//            }
//          }
//        }
//        black_count /=(15);
      }
    }
   
   
      if((black_count >= 30))// || (black_count <= 10 && ring_overlap == 2)) //开始保持打角
      {
        ring_off = 1;
        sleep = 0;
      }
      black_count = 0;
   
   
   
   
   

   
    if(ring_off == 1)
    {
      if(load_center > ring_center_memory && ring_overlap == 1)  //左圆环保持右打角
      {
        ring_off = 2;
        ring_delay = 1;
        ring_overlap = 0;
      }
      if(load_center < ring_center_memory && ring_overlap == 2)  //右圆环保持左打角
      {
        ring_off = 2;
        ring_delay = 1;
        ring_overlap = 0;
      }
    }
   
//       if(ring_off == 2 )
//   {
//      ring_overlap = 0;
//     // sleep = 0;  
//   }
*/   
    ring_center_memory = load_center;

  }

  //记录中心值
     
/*————————————————————————以上为圆环检测——————————*/   
  
}
  
    /*
        所有行找完后的处理
    */

    /*以下停止线检测*/
/*_____________________________________________________________________________________
        for(H_CNT = 55; H_CNT > 45; H_CNT--){
                for(W_CNT = 40 ; W_CNT > 25; W_CNT--){
                        if((img[H_CNT][W_CNT+1] == 255) && (img[H_CNT][W_CNT] == 0)){
                                left_stop = 1;
                                break;
                        }
                }//找左停止线
                for(W_CNT = 40 ; W_CNT < 55; W_CNT++){
                        if((img[H_CNT][W_CNT - 1] == 255) && (img[H_CNT][W_CNT] == 0)){
                                right_stop = 1;
                                break;
                        }
                }//找右停止线
        if(left_stop == 1 && right_stop == 1 && img[50][40] == 255){
            if(gpio_get(PTA17) == 0) { stop = 1;}//开第一个拨码开关就开停止线检测
            else    stop = 0;//等于0关掉停车
        }//满足条件了
        }
________________________________________________________________________________________________*/
    /*以上停止线检测*/

    /*以下十字检测*/
/*__________________________________________________________________________________________________
    if(load.left_lost[48] == LOSTLINE && load.left_lost[50] == LOSTLINE && load.left_lost[52] == LOSTLINE &&
       load.right_lost[48] == LOSTLINE && load.right_lost[50] == LOSTLINE && load.right_lost[52] == LOSTLINE &&
       img[48][40] == 255 && img[50][40] == 255 && img[52][40] == 255){
           CROSS = 1;
        }
___________________________________________________________________________________________________*/
    /*以上十字检测*/
   
    /*以下障碍检测*/
/*_____________________________________________________________________________________________
    for(H_CNT = 35; H_CNT > 20; H_CNT--)
        {
                if(gpio_get(PTA15) == 1 && (img[H_CNT - 1][55] == 0 || img[H_CNT - 1][25] == 0) && (abs(load.center[H_CNT+3] - load.center[H_CNT]) > 8) && load.left_lost[H_CNT+1] == GETLINE && load.right_lost[H_CNT+1] == GETLINE){//有突变,没丢线
                        if(abs(load.center[H_CNT+3] - load.center[H_CNT+2]) < 5 && abs(load.center[H_CNT-2] - load.center[H_CNT-1] < 5) &&
               abs(load.center[H_CNT+3] - CAMERA_W/2) < 10){//很直, 底线靠中间 有黑块
                   OBSTACLE = 1;
                   if(img[H_CNT - 1][55] == 0 && img[H_CNT - 1][25] == 255){//障碍在右边
                        ftm_pwm_duty(FTM2, FTM_CH0, 450 - 55);
                   }
                   else if(img[H_CNT - 1][25] == 0 && img[H_CNT - 1][55] == 255){//障碍在左边
                        ftm_pwm_duty(FTM2, FTM_CH0, 450 + 55);
                   }
                   break;
                        }
                }
        }
__________________________________________________________________________________________*/
    /*以上障碍检测*/
/*__________________________________________________________________________________________   
    memset( (void *)load.left_lost,  GETLINE, CAMERA_H );
    memset( (void *)load.right_lost, GETLINE, CAMERA_H );
        
        
}
____________________________________________________________________________________________*/
/*!
*  @brief     计算中心点函数
*  @since      v1.0
*  @note       CSUST
*/
uint8 calculate_mid(uint8 end)
{
  
    uint8 count=0;
    int x;   
   
     for(H_CNT = 59; H_CNT>0;H_CNT--)
    {
      x=0;
      for(W_CNT = 0;W_CNT<79;W_CNT ++)
      {
        if(img[H_CNT][W_CNT] == 0 && img[H_CNT][W_CNT+1]==255)
        {
          x++;
        }
      }
      if(x>=3)
        load.center[H_CNT] =39;
    }
   
    if(ring_start != 2)   //入环标志,此时改变中值计算方式
    {
      for( H_CNT = H_MAX;H_CNT > H_CNT_MIN;)
      {
        H_CNT--;
        load_center += load.center[H_CNT];
        count++;
      }
     load_center = load_center / (count);
    }
   
    if(ring_off == 2)
      load_center = ring_center_memory;

   
    return (uint8)load_center;
}



void display_com(uint8 end)//在上位机上显示中线
{
    uint16 H_CNT;
    for(H_CNT = H_MAX; H_CNT > H_MIN;){
                H_CNT--;
                img[H_CNT][load.center[H_CNT]] = 0;
        }
   
//    for(H_CNT = CAMERA_H;H_CNT>0;)
//    {
//      H_CNT--;
//      for(W_CNT = CAMERA_W;W_CNT>0;)
//      {
//        W_CNT--;
//        img[H_CNT][W_CNT] = 255;
//      }
//    }
//    for(H_CNT = CAMERA_H;H_CNT>0;)
//    {
//      H_CNT--;
//      img[H_CNT][load.left[H_CNT]] =0;
//      img[H_CNT][load.right[H_CNT]] = 0;
//      img[H_CNT][load.center[H_CNT]] = 0;
//    }
}

void display_lcd(void)//在液晶屏上显示三条线
{
    uint8 H_CNT;
    Site_t center[CAMERA_H];
    Site_t left[CAMERA_H];
    Site_t right[CAMERA_H];
    for(H_CNT = CAMERA_H; H_CNT>0;)
    {
                H_CNT--;
        center[H_CNT].y = H_CNT;
                center[H_CNT].x = load.center[H_CNT];
        left[H_CNT].y = H_CNT;
                left[H_CNT].x = load.left[H_CNT];
        right[H_CNT].y = H_CNT;
                right[H_CNT].x = load.right[H_CNT];
        }
   
    LCD_points(center,CAMERA_H, GREEN);//一堆点
    LCD_points(left,CAMERA_H, BLUE);//一堆点
    LCD_points(right,CAMERA_H, BLUE);//一堆点
}

评分

参与人数 1黑币 +12 收起 理由
eafasf + 12 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:380389 发表于 2018-8-12 11:55 来自手机 | 只看该作者
好资料,谢谢楼主分享
回复

使用道具 举报

板凳
ID:601030 发表于 2019-11-24 19:16 | 只看该作者
可否简单讲解一下思路,光看代码看不懂啊
回复

使用道具 举报

地板
ID:636435 发表于 2019-12-6 10:00 | 只看该作者
真给力1
回复

使用道具 举报

5#
ID:699902 发表于 2020-2-29 00:12 | 只看该作者
可以具体说一下反光的程序吗,麻烦le
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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