📄 天大一队(参考).cpp
字号:
/************************************************************************
函数名称: get_black_line
功能描述: 黑线提取
输 入: image_data[][],ctl
输出: black_d[]
全局变量: row,line,ROW_MAX,LINE_MAX,image_data,VALVE,black_x
调用模块: 无
************************************************************************/
//传入参数:image_data[][]:传入的图像二维数组;ct1:未知
//输出数据:black_d[]:黑线每行所在图像二维数组该行中的绝对位置
//全局变量中:line_max:表示?
#define BLACK_WIDTH_MIN 10 //黑线的最小宽度
#define BLACK_WIDTH_MAX 30 //黑线的最大宽度
#define BLACK_P1 1 //未知
#define BLACK_P2 4 //未知
signed char black_i[ROW_MAX];
signed int black_j[ROW_MAX];
signed char black_l[ROW_MAX];
signed char black_r[ROW_MAX];
signed char black_b[ROW_MAX];
signed char black_c[ROW_MAX];
//signed int black_e[ROW_MAX];
//signed char black_f[ROW_MAX];
//signed char black_g[ROW_MAX];
signed char black_s; //预测下一点的位置
signed int black_t; //输出值
unsigned char black_range_l; //左右的边沿值?
unsigned char black_range_r;
signed char black_start; //黑线开始的位置
signed char black_end; //黑线结束的位置
signed char row_i; //行变量
//signed char row_j;
signed char slope[ROW_MAX];
unsigned char row_avail=0; //可用的行数
signed char row_effective=0; //0,未知,1,可用,-1,不可用,以后的行不用再算黑线
//-2十字线的处理
signed char row_line_last=0; //前一场第一个可用行的黑线位置
signed char slope_last=0;
//unsigned char row_break;//0,没有断行,1,有1行断行
void get_black_line_r(void); //子函数:计算黑线的右边沿?
void get_black_line(void) //得到黑线
{
for(row_i=0;row_i<ROW_MAX-1;row_i++) //从第一行开始遍历
{
black_t=100*(ROW_MAX-1)*BLACK_P2/((ROW_MAX-1-row_i)*BLACK_P2+row_i*BLACK_P1);//?这是干什么用?
black_b[row_i]=0; //每行刚开始时进行初始化
black_c[row_i]=0;
//black_d[row_j]=0;
//black_e[row_j]=0;
//black_g[row_j]=0;
black_i[row_i]=0;
black_j[row_i]=0;
if(row_i==0) //表示第一行时进行对某些数值进行初始化
{
row_avail=0; //进行初始化
row_effective=0;
black_start=0;
black_end=0;
//row_break=1;
}
black_range_l=LINE_MAX/4; //
black_range_r=LINE_MAX/4;
if(row_avail==0) //表示没有可用的行数了
{
black_l[row_i]=-LINE_MAX/2;
black_r[row_i]=LINE_MAX/2-1;
}
else
{
if(row_avail==1) //表示只有一行可用的行数
{
black_s=black_d[row_i-1]; //未知
}
if(row_avail>1) //表示有其他可用的行数
{
black_s=2*black_d[row_i-1]-black_d[row_i-2];
if(black_s<-LINE_MAX/2) black_s=-LINE_MAX/2;
if(black_s>LINE_MAX/2-1) black_s=LINE_MAX/2-1;
if((row_i<20)&&(abs_sub_t(black_d[row_i-1],black_d[row_i-2])<5))
{
black_range_l=LINE_MAX/8;
black_range_r=LINE_MAX/8;
}
}
black_l[row_i]=black_s-black_range_l;
black_r[row_i]=black_s+black_range_r;
if(black_s<-LINE_MAX/2+black_range_l) black_l[row_i]=-LINE_MAX/2;
if(black_s>LINE_MAX/2-1-black_range_r) black_r[row_i]=LINE_MAX/2-1;
}
row_effective=0;
get_black_line_r();
if((row_effective==1)&&(row_avail>1)&&(row_i<30))
{
slope[row_i]=black_d[row_i]-black_d[row_i-1];
if(row_avail>3)
{
if((slope[row_i]>0)&&(slope[row_i-2]<0))
{
if((slope[row_i]-slope[row_i-2])>6)
{
row_effective=-2;
}
}
else
{
if((slope[row_i]<0)&&(slope[row_i-2]>0))
{
if((slope[row_i-2]-slope[row_i])>6)
{
row_effective=-2;
}
}
}
if(row_effective==-2)
{
black_d[row_i-1]=2*black_d[row_i-2]-black_d[row_i-3];
black_d[row_i]=2*black_d[row_i-1]-black_d[row_i-2];
slope[row_i-1]=black_d[row_i-1]-black_d[row_i-2];
slope[row_i]=black_d[row_i]-black_d[row_i+1];
row_effective=1;
}
}
}
if((row_avail==0)&&(row_i>=5))
row_i=ROW_MAX;
if((row_avail==2)&&(row_effective==1))
{
if(abs_sub_t(row_line_last,black_d[row_i-1])>60)
{
row_i=ROW_MAX;
}
else
{
row_line_last=black_d[row_i-1];
slope_last=black_d[row_i]-black_d[row_i-1];
black_start=row_i-1;
}
}
if((row_effective==0)&&(row_avail>1))
{
if((abs_sub_t(black_d[row_i-1],0)<20)&&(abs_sub_t(black_d[row_i-1],black_d[row_i-2])<5))
{
row_effective=1;
black_d[row_i]=2*black_d[row_i-1]-black_d[row_i-2];
}
}
if((row_i==ROW_MAX-2)&&(row_effective==1)) black_end=ROW_MAX-2;
if((row_effective==0)&&(row_avail>=1))
{ //有一行没提到黑线即停止
if(row_avail>1)
{
row_effective=-1;
black_end=row_i-1;
}
else
{
row_i=ROW_MAX;
}
}
if(row_effective==-1)
{ //-1,不可用,以后的行不用再算黑线
for(row_i;row_i<ROW_MAX;row_i++)
{
black_d[row_i]=2*black_d[row_i-1]-black_d[row_i-2];
if(black_d[row_i]<-LINE_MAX/2) black_d[row_i]=-LINE_MAX/2;
if(black_d[row_i]>LINE_MAX/2-1) black_d[row_i]=LINE_MAX/2-1;
black_a[row_i]=black_d[row_i]+115;
}
}
black_a[row_i]=black_d[row_i]+115;
}
//num1=black_end/10;
//num2=(unsigned char)(black_end%10);
/*for(row_i=0;row_i<ROW_MAX;row_i++){
if((row_i<black_start)||(row_i>black_end)) {
black_a[row_i]=123;
}
}*/
/*spi_putchar('S');
spi_putchar('W');
spi_putchar(black_end+35);
spi_putchar(35);
spi_putchar(35);
spi_putchar('S');
spi_putchar('M');*/
}
void get_black_line_r(void)
{
signed char i,j,k,l;
for(i=black_l[row_i];i<=black_r[row_i]-8;i++) //在一定的宽度范围内
{
if(image_data[row_i][LINE_MAX/2+i]>image_data[row_i][LINE_MAX/2+i+7]+threshold_line[row_i]){
//if(image_data[row_i][LINE_MAX/2+i]>image_data[row_i][LINE_MAX/2+i+8]+threshold_line[row_i])
break;
}
}
k=2; //k赋值
if(i==black_l[row_i])
{
for(j=i+6;j>i;j--)
{
if(image_data[row_i][LINE_MAX/2+i]<=image_data[row_i][LINE_MAX/2+j]+threshold_line[row_i])
break;
k++;
}
}
black_b[row_i]=i+9-k;
k=0;
for(j=black_b[row_i];j<=black_r[row_i]-8;j++)
{
k++;
if(image_data[row_i][LINE_MAX/2+j]+threshold_line[row_i]<image_data[row_i][LINE_MAX/2+j+7])
{
//if(image_data[row_j][LINE_MAX/2+i]<image_data[row_j][LINE_MAX/2+j+1]+threshold_line[row_j]){
for(l=j+1;l<j+7;l++)
{
if(image_data[row_i][LINE_MAX/2+l]+threshold_line[row_i]>=image_data[row_i][LINE_MAX/2+j+7])
break;
k++;
}
black_i[row_i]=k;
black_j[row_i]=k*black_t/50;
//k=0;
//if((black_j[row_j]>BLACK_WIDTH_MIN)&&(black_j[row_j]<BLACK_WIDTH_MAX)){
black_c[row_i]=black_b[row_i]+k-1;
row_avail++;
row_effective=1;
black_d[row_i]=(black_b[row_i]+black_c[row_i])/2;
//black_g[row_j]=black_d[row_j]*black_t/200;
break;
//}
//}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -