智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4971|回复: 14
打印 上一主题 下一主题

CCD图像处理算法分享

  [复制链接]

3

主题

16

帖子

0

精华

注册会员

Rank: 2

积分
100
QQ
威望
57
贡献
31
兑换币
31
注册时间
2015-10-1
在线时间
6 小时
毕业学校
江苏科技大学
跳转到指定楼层
1#
发表于 2015-10-6 12:57:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*************主图像处理函数**************/ //基本完成 有要修改的参数
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;
      }
      }
      
   }

}
回复

使用道具 举报

3

主题

16

帖子

0

精华

注册会员

Rank: 2

积分
100
QQ
威望
57
贡献
31
兑换币
31
注册时间
2015-10-1
在线时间
6 小时
毕业学校
江苏科技大学
2#
 楼主| 发表于 2015-10-6 13:00:47 | 只看该作者
十字处理时好时坏,好的时候稳得一比,坏的时候简直不能直视,希望大家多提意见
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
899
威望
448
贡献
281
兑换币
294
注册时间
2015-9-4
在线时间
85 小时
3#
发表于 2015-10-6 13:10:10 | 只看该作者
太简单了吧...
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

注册会员

Rank: 2

积分
100
QQ
威望
57
贡献
31
兑换币
31
注册时间
2015-10-1
在线时间
6 小时
毕业学校
江苏科技大学
4#
 楼主| 发表于 2015-10-6 13:12:01 | 只看该作者
看起来是挺简单的啊,但是简单只要能实现功能就不错哇
回复 支持 反对

使用道具 举报

10

主题

998

帖子

0

精华

版主

一个只会水的渣渣

Rank: 9Rank: 9Rank: 9

积分
22264

优秀会员奖章活跃会员奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
17390
贡献
3076
兑换币
2900
注册时间
2015-1-22
在线时间
899 小时
毕业学校
安一中
5#
发表于 2015-10-6 16:19:44 | 只看该作者
简单的程序处理起来就不会乱
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

注册会员

Rank: 2

积分
100
QQ
威望
57
贡献
31
兑换币
31
注册时间
2015-10-1
在线时间
6 小时
毕业学校
江苏科技大学
6#
 楼主| 发表于 2015-10-6 16:31:04 | 只看该作者
因为用的就是一个CCD,十字没有什么比较独特的破解方法,都是比较通俗的简单处理方法
回复 支持 反对

使用道具 举报

0

主题

120

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3562
威望
1707
贡献
1115
兑换币
1050
注册时间
2014-12-2
在线时间
370 小时
毕业学校
五块石小学
7#
发表于 2015-10-8 22:49:23 | 只看该作者
:lol:lol:lol:lol:lol:lol
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
威望
143
贡献
71
兑换币
93
注册时间
2015-9-12
在线时间
24 小时
毕业学校
qinghua
8#
发表于 2015-11-21 19:19:37 | 只看该作者
:lol:lol
回复 支持 反对

使用道具 举报

11

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2181
威望
899
贡献
502
兑换币
567
注册时间
2014-10-14
在线时间
390 小时
毕业学校
西华
9#
发表于 2015-12-3 12:01:09 | 只看该作者
十字的时候图像全白理论上应该直行,在左右电机驱动能力不一样的时候可能有点歪。但是如果情况是在十字的时候突然打角那就说不定是看见不该看的东西了哦,多用上位机看看图像。反正去年我一个CCD过十字挺稳的
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

注册会员

Rank: 2

积分
100
QQ
威望
57
贡献
31
兑换币
31
注册时间
2015-10-1
在线时间
6 小时
毕业学校
江苏科技大学
10#
 楼主| 发表于 2015-12-28 09:54:23 | 只看该作者
我的就不稳,提前拐弯,坑
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 19:04 , Processed in 0.184226 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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