|
发表于 2013-8-3 12:04:46
|
显示全部楼层
kayatsl 发表于 2013-7-9 22:22
看描述多半是程序有bug... 多检查检查
师兄,又有问题需要请教,就是我现在调试色块跟踪求RGB均值在画红色十字的时候会对读点产生干扰,我用的方法是读取一个点的RGB存储,再打红点,直到这个方向上出现RGB跳变,这样会出读出来的RGB一直都是红色的情况,后来我把打点的坐标左移了一位,RGB应该是对了,但是干扰还是明显存在,但是只读取点RGB不打点就稳定的多,但是那样就看不到十字了,也看不到到底跟踪到哪里了,不知道师兄是怎么处理的,下面是读点打点的代码
u8 L=0,R=0,U=0,D=0;//左 右 上 下像素点数目
u8 num=0,i;//总点数
u16 sum;//求和
u16 y_u,y_d,x_l,x_r;//上下左右凹槽坐标
COLOR_RGB RGB_X;//当前读取点的RGB分量
//向上读取
for(U=0;U<256;U++)
{
Read_RGBPoint(x,(y-U),&RGB_X);
if((RGB_X.red<10)&&(RGB_X.green<29)&&(RGB_X.blue<19))
{
break;//有跳变退出当前循环
}
RGB_R[U]=RGB_X.red;//存储RGB分量
RGB_G[U]=RGB_X.green;
RGB_B[U]=RGB_X.blue;
LCD_DrawPoint((x-1),(y-U));//打点
//LCD_Fast_DrawPoint((x-1),(y-U),RED);
}
y_u=y-U;//凹槽坐标
p[0]=U;//中心点到凹槽长度
num+=U;//计算总点数
//向下读取
for(D=0;D<256;D++)
{
Read_RGBPoint(x,(y+D),&RGB_X);
if((RGB_X.red<10)&&(RGB_X.green<29)&&(RGB_X.blue<19))
{
break;//有跳变退出当前循环
}
RGB_R[(num+D)]=RGB_X.red;//存储RGB分量
RGB_G[(num+D)]=RGB_X.green;
RGB_B[(num+D)]=RGB_X.blue;
LCD_DrawPoint((x-1),(y+D));//打点
}
y_d=y+D;//凹槽坐标
p[1]=D;//中心点到凹槽长度
num+=D;//计算总点数
//向左读取
for(L=0;L<256;L++)
{
Read_RGBPoint((x-L),y,&RGB_X);
if((RGB_X.red<10)&&(RGB_X.green<29)&&(RGB_X.blue<19))
{
break;//有跳变退出当前循环
}
RGB_R[(num+L)]=RGB_X.red;//存储RGB分量
RGB_G[(num+L)]=RGB_X.green;
RGB_B[(num+L)]=RGB_X.blue;
LCD_DrawPoint((x-L),(y-1));//打点
}
x_l=x-L;//凹槽坐标
p[2]=L;//中心点到凹槽长度
num+=L;//计算总点数
//向右读取
for(R=0;R<256;R++)
{
Read_RGBPoint((x+R),y,&RGB_X);
if((RGB_X.red<10)&&(RGB_X.green<29)&&(RGB_X.blue<19))
{
break;//有跳变退出当前循环
}
RGB_R[(num+R)]=RGB_X.red;//存储RGB分量
RGB_G[(num+R)]=RGB_X.green;
RGB_B[(num+R)]=RGB_X.blue;
LCD_DrawPoint((x+R),(y-1));//打点
}
x_r=x+R;//凹槽坐标
p[3]=R;//中心点到凹槽长度
num+=R;//计算总点数
//计算中心点坐标
x_n=(x_l+x_r)>>1;
y_n=(y_u+y_d)>>1;
//滤波
RGBfilter(RGB_R,num,90);//,信任系数(70%)
RGBfilter(RGB_G,num,90);//信任系数(70%)
RGBfilter(RGB_B,num,90);//信任系数(70%)
//计算RGB色值
for(i=0;i<num;i++) sum+=RGB_R;
RGB_X.red=sum/num;
sum=0;//清零
for(i=0;i<num;i++) sum+=RGB_G;
RGB_X.green=sum/num;
sum=0;//清零
for(i=0;i<num;i++) sum+=RGB_B;
RGB_X.blue=sum/num;
sum=0;//清零
//RGB三基色分量显示
LCD_ShowNum(0,0,RGB_X.red,3,16);//R
LCD_ShowNum(28,0,RGB_X.green,3,16);//G
LCD_ShowNum(56,0,RGB_X.blue,3,16);//B |
|