⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 天大一队(参考).cpp

📁 黑线提取算法
💻 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 + -