原理
先找到一个白点A,然后向右找到黑点,记录黑点的位置,以当前黑点的竖坐标位置向上判断,上面的点是什么点,如果为黑点向左找白点,如果为白点向右找黑点(找到边界点),然后接着以当前竖坐标位置判断上面的点...就这样设计的
总体思想是这样,但是并不是简单如此,有几个特殊的处理
没写完呢
int zhidao_flage=0;
int goto_cross=0;
int xieshizi_among=0;//斜十字中间
int xieshizi__cnt=0;//斜十字
int start=0;//从哪里开始求平均
int stop=0;//
int avg=0;//黑线中点平均位置
int flage=0,flag=0;
int i=0,j=0,copy_j=0,among=0,up=0;
int right[40]={0,0};//右边界记录数组---行列记录
/*左边缘*/
int ii=0,iii=0;
int left_flage=0,left_flag=0;
int left_i=0,left_j=0,left_copy_j=0,left_among=0,left_up=0;
int left[40]={0,0}; //左边界记录数组---行列记录
return_left_max=0;
return_left_min=0;
left_carry = 0;
/*左边缘*/
return_right_max = 0;//右边界最高点
return_right_min = 0;//右边界最低点
right_carry = 0; //运行标志位
// printf("left********");
//左边界
/*先找到起始点*/
//中 //上 //左 右
if(image[38][40] > thresh && image[37][40] > thresh &&image[38][39] > thresh &&image[38][41] > thresh)//所选点为白点
{
// peedPid -> SetPoint = 20;//设置起始速度为
if(image[38][40] > thresh)
{
for(left_i=40;left_i>0;left_i--)
{
if(image[38][left_i] < thresh)
{
left_flage = 1; //标志位置一
left_carry = 1; //运行标志位置一
left[38] = left_i; //记录当前位置
left_copy_j = 38; //把最低位置传递给下面的函数
// left_lie[i]=copy_j; //第i行的边界是copy_j
return_left_min = 38; //左边界最低点
break;
}
}
}
if(left_flage == 0)//左边上上找
{
for(left_j=38;left_j>16;left_j--)
{
if(image[left_j][1] < thresh)
{
if(left_j<30)
{
for(ii=38;ii>20;ii--)
{
if(image[ii][40]<thresh)
{
left_carry = 0;
return_left_max = 0;
return_left_min = 0;
goto diuxian1;
}
}
}
// if(image[left_j][4] >thresh&&image[left_j][6] >thresh&&image[left_j][8] >thresh)
// {
// if(image[left_j-1][6] >thresh&&image[left_j-1][8] >thresh&&image[left_j-1][10] >thresh)
// {
left_copy_j = left_j; //把最低位置传递给下面的函数
// left_lie[i]=copy_j; //第i行的边界是copy_j
left_flage = 1; //标志位置一
left_carry = 1; //运行标志位置一
left[left_j] = left_i; //记录当前位置
return_left_min = left_j;//左边界最低点
break;
// }
// }
}
}
}
if(left_flage==1)
{
for(left_j = left_copy_j; left_j>1; left_j --)
{
left_among = left[left_j];//记录现在点的x坐标
left_up = left_j - 1; //上
if(left_up < 0) left_up = 0;
if(*(*(image+left_up)+left_among)>thresh)//如果上面是白点
{
left_flag = 0;
// printf("111111111111");
for(left_i = left_among; left_i >1; left_i --)//向左找黑色边缘
{
// if(left_i <0)
// {
// left_i=0;
// }
if(image[left_up][left_i] < thresh)//容差大于delta--找到
{
left_flag = 1;//找到边缘标志
left[left_up] = left_i;//记录
// left_lie[i]=up; //第i行的边界是up
// printf("22222222222");
break;
}
}
}
else
{
// printf("aaaaaaaaaaaaa");
left_flag = 0;
for(left_i = left_among; left_i<78; left_i ++)//向右找白色边缘
{
// if(left_i>79)
// {
// left_i=79;
// }
if(image[left_up][left_i] > thresh)//容差大于delta--找到
{
left_flag = 1;//找到边缘标志
left[left_up] = left_i;//记录
// left_lie[i]=up; //第i行的边界是up
// printf("bbbbbbbbbbbbb");
break;
}
}
}
if(left_flag==0)
{
// printf("jkfhuidasf");
return_left_max = left_j+1;
break;
}
else
{
return_left_max = left_j+1;//返回函数检测的最高点
// printf("jkfhuidasf");
}
}
// printf("return_left=%d\r\n",return_left_max);
// printf("return_left_max==%d\r\n",left[return_left_max]);
// for(ii = 0;ii<40;ii++)
// {
// printf("%d",ii);
// printf("==%d\r\n",left[ii]);
// }
}
diuxian1:
/*右边界************************************************/
if(image[38][40] > thresh)//所选点为白点
{
for(i=40;i<78;i++)//向右找黑点
{
if(image[38][i] < thresh)//找到黑点
{
flage = 1; //标志位置一
right_carry = 1; //运行标志位置一
right[38] = i; //记录当前位置--第38行的边界是i
copy_j = 38; //把最低位置传递给下面的函数
// right_lie[i]=copy_j; //第i列的边界是copy_j
return_right_min = 38;//右边界最低点
break;
}
}
}
if(flage == 0)//上面没找到边界
{
return_right_min=0;
for(j=38;j>16;j--)//向上找10行
{
if(image[j][77] < thresh)//如果找到边界
{
// if(image[j][74] >thresh&&image[j][71] >thresh&&image[j][68] >thresh)
// {
// if(image[j-1][72] >thresh&&image[j-1][70] >thresh&&image[j-1][68] >thresh)
// {
if(j<30)
{
for(ii=38;ii>20;ii--)
{
if(image[ii][40]<thresh)
{
// printf("****%d",ii);
right_carry = 0;
return_right_max = 0;
return_right_min = 0;
goto diuxian2;
}
}
}
flage = 1; //标志位置一
right_carry = 1; //运行标志位置一
right[j] = i; //记录当前位置
copy_j = j; //把最低位置传递给下面的函数
// right_lie[i]=copy_j; //第i列的边界是copy_j
return_right_min = j; //右边界最低点
break;
// }
// }
}
}
}
if(flage==1)
{
for(j = copy_j; j>1; j --)
{
among = right[j];//记录现在点的x坐标
up = j - 1; //上
if(up < 0) up = 0;
if(*(*(image+up)+among)>thresh)//如果上面是白点
{
flag = 0;
for(i = among; i < 78; i ++)//向右找黑色边缘
{
// if(i>79)
// {
// i=79;
// }
if(image[up][i] < thresh)//容差大于delta--找到
{
flag = 1;//找到边缘标志
right[up] = i;//记录
// right_lie[i]=up; //第i列的边界是up
break;
}
}
}
else
{
flag = 0;
for(i = among; i > 1; i --)//向左找白色边缘
{
// if(i<0)
// {
// i=0;
// }
if(image[up][i] > thresh)//容差大于delta--找到
{
flag = 1;//找到边缘标志
right[up] = i;//记录
// right_lie[i]=up; //第i列的边界是up
break;
}
}
}
if(flag==0)
{
return_right_max = j+1;//返回函数检测的最高点
// printf("j==%d\r\n",j);
break;
}
else
{
return_right_max = j+1;//返回函数检测的最高点
// printf("j==%d\r\n",j);
}
}
// printf("return_right_max==%d\r\n",return_right_max);
// printf("return_right_max==%d\r\n",right[return_right_max]);
// for(ii = 0;ii<40;ii++)
// {
// printf("%d",ii);
// printf("==%d\r\n",right[ii]);
// }
}
diuxian2: