1. 得到缩小后的灰度图像
void Get_Use_Image(void)
{
int i,j;
for(i=0;i<image_row;i++)
for(j=0;j<image_col;j++)
{
Image_Use[i][j] = image[i*2][j*2+1];
}
}
uint8 image[MT9V032_H][MT9V032_W];
#define image_row 60
#define image_col 94
uint8 Image_Use[image_row][image_col];
2. 得到二值化后的图像
void Get_Bin_Image (unsigned char mode)
{
unsigned short i = 0, j = 0;
unsigned short Threshold = 0;
unsigned long tv = 0;
if (mode == 0)
{
Threshold = GetOSTU(Image_Use);
}
if (mode == 1)
{
for (i = 0; i < image_row; i++)
{
for (j = 0; j < image_col; j++)
{
tv += Image_Use[i][j];
}
}
Threshold =(unsigned short)(tv / image_row / image_col);
Threshold = Threshold + 20;
}
else if (mode == 2)
{
Threshold = 80;
lq_sobel(Image_Use, Bin_Image, (unsigned char) Threshold);
return;
}
else if (mode == 3)
{
lq_sobelAutoThreshold(Image_Use, Bin_Image);
return;
}
for (i = 0; i < image_row; i++)
{
for (j = 0; j < image_col; j++)
{
if (Image_Use[i][j] > Threshold)
Bin_Image[i][j] = WHITE_BIN;
else
Bin_Image[i][j] = BLACK_BIN;
}
}
}
#define image_row 60
#define image_col 94
#define BLACK_BIN 0
#define WHITE_BIN 1
uint8 Image_Use[image_row][image_col];
uint8 Bin_Image[image_row][image_col];
3. 过滤噪点
void Bin_Image_Filter (void)
{
int16 nr;
int16 nc;
for (nr = 1; nr < image_row - 1; nr++)
{
for (nc = 1; nc < image_col - 1; nc = nc + 1)
{
if ((Bin_Image[nr][nc] == 0)
&& (Bin_Image[nr - 1][nc] + Bin_Image[nr + 1][nc] + Bin_Image[nr][nc + 1] + Bin_Image[nr][nc - 1] > 2))
{
Bin_Image[nr][nc] = 1;
}
else if ((Bin_Image[nr][nc] == 1)
&& (Bin_Image[nr - 1][nc] + Bin_Image[nr + 1][nc] + Bin_Image[nr][nc + 1] + Bin_Image[nr][nc - 1] < 2))
{
Bin_Image[nr][nc] = 0;
}
}
}
}
#define image_row 60
#define image_col 94
uint8 Image_Use[image_row][image_col];
uint8 Bin_Image[image_row][image_col];
4. 获得赛道边界
int16 Image_Side[2][image_row];
int16 DivLine;
int16 Road_Width[image_row];
void Image_Get_Side (void)
{
int16 x;
int16 y;
int16 start_col;
for(x=start_col; x <= right_col; x++)
{
if(Bin_Image[start_row][x] == WHITE_BIN)
if(Bin_Image[start_row-1][x] == WHITE_BIN)
if(Bin_Image[start_row-2][x] == WHITE_BIN)
{
start_col=x;
break;
}
}
for(x=start_col; x >= left_col; x--)
{
if(Bin_Image[start_row][x] == WHITE_BIN)
if(Bin_Image[start_row-1][x] == WHITE_BIN)
if(Bin_Image[start_row-2][x] == WHITE_BIN)
{
start_col=x;
break;
}
}
for(x = start_col; x <= right_col; x++)
{
if(Bin_Image[start_row][x] == BLACK_BIN)
{
Image_Side[RIGHT][start_row] = x;
break;
}
}
if(x > right_col)
{
Image_Side[RIGHT][start_row] = LOST_RIGHT_SIDE ;
}
for(x = start_col; x >= left_col; x--)
{
if(Bin_Image[start_row][x] == BLACK_BIN)
{
Image_Side[LEFT][start_row] = x;
break;
}
}
if(x < left_col)
{
Image_Side[LEFT][start_row] = LOST_LEFT_SIDE ;
}
Road_Width[start_row] = Image_Side[RIGHT][start_row] - Image_Side[LEFT][start_row];
for(y=start_row-1; y>=end_row; y--)
{
x = Image_Side[LEFT][y+1] + 4;
while( (Bin_Image[y][x]==BLACK_BIN) && (x<=right_col) )
{
x += 4;
}
if(x>right_col)
{
DivLine = y+1;
break;
}
for(; x>=left_col; x--)
{
if(Bin_Image[y][x] == BLACK_BIN)
{
Image_Side[LEFT][y] = x;
break;
}
}
if(x < left_col)
{
Image_Side[LEFT][y] = LOST_LEFT_SIDE;
}
x = Image_Side[RIGHT][y+1] - 4;
while( (Bin_Image[y][x]==BLACK_BIN) && (x>=left_col) )
{
x -= 4;
}
if(x < 0)
{
DivLine = y+1;
break;
}
for(;x <= right_col; x++)
{
if(Bin_Image[y][x] == BLACK_BIN)
{
Image_Side[RIGHT][y] = x;
break;
}
}
if(x > right_col)
{
Image_Side[RIGHT][y] = LOST_RIGHT_SIDE;
}
Road_Width[y] = Image_Side[RIGHT][y] - Image_Side[LEFT][y];
if( (Road_Width[y] < 10)
|| (Image_Side[LEFT][y] > image_col-5)
|| (Image_Side[RIGHT][y] < 4))
{
DivLine = y + 1;
break;
}
else
DivLine=0;
}
}
#define image_row 60
#define image_col 94
#define BLACK_BIN 0
#define WHITE_BIN 1
#define LEFT 0
#define RIGHT 1
#define LOST_LEFT_SIDE -1
#define LOST_RIGHT_SIDE image_col
uint8 Image_Use[image_row][image_col];
uint8 Bin_Image[image_row][image_col];
uint8 left_col = 0;
uint8 right_col = image_col-1;
uint8 end_row = 0;
uint8 start_row = image_row-1;
int16 Image_Side[2][image_row];
int16 DivLine;
int16 Road_Width[image_row];