智能车制作
标题:
小白求解代码意义
[打印本页]
作者:
LinkChen
时间:
2019-4-5 09:23
标题:
小白求解代码意义
imgbuff_process是一个储存图像的一维数组,长度为600,数据只有0xff、0
请问代码中的,x,y,find,cont等含义和用法?
代码中是如何处理坐标的呢?
计算出跳变沿的规律又是什么呢?
恳请大佬指点几分!!!
void get_edge() //尽量减少乘法运算
{
static int16 i=0,j=0,last=0,x=0,y=0,n=0;
uint8 temp=0,find=0;
cont=0;
for(i=0;i<60;i++)
{
last=0; //记录上一个点的颜色情况,黑为1,白为0
x=i*10; //每一行的开头,从0-590,一共60行
find=0;
edgposition[i]=0; // edgposition[60]
for(j=0;j<10;j++) // 每一个点,每一行有十个点
{
if(imgbuff_process[x+j]==0xff) //imgbuff_process[600],判断是否为黑点
{
if(last==0)
{
y=j<<3; // 为什么要乘以8,y是做什么用的?
if(find==0) // find又是做什么用的?
{
edgposition[i]=cont; // cont是什么意思?
}
img_edg[cont++]=y; //左移动5相当于乘以32 左移动3相当于乘以8 img_edg[1200]
find=1;
}
last=1;
continue;
}
if(imgbuff_process[x+j]==0) //如果为白点
{
if(last==1)
{
y=j<<3;
if(find==0)
{
edgposition[i]=cont;
}
img_edg[cont++]=y; //左移动5相当于乘以32 左移动3相当于乘以8
find=1;
}
last=0;
continue;
}
for(n=7;n>=0;n--)
{
temp=(imgbuff_process[x+j]>>n)&1;// 获取该点像素值 (0或1)
if(temp!=last) //与上一个值不相同 出现了跳变沿
{
y=j<<3;
if(find==0)
{
edgposition[i]=cont;
}
img_edg[cont++]=y+7-n; //左移动5相当于乘以32 左移动3相当于乘以8
find=1;
}
last=temp; //存储该点的值
}
}
img_edg[cont++]=0xff; //左移动5相当于乘以32 左移动3相当于乘以8
}
}
/*img_edg是一个一维数组 记录了摄像头每行的跳变沿的坐标值 每行跳变沿 由上升沿开始(由黑变白)然后接下降沿(由白变黑)
0xff用于指示该行的跳变沿完了,开始记录下一行
如果每行图像以白色部分开始,那么该行跳变沿起始位置为0
如果该行全黑 那么该行记录为0xff
如果该行为全白 记录为 0 0xff
oxff代表本行坐标值结束,进入下一行
//edgposition[i]代表第i行的 跳变沿 在 img_edg 中坐标起点
*/
复制代码
作者:
小欢可乐
时间:
2019-4-5 12:12
没必要全部理解,懂得如何搜线,判断赛道元素,结合自己的理解写一套属于自己的程序啊!!
作者:
冷~风
时间:
2019-4-5 15:05
你把你的QQ告诉我 我和你说一下
作者:
cxr18220662742
时间:
2019-4-5 16:14
加油吧。。。
作者:
LinkChen
时间:
2019-4-5 17:12
冷~风 发表于 2019-4-5 15:05
你把你的QQ告诉我 我和你说一下
626870844🙏谢谢你!
作者:
LinkChen
时间:
2019-4-5 17:13
冷~风 发表于 2019-4-5 15:05
你把你的QQ告诉我 我和你说一下
626870844
作者:
LinkChen
时间:
2019-4-5 22:22
这是我自己改写成Windows Console的C程序以后,得出的一些含义和规律,注释部分有改动。但是获取像素值,也就是不进入两个if中的那一块还是没有明白,摄像头捕捉后的图像数组中如果不是0xff,也不是0,而是别的数值,记录下跳变值的意义是什么呢?
void get_edge() //尽量减少乘法运算
{
static int16 i=0,j=0,last=0,x=0,y=0,n=0;
uint8 temp=0,find=0;
cont=0;
for(i=0;i<60;i++)
{
last=0; //记录上一个点的颜色情况,黑为1,白为0
x=i*10; //每一行的开头,从0-590,一共60行
find=0; //新的一行,find变为0,若该行中出现跳变,find会一直等于1
edgposition[i]=0; // edgposition[60]
for(j=0;j<10;j++) // 每一个点,每一行有十个点
{
if(imgbuff_process[x+j]==0xff) //imgbuff_process[600],判断是否为黑点
{
if(last==0)
{
y=j<<3; // 为什么要乘以8(目前还不知道),y是做什么用的?y使用来存储跳变沿的坐标位置(j)
if(find==0) // find又是做什么用的?新的一行,find变为0,若该行中出现跳变,find会一直等于1
{
edgposition[i]=cont; // cont是什么意思?cont用来记录跳变沿的个数(上升+下降+行数算一个),cont是累加的,当前行记录的是不包括本行的跳变沿个数,最后结果是前59行的跳变沿个数,没有最后一行的跳变沿个数
}
img_edg[cont++]=y; //左移动5相当于乘以32 左移动3相当于乘以8 img_edg[1200]
find=1;
}
last=1;
continue;
}
if(imgbuff_process[x+j]==0) //如果为白点
{
if(last==1)
{
y=j<<3;
if(find==0)
{
edgposition[i]=cont;
}
img_edg[cont++]=y; //左移动5相当于乘以32 左移动3相当于乘以8
find=1;
}
last=0;
continue;
}
for(n=7;n>=0;n--)
{
temp=(imgbuff_process[x+j]>>n)&1;// 获取该点像素值 (0或1)
if(temp!=last) //与上一个值不相同 出现了跳变沿
{
y=j<<3;
if(find==0)
{
edgposition[i]=cont;
}
img_edg[cont++]=y+7-n; //左移动5相当于乘以32 左移动3相当于乘以8
find=1;
}
last=temp; //存储该点的值
}
}
img_edg[cont++]=0xff; //0xff代表本行坐标值结束,进入下一行,也存入img_edg;注意这里cont也++
}
}
/*img_edg是一个一维数组 记录了摄像头每行的跳变沿的坐标值 每行跳变沿 由上升沿开始(由黑变白)然后接下降沿(由白变黑)
0xff用于指示该行的跳变沿完了,开始记录下一行
如果每行图像以白色部分开始,那么该行跳变沿起始位置为0
如果该点全黑 那么该行记录为0xff
如果该点为全白 记录为 0
0xff代表本行坐标值结束,进入下一行
//edgposition[i]代表第i行的 跳变沿 在 img_edg 中坐标起点,除以8
*/
复制代码
后面会附上改写的控制台C程序
作者:
LinkChen
时间:
2019-4-5 22:25
以下是控制台C程序,自己模拟了直线数据
#include<stdio.h>
void main()
{
static short int i = 0, j = 0, last = 0, x = 0, y = 0, n = 0;
unsigned char temp = 0, find = 0, imgbuff_process[600] = { 0 }, img_edg[1200];
unsigned short int cont = 0, edgposition[60];
for (int p = 0; p < 60; p++)
{
for (int q = 0; q < 10; q++)
{
imgbuff_process[p * 10 + q] = 0;
if (q == 4 || q == 5)
{
imgbuff_process[p * 10 + q] = 0xff;
}
}
}
for (i = 0; i < 60; i++)
{
last = 0; //记录上一个点的颜色情况,黑为1,白为0
x = i * 10; //每一行的开头,从0-590,一共60行
find = 0; //新的一行,find变为0,若该行中出现跳变,find会一直等于1
edgposition[i] = 0; // edgposition[60]
for (j = 0; j < 10; j++) // 每一个点,每一行有十个点
{
if (imgbuff_process[x + j] == 0xff) //imgbuff_process[600],判断是否为黑点
{
if (last == 0)
{
y = j << 3; // 为什么要乘以8(目前还不知道),y是做什么用的?y使用来存储跳变沿的坐标位置(j)
if (find == 0) // find又是做什么用的?新的一行,find变为0,若该行中出现跳变,find会一直等于1
{
edgposition[i] = cont; // cont是什么意思?cont用来记录跳变沿的个数(上升+下降+行数算一个),cont是累加的,当前行记录的是不包括本行的跳变沿个数,最后结果是前59行的跳变沿个数,没有最后一行的跳变沿个数
}
img_edg[cont++] = y; //左移动5相当于乘以32 左移动3相当于乘以8 img_edg[1200]
find = 1;
}
last = 1;
continue;
}
if (imgbuff_process[x + j] == 0) //如果为白点
{
if (last == 1)
{
y = j << 3;
if (find == 0)
{
edgposition[i] = cont;
}
img_edg[cont++] = y;
find = 1;
}
last = 0;
continue;
}
for (n = 7; n >= 0; n--)
{
temp = (imgbuff_process[x + j] >> n) & 1;// 获取该点像素值 (0或1)
if (temp != last) //与上一个值不相同 出现了跳变沿
{
y = j << 3;
if (find == 0)
{
edgposition[i] = cont;
}
img_edg[cont++] = y + 7 - n;
find = 1;
}
last = temp; //存储该点的值
}
}
img_edg[cont++] = 0xff; //0xff代表本行坐标值结束,进入下一行,也存入img_edg;注意这里cont也++
}
printf("-----打印imgbuff_process-----\n");
for (int p = 0; p < 60; p++)
{
for (int q = 0; q < 10; q++)
{
printf("%d", imgbuff_process[p * 10 + q]);
}
printf("\n");
}
printf("--------------------\n");
printf("-----打印img_edg-----\n");
for (int p = 0; p < 60; p++)
{
for (int q = 0; q < 20; q++)
{
printf("%5d", img_edg[p * 20 + q]); // 注意此处为p*20
}
printf("\n");
}
printf("--------------------\n");
printf("-----打印edgposition-----\n");
for (int p = 0; p < 60; p++)
{
printf("%5d", edgposition[p]);
}
printf("\n--------------------\n");
}
复制代码
作者:
汽院zero
时间:
2019-4-6 16:31
看得头皮发麻
作者:
cxr18220662742
时间:
2019-4-6 20:42
头皮发麻
作者:
スケート少年
时间:
2019-4-7 17:01
好熟悉的感觉
作者:
qiujianqin
时间:
2019-4-9 16:36
浩密的味道
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2