智能车制作

 找回密码
 注册

扫一扫,访问微社区

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

CCD图像处理算法分享

  [复制链接]

3

主题

16

帖子

0

精华

注册会员

Rank: 2

积分
100
QQ
威望
57
贡献
31
兑换币
31
注册时间
2015-10-1
在线时间
6 小时
毕业学校
江苏科技大学
跳转到指定楼层
#
发表于 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;
      }
      }
      
   }

}
回复

使用道具 举报

0

主题

61

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2130

优秀会员奖章活跃会员奖章

威望
1040
贡献
680
兑换币
689
注册时间
2017-1-9
在线时间
205 小时
14#
发表于 2018-6-13 12:39:58 | 只看该作者
:L:L:L
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2130

优秀会员奖章活跃会员奖章

威望
1040
贡献
680
兑换币
689
注册时间
2017-1-9
在线时间
205 小时
13#
发表于 2018-6-13 12:39:48 | 只看该作者
:):):)
回复 支持 反对

使用道具 举报

31

主题

449

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3387

优秀会员奖章活跃会员奖章在线王奖章

QQ
威望
1608
贡献
1035
兑换币
1049
注册时间
2015-10-19
在线时间
372 小时
毕业学校
太和一中
12#
发表于 2016-10-6 22:02:08 | 只看该作者
找特征点,看图像
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

注册会员

Rank: 2

积分
59
QQ
威望
42
贡献
9
兑换币
17
注册时间
2016-10-2
在线时间
4 小时
毕业学校
黑龙江科技大学
11#
发表于 2016-10-5 13:49:29 | 只看该作者
:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol
回复 支持 反对

使用道具 举报

20

主题

572

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3501

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

威望
1767
贡献
1086
兑换币
1086
注册时间
2014-5-3
在线时间
324 小时
毕业学校
江苏科技大学
10#
发表于 2015-12-28 12:51:34 | 只看该作者
学弟啊,你把你郭学长的资料散贡献了
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

注册会员

Rank: 2

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

使用道具 举报

11

主题

127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

0

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

0

主题

120

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

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

使用道具 举报

3

主题

16

帖子

0

精华

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-4 08:14 , Processed in 0.068744 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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