|
发表于 2015-5-12 16:31:53
|
显示全部楼层
贴在这不知道对不对 ,还请大家多多指导
#define COLOR_X1 (120-70)
#define COLOR_X2 (120+70)
#define COLOR_Y1 (160-70)
#define COLOR_Y2 (160+70)
#define DIF_MAX 10
uint16_t Bx[5];
uint16_t By[5];
uint16_t Sq[9][5]; //0 x 1 y 2 h 3 w 4 c
unsigned int HSL_H,HSL_L;
unsigned int RGB2HL(unsigned int R, unsigned int G, unsigned int B);
uint8_t color_init(void)
{
uint16_t x,y,s,e;
uint16_t color;
uint16_t r, g, b;
uint8_t state = 0;
Bx[0]=0;
By[0]=0;
state = 0;
for(x = COLOR_X1, y = 160; x < COLOR_X2;x++)
{
color = LCD_GetPoint(x,y);
b = ( color>>0 ) & 0x1f;
g = ( color>>6 ) & 0x1f;
r = ( color>>11 ) & 0x1f;
if(b < 0x10 && g< 0x10 && r< 0x10)
color = Black;
if(color == Black && state == 0)
{
s=x;
state = 1;
}
else if(color != Black && state == 1)
{
Bx[++Bx[0]]=(s+x)/2;
state = 0;
}
}
if(Bx[0]!=2)
return 1;
for(y = COLOR_Y1, x = 120; y < COLOR_Y2; y++)
{
color = LCD_GetPoint(x,y);
b = ( color>>0 ) & 0x1f;
g = ( color>>6 ) & 0x1f;
r = ( color>>11 ) & 0x1f;
if(b < 0x10 && g< 0x10 && r< 0x10)
color = Black;
// LCD_SetPoint(x,y,Black);
if(color == Black && state == 0)
{
s=y;
state = 1;
}
else if(color != Black && state == 1)
{
By[++By[0]]=(s+y)/2;
state = 0;
}
}
if(By[0]!=2)
return 1;
Sq[0][0] = (Bx[1]+Bx[2]) / 2;
Sq[0][1] = (By[1]+By[2]) / 2;
//set_arr(SqC[0][0] , SqC[0][1] );
return 0;
}
uint16_t color_next(uint16_t xx,uint16_t yy,uint8_t n)
{
uint16_t x,y,w,h;
uint16_t color,color_t;
uint16_t r, g, b, r_t, g_t, b_t, r_s, g_s, b_s;
uint16_t x_t,y_t;
uint16_t dif;
color = LCD_GetPoint(xx,yy);
b = ( color>>0 ) & 0x1f;
g = ( color>>6 ) & 0x1f;
r = ( color>>11 ) & 0x1f;
r_s = 0;
g_s = 0;
b_s = 0;
/****************************************
ÏòÉϸ¯Ê´
****************************************/
b_t+=b;
g_t+=g;
r_t+=r;
x = xx;
y = yy;
do
{
r_s+=r_t;
g_s+=g_t;
b_s+=b_t;
color_t = LCD_GetPoint(++x,y);
b_t = ( color_t>>0 ) & 0x1f;
g_t = ( color_t>>6 ) & 0x1f;
r_t = ( color_t>>11 ) & 0x1f;
LCD_SetPoint(x,y,Red);
dif = fabs(b-b_t)+fabs(r-r_t)+fabs(g-g_t);
}while(dif < DIF_MAX);
h= x-xx;
x_t= x-1;
/****************************************
Ïòϸ¯Ê´
****************************************/
b_t+=b;
g_t+=g;
r_t+=r;
x = xx;
y = yy;
do
{
r_s+=r_t;
g_s+=g_t;
b_s+=b_t;
color_t = LCD_GetPoint(--x,y);
b_t = ( color_t>>0 ) & 0x1f;
g_t = ( color_t>>6 ) & 0x1f;
r_t = ( color_t>>11 ) & 0x1f;
LCD_SetPoint(x,y,Red);
dif = fabs(b-b_t)+fabs(r-r_t)+fabs(g-g_t);
}while(dif < DIF_MAX);
h+= xx-x;
Sq[n][0] = (x_t+x+1)/2;
/****************************************
ÏòÓÒ¸¯Ê´
****************************************/
b_t+=b;
g_t+=g;
r_t+=r;
x = xx;
y = yy;
do
{
r_s+=r_t;
g_s+=g_t;
b_s+=b_t;
color_t = LCD_GetPoint(x,++y);
b_t = ( color_t>>0 ) & 0x1f;
g_t = ( color_t>>6 ) & 0x1f;
r_t = ( color_t>>11 ) & 0x1f;
LCD_SetPoint(x,y,Red);
dif = fabs(b-b_t)+fabs(r-r_t)+fabs(g-g_t);
}while(dif < DIF_MAX);
w = y - yy;
y_t = y-1;
/****************************************
Ïò×ó¸¯Ê´
****************************************/
b_t+=b;
g_t+=g;
r_t+=r;
x = xx;
y = yy;
do
{
r_s+=r_t;
g_s+=g_t;
b_s+=b_t;
color_t = LCD_GetPoint(x,--y);
b_t = ( color_t>>0 ) & 0x1f;
g_t = ( color_t>>6 ) & 0x1f;
r_t = ( color_t>>11 ) & 0x1f;
LCD_SetPoint(x,y,Red);
dif = fabs(b-b_t)+fabs(r-r_t)+fabs(g-g_t);
}while(dif < DIF_MAX);
w += yy - y;
Sq[n][1] = (y+1+y_t)/2;
Sq[n][2] = h-1;
Sq[n][3] = w-1;
if(RGB2HL(r_s/(w+h), g_s/(w+h), b_s/(w+h)) != 1)
{
Sq[n][5] = HSL_H;
}
}
uint16_t color(void)
{
uint8_t i;
if(color_init() !=0 )
{
return 1;
}
else
{
color_next(Sq[0][0],Sq[0][1],0);
color_next(Sq[0][0]+Sq[0][2],Sq[0][1]+Sq[0][3] ,1);
color_next(Sq[0][0]+Sq[0][2],Sq[0][1] ,2);
color_next(Sq[0][0]+Sq[0][2],Sq[0][1]-Sq[0][3] ,3);
color_next(Sq[0][0] ,Sq[0][1]+Sq[0][3] ,4);
color_next(Sq[0][0] ,Sq[0][1]-Sq[0][3] ,5);
color_next(Sq[0][0]-Sq[0][2],Sq[0][1]+Sq[0][3] ,6);
color_next(Sq[0][0]-Sq[0][2],Sq[0][1] ,7);
color_next(Sq[0][0]-Sq[0][2],Sq[0][1]-Sq[0][3] ,8);
}
}
unsigned int RGB2HL(unsigned int R, unsigned int G, unsigned int B)
{
float RGB[3];
unsigned int max,min,H;
unsigned char i,j;
RGB[0] =R;
RGB[1] =G;
RGB[2] =B;
max = 0;
min = 0;
for(i=1;i<3;i++)
{
if(RGB[i]>RGB[max])
max=i;
if(RGB[i]<RGB[min])
min=i;
}
HSL_L = (RGB[max]+RGB[min])/62.0;
if(max==min)
return 0;
else if(max==0&&RGB[1]>=RGB[2])
{
HSL_H = 60.0*(RGB[1]-RGB[2])/(max-min);
return 0;
}
else if(max==0&&RGB[1]<RGB[2])
{
HSL_H = 60.0*(RGB[1]-RGB[2])/(RGB[max]-RGB[min])+360.0;
return 0;
}
else if(max==1)
{
HSL_H = 60.0*(RGB[2]-RGB[0])/(RGB[max]-RGB[min])+120.0;
return 0;
}
else if(max==2)
{
HSL_H = 60.0*(RGB[0]-RGB[1])/(RGB[max]-RGB[min])+240.0;
return 0;
}
return 1;
} |
|