智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5197|回复: 32
打印 上一主题 下一主题

提取两边黑线程序冒失有点问题 求指点优化 小车只能向一个方向跑

  [复制链接]

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

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

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
跳转到指定楼层
1#
发表于 2013-3-19 08:41:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
   //提取两边黑线 并记录        
    for(i=ROW-1;i>=0;i--)       //从近处向远处处理 提取黑线
     {
         left_flag=0;right_flag=0;
         if(left>=2)     //上次左边缘跳变点必须大于等于2才是有效的  需要改进  
           {
             for(j=left+5;j>=1;j--)
             {
               if((Buffer1[i][j+1]==1)&&(Buffer1[i][j+2]==1)&&(Buffer1[i][j+3]==1)&&(Buffer1[i][j]==0)&&(Buffer1[i][j-1]==0))
                {
                 left=j;        //数据的左边缘跳变点
                 left_flag=1;
                 break;
                }
             }

          }
        else
          {
           for(j=83;j>0;j--) //若上次跳变点无效则增大搜索范围
            {
              if((Buffer1[i][j+1]==1)&&(Buffer1[i][j+2]==1)&&(Buffer1[i][j+3]==1)&&(Buffer1[i][j]==0)&&(Buffer1[i][j-1]==0))
                {
                  left=j;        //数据的左边缘跳变点
                  left_flag=1;
                  break;
                }
            }

         }

       if(right<=82)      //上次右边缘跳变点必须小于等于82才是有效的  需要改进
        {
          for(j=right-5;j<84;j++)    //搜索范围 这样可以节省不少时间
           {
             if((Buffer1[i][j-1]==1)&&(Buffer1[i][j-2]==1)&&(Buffer1[i][j-3]==1)&&(Buffer1[i][j]==0)&&(Buffer1[i][j+1]==0))
               {
                right=j;
                right_flag=1;
                break;
               }
           }
        }
      else
        {
         for(j=1;j<84;j++)   //若上次跳变点无效则增大搜索范围
           {
             if((Buffer1[i][j-1]==1)&&(Buffer1[i][j-2]==1)&&(Buffer1[i][j-3]==1)&&(Buffer1[i][j]==0)&&(Buffer1[i][j+1]==0))
              {
               right=j;
               right_flag=1;
               break;
              }
           }
        }



68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

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

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
33#
发表于 2013-4-4 08:43:59 | 只看该作者
p141592653 发表于 2013-3-31 17:23
我再发最新的,已经没有什么问题了,边沿提取精确
if(!right_end_flag)
      {

代码收下啦,谢谢啦
回复 支持 反对

使用道具 举报

20

主题

308

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2157
QQ
威望
1132
贡献
547
兑换币
695
注册时间
2012-11-27
在线时间
239 小时
32#
发表于 2013-4-1 12:57:11 | 只看该作者
学习下取中线
回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

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

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
31#
 楼主| 发表于 2013-3-31 18:01:33 | 只看该作者
p141592653 发表于 2013-3-31 17:23
我再发最新的,已经没有什么问题了,边沿提取精确
if(!right_end_flag)
      {

你提取的思想是什么啊 对于特殊的情况你又是如何考虑处理的呢
回复 支持 反对

使用道具 举报

24

主题

69

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1868
威望
994
贡献
478
兑换币
399
注册时间
2011-8-5
在线时间
198 小时
30#
发表于 2013-3-31 17:23:16 | 只看该作者
mxj1005071012 发表于 2013-3-31 09:25
考虑的很全面

我再发最新的,已经没有什么问题了,边沿提取精确
if(!right_end_flag)
      {
          if(!scan_right)
          {
            for(right_count_location=right_pix_temp;right_count_location<l;right_count_location++)            
            {
              //边沿点获取
             // printf("h=%d ",hang_pic);
             //   printf("r=%d ",right_count_location);
                if(*(picpoint[hang_pic]+l/2)<color_div_value)    //开始扫描的点不是白色的则关闭扫描
                {
                  scan_right=1;
                 // printf("h=%d no color=%d\n",hang_pic,*(picpoint[hang_pic]+right_count_location));
                  break;
                }
                if((*(picpoint[hang_pic]+right_count_location)>=color_div_value)&&                  //找到边沿点
                    (*(picpoint[hang_pic]+right_count_location+1)>=color_div_value)&&
                     (*(picpoint[hang_pic]+right_count_location+2)<color_div_value)&&
                       (*(picpoint[hang_pic]+right_count_location+3)<color_div_value))
                {
                  if(hang_pic==h-1)                     //记录最近一行的位置
                  {
                    temp_edge[hang_pic].right_edge=right_count_location;
             //       printf("h=%d rLOne=%d color=%d\n",hang_pic,right_count_location,*(picpoint[hang_pic]+right_count_location));
                    break;
                  }
                  if((hang_pic<h-1) && (temp_edge[hang_pic+1].right_edge>=right_count_location))      //第二行开始记录位置并且和上一行比较
                  {
                  temp_edge[hang_pic].right_edge=right_count_location;
                  right_add_count++;
            //      printf("h=%d rL=%d color=%d\n",hang_pic,right_count_location,*(picpoint[hang_pic]+right_count_location));
                  break;
                  }
                  else                                      //找到连续方向不一样的时候屏蔽该边,并且停止扫描
                  {
                    right_use=1;
                    scan_right=1;
                    right_end=hang_pic;
                    //printf("h=%d end=%d\n",hang_pic,right_end);
                    break;
                  }
                }
               else if(right_count_location>l-5)    //位置在图像边界的4个点内找不到边缘时位置标记为256   
                {
                  if(hang_pic<l-3 && temp_edge[hang_pic+1].right_edge==256 && temp_edge[hang_pic+2].right_edge<256)
                  {
                    right_end_flag=1;
                    break;
                  }
                  temp_edge[hang_pic+1].right_edge=256;
             //     printf("h=%d end1=%d\n",hang_pic,temp_edge[hang_pic+1].right_edge);
                   if(hang_pic>=20)
                      cross_right++;
                  break;
                }
              }
          }
          else
          {
            temp_edge[hang_pic].right_edge=257;                  //标记为结束
           // printf("final=%d loc=%d\n",hang_pic+1,temp_edge[hang_pic].right_edge);
            right_end_flag=1;
          }
      }
回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

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

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
29#
 楼主| 发表于 2013-3-31 09:25:23 | 只看该作者
p141592653 发表于 2013-3-30 22:53
if(!scan_right)
      {
        for(right_count_location=right_pix_temp;right_count_location=color ...

考虑的很全面
回复 支持 反对

使用道具 举报

24

主题

69

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1868
威望
994
贡献
478
兑换币
399
注册时间
2011-8-5
在线时间
198 小时
28#
发表于 2013-3-30 22:53:24 | 只看该作者
if(!scan_right)
      {
        for(right_count_location=right_pix_temp;right_count_location<l;right_count_location++)            
        {
          //边沿点获取
         // printf("h=%d ",hang_pic);
         //   printf("r=%d ",right_count_location);
            if(*(picpoint[hang_pic]+right_count_location)<color_div_value)
            {
              scan_right=1;
              break;
            }
            if((*(picpoint[hang_pic]+right_count_location)>=color_div_value)&&
                (*(picpoint[hang_pic]+right_count_location+1)>=color_div_value)&&
                 (*(picpoint[hang_pic]+right_count_location+2)<color_div_value)&&
                   (*(picpoint[hang_pic]+right_count_location+3)<color_div_value))
            {
              if(hang_pic==h-1)                     //记录最近一行的位置
              {
                temp_edge[hang_pic].right_edge=right_count_location;
                break;
              }
              if(hang_pic<h-1&&temp_edge[hang_pic+1].right_edge>=right_count_location)      //第二行开始记录位置并且和上一行比较
              {
              temp_edge[hang_pic].right_edge=right_count_location;
              right_add_count++;
           //   printf("rL=%d ",right_count_location);
           //   printf("hang_pic=%d 1\n",hang_pic);
              break;
              }
              else                                      //找到连续方向不一样的时候屏蔽该边,并且停止扫描
              {
                right_use=1;
                scan_right=1;
                right_end=hang_pic;
                break;
              }
            }
           else if(right_count_location>l-5)    //位置在图像边界的4个点内找不到边缘时位置标记为254     
            {
              temp_edge[hang_pic].right_edge=254;
              //printf("0\n");
               if(hang_pic>20)
                  cross_right++;
              break;
            }
          }
      }
      else temp_edge[hang_pic].right_edge=255;                  //标记为结束


我自己写的,觉得还有些情况没弄上去,这里只是一边
回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

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

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
27#
 楼主| 发表于 2013-3-29 19:47:08 | 只看该作者
huanyefeng0809 发表于 2013-3-29 16:45
那就把你用来控制转向的量和给舵机的值给输出来呗....看看关系对不对...你要都不知道是什么地方出问题了还 ...

是啊 我也这样想 准备用无线模块发数据呢  现在调的速度太慢了
回复 支持 反对

使用道具 举报

7

主题

111

帖子

0

精华

高级会员

Rank: 4

积分
978
威望
442
贡献
276
兑换币
269
注册时间
2013-2-20
在线时间
130 小时
26#
发表于 2013-3-29 16:45:48 | 只看该作者
mxj1005071012 发表于 2013-3-29 13:35
黑线提取有些地方是不常规的

那就把你用来控制转向的量和给舵机的值给输出来呗....看看关系对不对...你要都不知道是什么地方出问题了还怎么调...
回复 支持 反对

使用道具 举报

21

主题

892

帖子

0

精华

常驻嘉宾

爱板者

Rank: 8Rank: 8

积分
3857

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

威望
1833
贡献
1048
兑换币
736
注册时间
2012-12-4
在线时间
488 小时
25#
 楼主| 发表于 2013-3-29 13:35:59 | 只看该作者
huanyefeng0809 发表于 2013-3-28 22:30
没有调试工具吗?可以把你提取的黑线发出来...看到底是不是黑线提取的问题...

黑线提取有些地方是不常规的
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 09:01 , Processed in 0.343937 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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