標題:
攝像頭識別智能尋找中心按鍵觸發(fā)stm32源程序
[打印本頁]
作者:
batterman
時間:
2017-11-5 08:47
標題:
攝像頭識別智能尋找中心按鍵觸發(fā)stm32源程序
最近使用OV7670做了一個關于激光自動打靶報靶系統(tǒng),
不過只做了用攝像頭對靶心的識別。
取樣點過多
stm32單片機源程序如下:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"
#include "ov7670.h"
#include "usmart.h"
u16 i,shua1=0,shua2=0;
u16 aa=0,bb=0,lie=0,y=0,hang=0,x=0 ,a=0,b=0;
u16 zhongxin1=0,zhongxin2=0,zhongxin3=0,zhongxin4=0;
u32 u=0;
extern u8 ov_sta; //在exit.c里面定義
extern u8 ov_frame; //在timer.c里面定義
void swap (u16 *p1,u16 *p2)
{
u16 temp;
temp=*p1;
*p1=*p2;
*p2=temp ;
}
void camera_refresh(void)
{
u32 j;
u16 color;
if(ov_sta==2)
{
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++)
{
GPIOB->CRL=0X88888888;
OV7670_RCK=0;
color=OV7670_DATA; //讀數(shù)據(jù)
OV7670_RCK=1;
color<<=8;
OV7670_RCK=0;
color|=OV7670_DATA; //讀數(shù)據(jù)
OV7670_RCK=1;
GPIOB->CRL=0X33333333;
LCD_WR_DATA(color);
}
OV7670_CS=1;
OV7670_RCK=0;
OV7670_RCK=1;
EXTI->PR=1<<15; //清除LINE8上的中斷標志位
ov_sta=0; //開始下一次采集
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢復默認掃描方向
}
}
void fengge (void)
{
for(bb=2;bb<230;bb++)
{
for(aa=0;aa<239;aa++)
{
u= (LCD_ReadPoint(20,20)+LCD_ReadPoint(21,21)+LCD_ReadPoint(22,22)+LCD_ReadPoint(23,23)+LCD_ReadPoint(220,20)+LCD_ReadPoint(221,21)+LCD_ReadPoint(222,22)+LCD_ReadPoint(223,23)+LCD_ReadPoint(20,319)+LCD_ReadPoint(21,318)+LCD_ReadPoint(22,317)+LCD_ReadPoint(23,316)+LCD_ReadPoint(220,319)+LCD_ReadPoint(221,318)+LCD_ReadPoint(222,317)+LCD_ReadPoint(223,317) )/16;
if((LCD_ReadPoint(aa-2,bb)<(u-10000)))
{
if((LCD_ReadPoint(aa,bb)<(u-10000))) //白天45000
{
if((LCD_ReadPoint(aa+1,bb)<(u-10000))&&(LCD_ReadPoint(aa+2,bb)<(u-10000)))
{
POINT_COLOR=BLACK;
LCD_DrawPoint(aa,bb);
}
}
}
}
}
}
void fanfenge(void)
{
for(bb=0;bb<320;bb++) //210
{
for(aa=0;aa<239;aa++)
{
if(LCD_ReadPoint(aa,bb)>1000 )
{
POINT_COLOR=WHITE ;
LCD_DrawPoint(aa,bb);
}
}
}
if(LCD_ReadPoint(aa-1,bb)<1000 )
{
if(LCD_ReadPoint(aa+1,bb)<1000 )
{
POINT_COLOR=BLACK;
LCD_DrawPoint(aa,bb);
}
}
}
void huaxin(void)
{
for(bb=80;bb<160;bb=bb+15)
{
lie=0;
for(aa=0;aa<235;aa++)
{
/* POINT_COLOR=RED ;
LCD_ShowxNum(170,260,aa,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(170,280,bb,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(170,300,LCD_ReadPoint(aa,bb),8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(10,300,y,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(10,260,lie,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(90,300,LCD_ReadPoint(20,20),8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(90,280,LCD_ReadPoint(77,77),8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(90,260,u,8,16,0);//顯示2個數(shù)字 */
//LCD_DrawLine(20, 20, 25, 25); //畫線
// if(LCD_ReadPoint(aa-3,bb)>20000)
// {
// if(LCD_ReadPoint(aa-2,bb)>20000)
// {
if((LCD_ReadPoint(aa,bb)>20000)) //白天45000
{
if(LCD_ReadPoint(aa+1,bb)<(20000)&&(LCD_ReadPoint(aa+2,bb)<20000))
{ lie++; }
}
//}
// }
// if(lie>9)
// { y=bb; }
zhongxin3=lie;
if(zhongxin3>zhongxin4 )
{
swap(&zhongxin3,&zhongxin4);
y=bb;
}
}
}
for(a=80;a<200;a=a+20)
{
hang=0;
LED0=0;
for(b=0;b<230;b++)
{
/* POINT_COLOR=RED ;
LCD_ShowxNum(170,260,a,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(170,280,b,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(170,300,LCD_ReadPoint(a,b),8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(10,280,x,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(10,260,hang,8,16,0);//顯示2個數(shù)字
LCD_ShowxNum(10,300,y,8,16,0);//顯示2個數(shù)?
LCD_ShowxNum(90,260,u,8,16,0);//顯示2個數(shù)字
*/
if((LCD_ReadPoint(a,b-3)<(u-3000)))
{
if((LCD_ReadPoint(a,b-2)<(u-3000)))
{
if((LCD_ReadPoint(a,b)<(u-3000))) //50000
{
if((LCD_ReadPoint(a,b+1)>(u-3000))&&(LCD_ReadPoint(a,b+2)>(u-3000)))
{ hang++; }
}
}
}
// if(hang>9)
// { x=a; }
zhongxin1=hang;
if(zhongxin1>zhongxin2 )
{
swap(&zhongxin1,&zhongxin2);
x=a;
}
}
}
}
int main(void)
{
Stm32_Clock_Init(9); //系統(tǒng)時鐘設置
uart_init(72,9600); //串口初始化為9600
delay_init(72); //延時初始化
OV7670_Init();
LED_Init(); //初始化與LED連接的硬件接口
LCD_Init(); //初始化LCD
if(lcddev.id==0X6804) //強制設置屏幕分辨率為320*240.以支持3.5寸大屏
{
lcddev.width=240;
lcddev.height=320;
}
usmart_dev.init(72); //初始化USMART
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,"2012/10/31");
LCD_ShowString(60,130,200,200,16,"Use USMART To Set!");
LCD_ShowString(60,150,200,200,16,"OV7670 Init...");
while(OV7670_Init())//初始化OV7670
{
LCD_ShowString(60,150,200,200,16,"OV7670 Error!!");
delay_ms(200);
LCD_Fill(60,230,239,246,WHITE);
delay_ms(200);
}
LCD_ShowString(60,150,200,200,16,"OV7670 Init OK");
delay_ms(1500);
Timerx_Init(10000,7199); //TIM3,10Khz計數(shù)頻率,1秒鐘中斷
EXTI15_Init(); //使能定時器捕獲
OV7670_Window_Set(10,174,240,320); //設置窗口
OV7670_CS=0;
while(1)
{
camera_refresh(); //更新顯示
if(i!=ov_frame) //DS0閃爍.
{
i=ov_frame;
LED0=!LED0;
}
if(KEY0==0)
{
for(shua1=0;shua1<30000;shua1++)
{
for(shua2=0;shua2<10;shua2++)
{
camera_refresh();
if(i!=ov_frame)
{i=ov_frame;}
}
}
fengge();
fanfenge();
aa=0;
bb=0;
huaxin();
LCD_Fill(x,y,x+5,y+5,RED);
delay_ms(3000);
// while(1);
}
}
}
復制代碼
所有資料51hei提供下載:
智能尋找中心按鍵觸發(fā).zip
(131.96 KB, 下載次數(shù): 17)
2017-11-5 08:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
qkl189
時間:
2019-8-6 15:31
感謝樓主分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1