论坛大神
  
- 积分
- 2020
- 金钱
- 2020
- 注册时间
- 2013-5-1
- 在线时间
- 87 小时
|
发表于 2013-7-31 09:07:58
|
显示全部楼层
void camera_refresh(void)
{
u32 j; //循环采样76800像素点
u16 color,last_color;//像素点数据
u16 R,G,B; //RGB三基色
u8 x,y; //x,y坐标
u8 m,k; //中位值滤波参数
u8 temp; //中位值滤波参数
// u16 Left_Frame_y[240];//图像左边框像素点的y坐标
u16 Left_Frame_x[240];//图像左边框像素点的x坐
Xmin=320; //对最小值复位
Xmax=0; //对最大值复位
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;
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((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最小值
}
}
LCD_WR_DATA(color); //LCD写点
last_color=color; //记下显示过的一个像素点
}
for(m=40; m<40+N-1; m++) //采样值由小到大排列
{
for(k=0; k<40+N-m-1; k++)
{
if(Left_Frame_x[k]>Left_Frame_x[k+1])
{
temp=Left_Frame_x[k];
Left_Frame_x[k]=Left_Frame_x[k+1];
Left_Frame_x[k+1]=temp;
} //此处采用中位值滤波,取40至50行的图像左边框像素点的x坐标
}
}
// printf("Xmid=%d \n",Left_Frame_x[(40+N-1)/2]); //打印
OV7670_CS=1;
OV7670_RCK=0;
OV7670_RCK=1;
EXTI-> R=1<<15; //清除LINE8上的中断标志位
ov_sta=0; //开始下一次采集
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
}
这是自己弄的代码,摄像头引脚我改掉了,所以程序中的PB口低八位的方向切换就删了,数据处理多的时候就会灰屏,复位下就好,但是很快又卡了...谢原子哥帮忙分析 |
|