论坛大神
  
- 积分
- 2020
- 金钱
- 2020
- 注册时间
- 2013-5-1
- 在线时间
- 87 小时
|
发表于 2013-8-2 10:00:02
|
显示全部楼层
//更新LCD显示,数据处理
void camera_refresh(void)
{
u32 j; //循环采样76800像素点
u16 color,last_color;//像素点数据
u16 R,G,B; //RGB三基色
u8 x,y; //x,y坐标
// u8 Left_Frame_y[240];//图像左边框像素点的y坐标
u16 Left_Frame_x[240];//图像左边框像素点的x坐 标
if(ov_sta==2)
{
a++;
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
LCD_SetCursor(0x00,0x0000); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
OV7670_CS=0;
OV7670_RRST=0; //开始复位读指针
OV7670_RCK=0;
OV7670_RCK=1;
OV7670_RCK=0;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK=1;
Xmin=320; //对最小值复位
Xmax=0; //对最大值复位
for(j=0;j<76800;j++)
{
OV7670_RCK=0;
color=OV7670_DATA; //读数据
OV7670_RCK=1;
color<<=8;
OV7670_RCK=0;
color|=OV7670_DATA; //读数据
OV7670_RCK=1;
R=color>>11;
G=(color&0x07E0)>>5;
B=(color&0x001F);
x=j%320; //求x,y坐标
y=j/320;
// if(Judge_Green) color=GREEN; //检测绿色
// if(Judge_Red) color=RED; //检测红色
// if(Judge_Blue) color=BLUE; //检测蓝色
// else color=WHITE; //白色
if((R<0X0015)&&(B<0X0015)&&(G<0X0015)) color=0x0000; //检测黑色
else color=WHITE; //白色
if((last_color==WHITE)&&(color==BLACK))//检测图像最左边的边框像素点
{
if (Left_Frame_x[y]==0)
{
Left_Frame_x[y]=x; //储存每一行的左边框处x坐标
color=RED;
if(Xmax<Left_Frame_x[y]) Xmax=Left_Frame_x[y];//求出x最大值
if(Xmin>Left_Frame_x[y]) Xmin=Left_Frame_x[y];//求出x最小值
}
}
// printf("R=%d G=%d B=%d \n",R,G,B); //打印出三基色
LCD_WR_DATA(color); //LCD写点
last_color=color; //记下显示过的一个像素点
}
OV7670_CS=1;
OV7670_RCK=0;
OV7670_RCK=1;
EXTI-> R=1<<10; //清除LINE8上的中断标志位
ov_sta=0; //开始下一次采集
ov_frame++;
// LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
//此处一帧图像写完,下面为数据处理部分
////////////////////算法部分////////////////////////////
/* if((Xmax!=0))
{
printf("Xmax=%d Xmin=%d\n",Xmax,Xmin); //打印出左边框x,y坐标最大值,最小值
} */
buffer[0]=Left_Frame_x[30];
buffer[1]=Left_Frame_x[60];
buffer[2]=Left_Frame_x[90];
buffer[3]=Left_Frame_x[120];
buffer[4]=Left_Frame_x[150];
buffer[5]=Left_Frame_x[180];
buffer[6]=Left_Frame_x[211];
tt= judge(buffer);
memset(Left_Frame_x,0,480) ;// 清除Left_Frame_x数组的空间
/* switch (tt)
{
case 1 CD_ShowString(60,150,200,200,16,"Square");break;
case 2 CD_ShowString(60,150,200,200,16,"Triangle");break;
case 3 CD_ShowString(60,150,200,200,16,"Cross");break;
case 4 CD_ShowString(60,150,200,200,16,"Circle");break;
default:break;
} */
// printf("Image=%d\n",tt);
/* printf("X[30]=%d\n",Left_Frame_x[30]); //打印出左边框30行的x坐标
printf("X[60]=%d\n",Left_Frame_x[60]); //打印出左边框30行的x坐标
printf("X[90]=%d\n",Left_Frame_x[90]); //打印出左边框30行的x坐标
printf("X[120]=%d\n",Left_Frame_x[120]); //打印出左边框30行的x坐标
printf("X[150]=%d\n",Left_Frame_x[150]); //打印出左边框30行的x坐标
printf("X[180]=%d\n",Left_Frame_x[180]); //打印出左边框30行的x坐标
printf("X[211]=%d\n",Left_Frame_x[211]); //打印出左边框30行的x坐标 */
}
u8 judge(u16 acqure[])
{
u8 index=0;
int buf[6]=0;
u8 zheng=0,sanjiao=0;
for(index=0;index<6;index++)
{
buf[index]=acqure[index+1]-acqure[index];
if((abs(buf[index])<8))
zheng++;
if((buf[index]<25)&&(buf[index]>0)) //OK
sanjiao++;
}
/* printf("b0=%d\n",buf[0]);
printf("b1=%d\n",buf[1]);
printf("b2=%d\n",buf[2]);
printf("b3=%d\n",buf[3]);
printf("b4=%d\n",buf[4]);
printf("b5=%d\n",buf[5]); */
if(zheng>4)
return 1; //正方形
if(sanjiao>4)
return 2; //三角形
if((buf[0]<10)&&(buf[5]<10)&&(buf[2]<-70)||(buf[0]<10)&&(buf[5]<10)&&(buf[4]>70))
return 3; //十字架
if((buf[0]<0)&&(buf[1]<0)&&(buf[2]<0)&&(buf[3]>0)&&(buf[4]>0)&&(buf[5]>0)&&(abs (buf[1]))<40&&(abs (buf[4]))<40)
return 4; //圆形
} |
|