2017年全国大学生电子设计竞赛(预测题)-单一物体识别(基于STM32和OV7670)
大部分板球系统都是使用图像识别小球的轨迹来控制电机保持平板平衡,故我们也是采用该模式来进行的图像识别的。
OV7670 模块简介--(源自ALIENTEK)
OV7670 是OV(OmniVision)公司生产的一颗1/6 寸的 CMOS VGA 图像传感器。该传感器体积小、工作电压低,提供单片VGA 摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8 位影像数据。该产品VGA图像最高达到30 帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、度、色度等都可以通过SCCB 接口编程。OmmiVision 图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。
源码--(基于ALIENTEK修改)
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "usmart.h"
#include "lcd.h"
#include "ov7670.h"
#include "exti.h"
#include "timer.h"
#include "color.h"
extern u8 ov_sta;
extern u8 ov_frame;
void camera_refresh(void)
{
u32 j;
u16 color;
if(ov_sta==2)
{
LCD_Scan_Dir(U2D_L2R);
LCD_SetCursor(0x00,0x0000);
LCD_WriteRAM_Prepare();
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++)
{
GPIOB->CRL=0X88888888;
OV7670_RCK=0;
color=OV7670_DATA;
OV7670_RCK=1;
color<<=8;
OV7670_RCK=0;
color|=OV7670_DATA;
OV7670_RCK=1;
GPIOB->CRL=0X33333333;
LCD_WR_DATA(color);
}
OV7670_CS=1;
OV7670_RCK=0;
OV7670_RCK=1;
EXTI->PR=1<<15;
ov_sta=0;
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR);
if(Trace(&condition, &result))
{
POINT_COLOR=RED;
LCD_DrawRectangle( result.x-result.w/2, result.y-result.h/2, result.x-result.w/2+result.w, result.y-result.h/2+result.h);
LCD_DrawRectangle( result.x-2, result.y-2,result.x+2, result.y+2);
}
}
}
int main(void)
{
u8 i;
u8 lightmode=0,saturation=2,contrast=2;
u8 tm=0;
u8 msgbuf[15];
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600);
OV7670_Init();
LED_Init();
LCD_Init();
if(lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963)
{
lcddev.width=240;
lcddev.height=320;
}
usmart_dev.init(72);
POINT_COLOR=RED;
LCD_ShowString(60,50,200,200,16,"Mini STM32");
LCD_ShowString(60,70,200,200,16,"OV7670 TEST");
LCD_ShowString(60,90,200,200,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,200,16,"2014/3/27");
LCD_ShowString(60,130,200,200,16,"Use USMART To Set!");
LCD_ShowString(60,150,200,200,16,"OV7670 Init...");
while(OV7670_Init())
{
LCD_ShowString(60,150,200,200,16,"OV7670 Error!!");
delay_ms(200);
LCD_Fill(60,150,239,166,WHITE);
delay_ms(200);
}
LCD_ShowString(60,150,200,200,16,"OV7670 Init OK");
delay_ms(1500);
TIM3_Int_Init(10000,7199);
EXTI15_Init();
OV7670_Window_Set(10,174,240,320);
OV7670_CS=0;
LCD_Clear(BLACK);
while(1)
{ POINT_COLOR=BLUE;
camera_refresh();
if(tm)
{
LCD_ShowString((lcddev.width-240)/2+30,(lcddev.height-320)/2+60,200,16,16,msgbuf);
tm--;
}
if(i!=ov_frame)
{
i=ov_frame;
LED0=!LED0;
}
}
}
效果图