智能车制作

标题: CCD图像处理算法分享 [打印本页]

作者: sneer    时间: 2015-10-6 12:57
标题: CCD图像处理算法分享
/*************主图像处理函数**************/ //基本完成 有要修改的参数
void ImageManage(CCD_Type *CCD_Struct)
{
  int16 UpPoint[20]={0};
  int16 DownPoint[20]={0};
  int16 WhiteChecked[20]={0};//存放大白块宽度,i
  int16 WhiteCheckedMiddleLine[20]={0};
  int16 BlackChecked[20]={0};//存放黑块宽度
  int16 BlackCheckedMiddleLine[20]={0};
  int16 up=0;           //上升沿个数
  int16 down=0;         //下降沿个数
  int16 flat_black=0;
  static int16 ZJ_count=0;
  int16 flat_white=0;
  int16 MiddleNearest=127;
  int16 MiddleNearErr;
  int8 flag1=0;
  int8 flag0=0;
  static int8 flag2=0;
  
  //寻找跳变沿
  UpPoint[0]=0;
  up=1;
  if(CCD_Struct->Pixel_Mono[0]==0)
  {
    DownPoint[0]=0;
    down=1;
  }

  for(uint8 i=1;i<128;i++)
  {
    if(CCD_Struct->Pixel_Mono[i]>CCD_Struct->Pixel_Mono[i-1])//upside
    {
      UpPoint[up]=i;
      up++;
      flag0=1;  //左边线存在
         
    }
    else
      flag0=0;       //左边线不存在
    if(CCD_Struct->Pixel_Mono[i]<CCD_Struct->Pixel_Mono[i-1])//downside
    {
      DownPoint[down]=i;
      down++;
      flag1=1;
    }
    else
      flag1=0;
    if(CCD_Struct->Pixel_Mono[i]==0)
     {
        flat_black++;
      }
      
    if(CCD_Struct->Pixel_Mono[i]==100)
      {
        flat_white++;
      }
  }
  UpPoint[up]=127;
  DownPoint[down]=127;
  //大白=下降沿-上升沿
      if(!flag0&&!flag1&&!flat_black)  //图像全白,取前两次的中线作为当前中线处理
      {
      CCD_Struct->MiddleLineNow=CCD_Struct->Middline[2];
      CCD_Struct->ImageWidthNow=CCD_Struct->ImageWidth[2];
      CCD_Struct->LeftEdgeNow=CCD_Struct->LeftEdge[2];
      CCD_Struct->RightEdgeNow=CCD_Struct->RightEdge[2];
      }

      for(int16 i=0;i<up;i++)
      {
        WhiteChecked[i]=DownPoint[i]-UpPoint[i];
        
        if(WhiteChecked[i]>30)     //视具体情况而定
        {
          WhiteCheckedMiddleLine[i]=(DownPoint[i]+UpPoint[i])/2;
          MiddleNearErr=ABS(CCD_Struct->MiddleLineNow-WhiteCheckedMiddleLine[i]);
          if(MiddleNearErr<MiddleNearest||(WhiteChecked[i]>=30&&WhiteChecked[i]<=70))
          {
            MiddleNearest=MiddleNearErr;
         //   if(MiddleNearErr<15)
          // {
            CCD_Struct->MiddleLineNow=WhiteCheckedMiddleLine[i];
            CCD_Struct->ImageWidthNow=WhiteChecked[i];//保存赛道宽度
            CCD_Struct->LeftEdgeNow=UpPoint[i];
            CCD_Struct->RightEdgeNow=DownPoint[i];
          //  }
         
          }
                  
        }      
         
    }
    for(int16 i=1;i<up-1;i++)            //中线处理
    {
      BlackChecked[i]=UpPoint[i+1]-DownPoint[i];
      BlackCheckedMiddleLine[i]=(DownPoint[i]+UpPoint[i+1])/2;
      if(BlackChecked[i]<10)
        {
         
          MiddleNearErr=ABS(CCD_Struct->MiddleLineNow-BlackCheckedMiddleLine[i]);
           if(DownPoint[i+1]-UpPoint[i+1]>=20&&DownPoint[i]-UpPoint[i]>=20)
              {
              MiddleNearest=0;
              CCD_Struct->MiddleLineNow=BlackCheckedMiddleLine[i];
              CCD_Struct->ImageWidthNow=UpPoint[i+1]-DownPoint[i];
              CCD_Struct->LeftEdgeNow=DownPoint[i];
              CCD_Struct->RightEdgeNow=UpPoint[i];
              break;
              }
        }
      if(BlackChecked[i]>10&&BlackChecked[i]<30)
      {
        if(BlackCheckedMiddleLine[i]>64)
        {
        CAR.RealforBarrier=rightBarrier;
        }
        else
       {
      CAR.RealforBarrier=leftBarrier;
      //  CAR.moto=c_stop;
        }
             CAR.Count_2=Time_Barriar;      
      }
      
      
    }
   for(int8 i=19;i>0;i--)
          {
            CCD_Struct->Middline[i]=CCD_Struct->Middline[i-1];
            CCD_Struct->ImageWidth[i]=CCD_Struct->ImageWidth[i-1];
            CCD_Struct->LeftEdge[i]=CCD_Struct->LeftEdge[i-1];
            CCD_Struct->RightEdge[i]=CCD_Struct->RightEdge[i-1];
          }   
    CCD_Struct->Middline[0]=CCD_Struct->MiddleLineNow;
    CCD_Struct->ImageWidth[0]=CCD_Struct->ImageWidthNow;
    CCD_Struct->LeftEdge[0]=CCD_Struct->LeftEdgeNow;
    CCD_Struct->RightEdge[0]=CCD_Struct->RightEdgeNow;     //至此中线位置已经解决
   
   for(int i=19;i>0;i--)                        //保存中线位置
      {
        CAR.route[i]=CAR.route[i-1];
      }
  if(ABS(CCD_SingleStrcut.Middline[0]-CCD_SingleStrcut.Middline[1])<10)
  {
   
      CAR.route[0]= CCD_SingleStrcut.Middline[0];
      if(!flag0&&!flag1&&!flat_white)
      {
      // CAR.moto=c_stop;
       // fflag=1;
      
        
        if(ZJ_count==0)
        {
          ZJ_count=50;
          fflag=50;
        }
      
      if(ZJ_count)
      {
        ZJ_count--;
        fflag--;
         
        {
          if(CCD_SingleStrcut.ImageWidth[0]>80)          //直角判断
          {
            if(CCD_SingleStrcut.LeftEdge[0]<=15)   
            {

              CAR.RealforEgl=leftEgl;            //右拐直角
              CAR.route[0]=CAR.route[0]-80;
             //  CAR.Count_1=zhijiao_time;           
            }
            if(CCD_SingleStrcut.RightEdge[0]>=110)
            {

              CAR.RealforEgl=rightEgl;          //左拐直角
          CAR.route[0]=CAR.route[0]+80;
           //   CAR.Count_1=zhijiao_time;        
            }
          }
        }
      }
      else
      {
        CAR.Count_1=0;
        
      
      }
      if(CAR.Count_1>=30)
      {
      fflag=0;
      }
      }
      
   }

}

作者: sneer    时间: 2015-10-6 13:00
十字处理时好时坏,好的时候稳得一比,坏的时候简直不能直视,希望大家多提意见
作者: 好吃的都给你又    时间: 2015-10-6 13:10
太简单了吧...
作者: sneer    时间: 2015-10-6 13:12
看起来是挺简单的啊,但是简单只要能实现功能就不错哇
作者: cankun1314    时间: 2015-10-6 16:19
简单的程序处理起来就不会乱
作者: sneer    时间: 2015-10-6 16:31
因为用的就是一个CCD,十字没有什么比较独特的破解方法,都是比较通俗的简单处理方法
作者: 一个人的浮屠    时间: 2015-10-8 22:49
:lol:lol:lol:lol:lol:lol
作者: Jakeson_z    时间: 2015-11-21 19:19
:lol:lol
作者: xianyu1993    时间: 2015-12-3 12:01
十字的时候图像全白理论上应该直行,在左右电机驱动能力不一样的时候可能有点歪。但是如果情况是在十字的时候突然打角那就说不定是看见不该看的东西了哦,多用上位机看看图像。反正去年我一个CCD过十字挺稳的
作者: sneer    时间: 2015-12-28 09:54
我的就不稳,提前拐弯,坑
作者: 申继鹏    时间: 2015-12-28 12:51
学弟啊,你把你郭学长的资料散贡献了
作者: wanghuo    时间: 2016-10-5 13:49
:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol
作者: 永远的记忆    时间: 2016-10-6 22:02
找特征点,看图像

作者: 846160606    时间: 2018-6-13 12:39
:):):)
作者: 846160606    时间: 2018-6-13 12:39
:L:L:L




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2