智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2757|回复: 11
打印 上一主题 下一主题

[编程类] 小白求解代码意义

[复制链接]

4

主题

25

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3939
威望
3162
贡献
735
兑换币
98
注册时间
2019-3-24
在线时间
21 小时
跳转到指定楼层
1#
发表于 2019-4-5 09:23:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

imgbuff_process是一个储存图像的一维数组,长度为600,数据只有0xff、0
请问代码中的,x,y,find,cont等含义和用法?
代码中是如何处理坐标的呢?
计算出跳变沿的规律又是什么呢?
恳请大佬指点几分!!!
  1. void get_edge()   //尽量减少乘法运算
  2. {
  3.   static int16 i=0,j=0,last=0,x=0,y=0,n=0;
  4.   uint8 temp=0,find=0;
  5.   cont=0;
  6.   for(i=0;i<60;i++)
  7.   {
  8.     last=0; //记录上一个点的颜色情况,黑为1,白为0
  9.     x=i*10; //每一行的开头,从0-590,一共60行
  10.     find=0;
  11.     edgposition[i]=0;   // edgposition[60]
  12.     for(j=0;j<10;j++)   // 每一个点,每一行有十个点
  13.     {
  14.       if(imgbuff_process[x+j]==0xff)    //imgbuff_process[600],判断是否为黑点
  15.       {
  16.         if(last==0)
  17.         {
  18.               y=j<<3;   // 为什么要乘以8,y是做什么用的?
  19.               if(find==0)       // find又是做什么用的?
  20.               {
  21.                 edgposition[i]=cont;    // cont是什么意思?
  22.               }
  23.               img_edg[cont++]=y;   //左移动5相当于乘以32 左移动3相当于乘以8 img_edg[1200]
  24.               find=1;
  25.         }
  26.          last=1;
  27.          continue;
  28.       }
  29.       if(imgbuff_process[x+j]==0)       //如果为白点
  30.       {
  31.         if(last==1)
  32.         {         
  33.                y=j<<3;
  34.               if(find==0)
  35.               {
  36.                 edgposition[i]=cont;
  37.               }
  38.               img_edg[cont++]=y;   //左移动5相当于乘以32 左移动3相当于乘以8  
  39.               find=1;
  40.         }
  41.         last=0;
  42.         continue;
  43.       }
  44.       
  45.       for(n=7;n>=0;n--)
  46.       {
  47.             temp=(imgbuff_process[x+j]>>n)&1;// 获取该点像素值 (0或1)     
  48.             if(temp!=last) //与上一个值不相同 出现了跳变沿            
  49.             {
  50.                y=j<<3;  
  51.                if(find==0)
  52.               {
  53.                 edgposition[i]=cont;
  54.               }
  55.                img_edg[cont++]=y+7-n;   //左移动5相当于乘以32 左移动3相当于乘以8
  56.                find=1;
  57.             }
  58.               last=temp;                //存储该点的值
  59.       }
  60.     }
  61.      img_edg[cont++]=0xff;   //左移动5相当于乘以32 左移动3相当于乘以8

  62.   }
  63. }
  64. /*img_edg是一个一维数组 记录了摄像头每行的跳变沿的坐标值  每行跳变沿 由上升沿开始(由黑变白)然后接下降沿(由白变黑)
  65.    0xff用于指示该行的跳变沿完了,开始记录下一行
  66.    如果每行图像以白色部分开始,那么该行跳变沿起始位置为0
  67.    如果该行全黑 那么该行记录为0xff
  68.    如果该行为全白 记录为 0 0xff

  69.    
  70.   oxff代表本行坐标值结束,进入下一行
  71. //edgposition[i]代表第i行的 跳变沿 在 img_edg 中坐标起点

  72. */
复制代码


回复

使用道具 举报

2

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
880
QQ
威望
466
贡献
260
兑换币
305
注册时间
2017-12-2
在线时间
77 小时
2#
发表于 2019-4-5 12:12:36 | 只看该作者
没必要全部理解,懂得如何搜线,判断赛道元素,结合自己的理解写一套属于自己的程序啊!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
395
威望
204
贡献
125
兑换币
135
注册时间
2018-10-30
在线时间
33 小时
3#
发表于 2019-4-5 15:05:35 | 只看该作者
你把你的QQ告诉我  我和你说一下  
回复 支持 反对

使用道具 举报

1

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
678
QQ
威望
358
贡献
234
兑换币
190
注册时间
2017-12-24
在线时间
43 小时
4#
发表于 2019-4-5 16:14:02 | 只看该作者
加油吧。。。
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3939
威望
3162
贡献
735
兑换币
98
注册时间
2019-3-24
在线时间
21 小时
5#
 楼主| 发表于 2019-4-5 17:12:30 | 只看该作者
冷~风 发表于 2019-4-5 15:05
你把你的QQ告诉我  我和你说一下

626870844&#128591;谢谢你!


回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3939
威望
3162
贡献
735
兑换币
98
注册时间
2019-3-24
在线时间
21 小时
6#
 楼主| 发表于 2019-4-5 17:13:22 | 只看该作者
冷~风 发表于 2019-4-5 15:05
你把你的QQ告诉我  我和你说一下

626870844
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3939
威望
3162
贡献
735
兑换币
98
注册时间
2019-3-24
在线时间
21 小时
7#
 楼主| 发表于 2019-4-5 22:22:33 | 只看该作者
这是我自己改写成Windows Console的C程序以后,得出的一些含义和规律,注释部分有改动。但是获取像素值,也就是不进入两个if中的那一块还是没有明白,摄像头捕捉后的图像数组中如果不是0xff,也不是0,而是别的数值,记录下跳变值的意义是什么呢?
  1. void get_edge()   //尽量减少乘法运算
  2. {
  3.   static int16 i=0,j=0,last=0,x=0,y=0,n=0;
  4.   uint8 temp=0,find=0;
  5.   cont=0;
  6.   for(i=0;i<60;i++)
  7.   {
  8.     last=0; //记录上一个点的颜色情况,黑为1,白为0
  9.     x=i*10; //每一行的开头,从0-590,一共60行
  10.     find=0; //新的一行,find变为0,若该行中出现跳变,find会一直等于1
  11.     edgposition[i]=0;   // edgposition[60]
  12.     for(j=0;j<10;j++)   // 每一个点,每一行有十个点
  13.     {
  14.       if(imgbuff_process[x+j]==0xff)    //imgbuff_process[600],判断是否为黑点
  15.       {
  16.         if(last==0)
  17.         {
  18.               y=j<<3;   // 为什么要乘以8(目前还不知道),y是做什么用的?y使用来存储跳变沿的坐标位置(j)
  19.               if(find==0)       // find又是做什么用的?新的一行,find变为0,若该行中出现跳变,find会一直等于1
  20.               {
  21.                 edgposition[i]=cont;    // cont是什么意思?cont用来记录跳变沿的个数(上升+下降+行数算一个),cont是累加的,当前行记录的是不包括本行的跳变沿个数,最后结果是前59行的跳变沿个数,没有最后一行的跳变沿个数
  22.               }
  23.               img_edg[cont++]=y;   //左移动5相当于乘以32 左移动3相当于乘以8 img_edg[1200]
  24.               find=1;
  25.         }
  26.          last=1;
  27.          continue;
  28.       }
  29.       if(imgbuff_process[x+j]==0)       //如果为白点
  30.       {
  31.         if(last==1)
  32.         {         
  33.                y=j<<3;
  34.               if(find==0)
  35.               {
  36.                 edgposition[i]=cont;
  37.               }
  38.               img_edg[cont++]=y;   //左移动5相当于乘以32 左移动3相当于乘以8  
  39.               find=1;
  40.         }
  41.         last=0;
  42.         continue;
  43.       }
  44.       
  45.       for(n=7;n>=0;n--)
  46.       {
  47.             temp=(imgbuff_process[x+j]>>n)&1;// 获取该点像素值 (0或1)     
  48.             if(temp!=last) //与上一个值不相同 出现了跳变沿            
  49.             {
  50.                y=j<<3;  
  51.                if(find==0)
  52.               {
  53.                 edgposition[i]=cont;
  54.               }
  55.                img_edg[cont++]=y+7-n;   //左移动5相当于乘以32 左移动3相当于乘以8
  56.                find=1;
  57.             }
  58.               last=temp;                //存储该点的值
  59.       }
  60.     }
  61.      img_edg[cont++]=0xff;   //0xff代表本行坐标值结束,进入下一行,也存入img_edg;注意这里cont也++

  62.   }
  63. }
  64. /*img_edg是一个一维数组 记录了摄像头每行的跳变沿的坐标值  每行跳变沿 由上升沿开始(由黑变白)然后接下降沿(由白变黑)
  65.    0xff用于指示该行的跳变沿完了,开始记录下一行
  66.    如果每行图像以白色部分开始,那么该行跳变沿起始位置为0
  67.    如果该点全黑 那么该行记录为0xff
  68.    如果该点为全白 记录为 0

  69.    
  70.   0xff代表本行坐标值结束,进入下一行
  71. //edgposition[i]代表第i行的 跳变沿 在 img_edg 中坐标起点,除以8

  72. */
复制代码
后面会附上改写的控制台C程序
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3939
威望
3162
贡献
735
兑换币
98
注册时间
2019-3-24
在线时间
21 小时
8#
 楼主| 发表于 2019-4-5 22:25:04 | 只看该作者
以下是控制台C程序,自己模拟了直线数据
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         static short int i = 0, j = 0, last = 0, x = 0, y = 0, n = 0;
  5.         unsigned char temp = 0, find = 0, imgbuff_process[600] = { 0 }, img_edg[1200];
  6.         unsigned short int cont = 0, edgposition[60];
  7.         for (int p = 0; p < 60; p++)
  8.         {
  9.                 for (int q = 0; q < 10; q++)
  10.                 {
  11.                         imgbuff_process[p * 10 + q] = 0;
  12.                         if (q == 4 || q == 5)
  13.                         {
  14.                                 imgbuff_process[p * 10 + q] = 0xff;
  15.                         }
  16.                 }
  17.         }
  18.         for (i = 0; i < 60; i++)
  19.         {
  20.                 last = 0; //记录上一个点的颜色情况,黑为1,白为0
  21.                 x = i * 10; //每一行的开头,从0-590,一共60行
  22.                 find = 0;        //新的一行,find变为0,若该行中出现跳变,find会一直等于1
  23.                 edgposition[i] = 0;   // edgposition[60]
  24.                 for (j = 0; j < 10; j++)   // 每一个点,每一行有十个点
  25.                 {
  26.                         if (imgbuff_process[x + j] == 0xff)    //imgbuff_process[600],判断是否为黑点
  27.                         {
  28.                                 if (last == 0)
  29.                                 {
  30.                                         y = j << 3;   // 为什么要乘以8(目前还不知道),y是做什么用的?y使用来存储跳变沿的坐标位置(j)
  31.                                         if (find == 0)       // find又是做什么用的?新的一行,find变为0,若该行中出现跳变,find会一直等于1
  32.                                         {
  33.                                                 edgposition[i] = cont;    // cont是什么意思?cont用来记录跳变沿的个数(上升+下降+行数算一个),cont是累加的,当前行记录的是不包括本行的跳变沿个数,最后结果是前59行的跳变沿个数,没有最后一行的跳变沿个数
  34.                                         }
  35.                                         img_edg[cont++] = y;   //左移动5相当于乘以32 左移动3相当于乘以8 img_edg[1200]
  36.                                         find = 1;
  37.                                 }
  38.                                 last = 1;
  39.                                 continue;
  40.                         }
  41.                         if (imgbuff_process[x + j] == 0)       //如果为白点
  42.                         {
  43.                                 if (last == 1)
  44.                                 {
  45.                                         y = j << 3;
  46.                                         if (find == 0)
  47.                                         {
  48.                                                 edgposition[i] = cont;
  49.                                         }
  50.                                         img_edg[cont++] = y;
  51.                                         find = 1;
  52.                                 }
  53.                                 last = 0;
  54.                                 continue;
  55.                         }

  56.                         for (n = 7; n >= 0; n--)
  57.                         {
  58.                                 temp = (imgbuff_process[x + j] >> n) & 1;// 获取该点像素值 (0或1)     
  59.                                 if (temp != last) //与上一个值不相同 出现了跳变沿            
  60.                                 {
  61.                                         y = j << 3;
  62.                                         if (find == 0)
  63.                                         {
  64.                                                 edgposition[i] = cont;
  65.                                         }
  66.                                         img_edg[cont++] = y + 7 - n;
  67.                                         find = 1;
  68.                                 }
  69.                                 last = temp;                //存储该点的值
  70.                         }
  71.                 }
  72.                 img_edg[cont++] = 0xff;   //0xff代表本行坐标值结束,进入下一行,也存入img_edg;注意这里cont也++
  73.         }
  74.         printf("-----打印imgbuff_process-----\n");
  75.         for (int p = 0; p < 60; p++)
  76.         {
  77.                 for (int q = 0; q < 10; q++)
  78.                 {
  79.                         printf("%d", imgbuff_process[p * 10 + q]);
  80.                 }
  81.                 printf("\n");
  82.         }
  83.         printf("--------------------\n");
  84.         printf("-----打印img_edg-----\n");
  85.         for (int p = 0; p < 60; p++)
  86.         {
  87.                 for (int q = 0; q < 20; q++)
  88.                 {
  89.                         printf("%5d", img_edg[p * 20 + q]);        // 注意此处为p*20
  90.                 }
  91.                 printf("\n");
  92.         }
  93.         printf("--------------------\n");
  94.         printf("-----打印edgposition-----\n");
  95.         for (int p = 0; p < 60; p++)
  96.         {
  97.                 printf("%5d", edgposition[p]);
  98.         }
  99.         printf("\n--------------------\n");
  100. }
复制代码


回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

高级会员

Rank: 4

积分
712
威望
372
贡献
234
兑换币
252
注册时间
2018-1-18
在线时间
53 小时
毕业学校
湖北汽车工业学院
9#
发表于 2019-4-6 16:31:47 | 只看该作者
看得头皮发麻
回复 支持 反对

使用道具 举报

1

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
678
QQ
威望
358
贡献
234
兑换币
190
注册时间
2017-12-24
在线时间
43 小时
10#
发表于 2019-4-6 20:42:59 | 只看该作者
头皮发麻
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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