• 基于STM32人脸识别系统方案设计(程序代码+设计说明书)


    基于STM32人脸识别系统方案设计(程序代码+设计说明书)


    程序编译器:keil 5

    编程语言:C语言

    设计编号:C0058

    设计介绍

    采用正点原子探索者开发板;

    摄像头选用OV2640

    可实现功能:可以实现进入页面的设定自定义DIY;

    可以自由的添加需要识别的人脸;

    人脸靠近,按下识别按键可以实现人脸识别。如果在系统库中会提示是那个人,如果不在会提示不在库中。

    温馨提醒:本历程需要使用SD卡,相关文件会出存在SD卡中,同时人脸识别在ARM上属于阉割版本,准确率不能达到100%。

    资料包括:

    系统设计实物图(使用组件直接组装即可)

    程序代码

    设计论文

    img

    程序

    img

    CV2640驱动

    #include "sys.h"
    #include "ov2640.h"
    #include "ov2640cfg.h"
    #include "timer.h"	  
    #include "delay.h"
    #include "usart.h"			 
    #include "sccb.h"	
    #include "exti.h"  
    
    //初始化OV2640 
    //配置完以后,默认输出是1600*1200尺寸的图片!! 
    //返回值:0,成功
    //    其他,错误代码
    u8 OV2640_Init(void)
    { 
    	u16 i=0;
    	u16 reg;
    	//设置IO     	
      	RCC->AHB1ENR|=1<<6;		//使能外设PORTG时钟    
     	GPIO_Set(GPIOG,PIN9|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);	//PG9,15推挽输出
     	OV2640_PWDN=0;	//POWER ON
    	delay_ms(10);
    	OV2640_RST=0;	//复位OV2640
    	delay_ms(10);
    	OV2640_RST=1;	//结束复位 
      	SCCB_Init();        		//初始化SCCB 的IO口	 
    	SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01);	//操作sensor寄存器
     	SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80);	//软复位OV2640
    	delay_ms(50); 
    	reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH);	//读取厂家ID 高八位
    	reg<<=8;
    	reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL);	//读取厂家ID 低八位
    	if(reg!=OV2640_MID)
    	{
    		printf("MID:%d\r\n",reg);
    		return 1;
    	}
    	reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH);	//读取厂家ID 高八位
    	reg<<=8;
    	reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL);	//读取厂家ID 低八位
    	if(reg!=OV2640_PID)
    	{
    		printf("HID:%d\r\n",reg);
    		//return 2;
    	}   
     	//初始化 OV2640,采用SXGA分辨率(1600*1200)  
    	for(i=0;i>2);			//设置Vref的start高8位
    	SCCB_WR_Reg(0X1A,endy>>2);			//设置Vref的end的高8位
    	
    	temp=SCCB_RD_Reg(0X32);				//读取Href之前的值
    	temp&=0XC0;
    	temp|=((endx&0X07)<<3)|(sx&0X07);
    	SCCB_WR_Reg(0X32,temp);				//设置Href的start和end的最低3位
    	SCCB_WR_Reg(0X17,sx>>3);			//设置Href的start高8位
    	SCCB_WR_Reg(0X18,endx>>3);			//设置Href的end的高8位
    }
    //设置图像输出大小
    //OV2640输出图像的大小(分辨率),完全由该函数确定
    //width,height:宽度(对应:horizontal)和高度(对应:vertical),width和height必须是4的倍数
    //返回值:0,设置成功
    //    其他,设置失败
    u8 OV2640_OutSize_Set(u16 width,u16 height)
    {
    	u16 outh;
    	u16 outw;
    	u8 temp; 
    	if(width%4)return 1;
    	if(height%4)return 2;
    	outw=width/4;
    	outh=height/4; 
    	SCCB_WR_Reg(0XFF,0X00);	
    	SCCB_WR_Reg(0XE0,0X04);			
    	SCCB_WR_Reg(0X5A,outw&0XFF);		//设置OUTW的低八位
    	SCCB_WR_Reg(0X5B,outh&0XFF);		//设置OUTH的低八位
    	temp=(outw>>8)&0X03;
    	temp|=(outh>>6)&0X04;
    	SCCB_WR_Reg(0X5C,temp);				//设置OUTH/OUTW的高位 
    	SCCB_WR_Reg(0XE0,0X00);	
    	return 0;
    }
    //设置图像开窗大小
    //由:OV2640_ImageSize_Set确定传感器输出分辨率从大小.
    //该函数则在这个范围上面进行开窗,用于OV2640_OutSize_Set的输出
    //注意:本函数的宽度和高度,必须大于等于OV2640_OutSize_Set函数的宽度和高度
    //     OV2640_OutSize_Set设置的宽度和高度,根据本函数设置的宽度和高度,由DSP
    //     自动计算缩放比例,输出给外部设备.
    //width,height:宽度(对应:horizontal)和高度(对应:vertical),width和height必须是4的倍数
    //返回值:0,设置成功
    //    其他,设置失败
    u8 OV2640_ImageWin_Set(u16 offx,u16 offy,u16 width,u16 height)
    {
    	u16 hsize;
    	u16 vsize;
    	u8 temp; 
    	if(width%4)return 1;
    	if(height%4)return 2;
    	hsize=width/4;
    	vsize=height/4;
    	SCCB_WR_Reg(0XFF,0X00);	
    	SCCB_WR_Reg(0XE0,0X04);					
    	SCCB_WR_Reg(0X51,hsize&0XFF);		//设置H_SIZE的低八位
    	SCCB_WR_Reg(0X52,vsize&0XFF);		//设置V_SIZE的低八位
    	SCCB_WR_Reg(0X53,offx&0XFF);		//设置offx的低八位
    	SCCB_WR_Reg(0X54,offy&0XFF);		//设置offy的低八位
    	temp=(vsize>>1)&0X80;
    	temp|=(offy>>4)&0X70;
    	temp|=(hsize>>5)&0X08;
    	temp|=(offx>>8)&0X07; 
    	SCCB_WR_Reg(0X55,temp);				//设置H_SIZE/V_SIZE/OFFX,OFFY的高位
    	SCCB_WR_Reg(0X57,(hsize>>2)&0X80);	//设置H_SIZE/V_SIZE/OFFX,OFFY的高位
    	SCCB_WR_Reg(0XE0,0X00);	
    	return 0;
    } 
    //该函数设置图像尺寸大小,也就是所选格式的输出分辨率
    //UXGA:1600*1200,SVGA:800*600,CIF:352*288
    //width,height:图像宽度和图像高度
    //返回值:0,设置成功
    //    其他,设置失败
    u8 OV2640_ImageSize_Set(u16 width,u16 height)
    { 
    	u8 temp; 
    	SCCB_WR_Reg(0XFF,0X00);			
    	SCCB_WR_Reg(0XE0,0X04);			
    	SCCB_WR_Reg(0XC0,(width)>>3&0XFF);		//设置HSIZE的10:3位
    	SCCB_WR_Reg(0XC1,(height)>>3&0XFF);		//设置VSIZE的10:3位
    	temp=(width&0X07)<<3;
    	temp|=height&0X07;
    	temp|=(width>>4)&0X80; 
    	SCCB_WR_Reg(0X8C,temp);	
    	SCCB_WR_Reg(0XE0,0X00);				 
    	return 0;
    }
    //
    //设置OV2640为SVGA模式
    void OV2640_Set_Svga_Mode(void)
    {
    	u16 i;
    	OV2640_PWDN=0;	//POWER ON
    	delay_ms(10);
    	OV2640_RST=0;	//复位OV2640
    	delay_ms(10);
    	OV2640_RST=1;	//结束复位 
      	SCCB_Init();        		//初始化SCCB 的IO口	 
    	SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01);	//操作sensor寄存器
     	SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80);	//软复位OV2640
    	delay_ms(50); 
     	//初始化 OV2640,采用SXGA分辨率(800*600)  
    	for(i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415

    main函数

    #include "sys.h"
    #include "delay.h"  
    #include "usart.h"   
    #include "led.h"
    #include "lcd.h"
    #include "key.h"  
    #include "usmart.h"   
    #include "sram.h" 
    #include "malloc.h" 
    #include "w25qxx.h"    
    #include "sdio_sdcard.h"
    #include "ff.h"  
    #include "exfuns.h"    
    #include "fontupd.h"
    #include "text.h"	
    #include "piclib.h"	
    #include "string.h"	
    #include "math.h"	
    #include "dcmi.h"	
    #include "ov2640.h"	
    #include "beep.h"	
    #include "timer.h"
    #include "atk_frec.h"
     
    int reg_time;
    u8 ov2640_mode=0;						//工作模式:0,RGB565模式;1,JPEG模式
    
    //得到path路径下,目标文件的总个数
    //path:路径		    
    //返回值:总有效文件数
    u16 pic_get_tnum(u8 *path)
    {	  
    	u8 res;
    	u16 rval=0;
     	DIR tdir;	 		//临时目录
    	FILINFO tfileinfo;	//临时文件信息	
    	u8 *fn;	 			 			   			     
        res=f_opendir(&tdir,(const TCHAR*)path); 	//打开目录
      	tfileinfo.lfsize=_MAX_LFN*2+1;				//长文件名最大长度
    	tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize);//为长文件缓存区分配内存
    	if(res==FR_OK&&tfileinfo.lfname!=NULL)
    	{
    		while(1)//查询总的有效文件数
    		{
    	        res=f_readdir(&tdir,&tfileinfo);       		//读取目录下的一个文件
    	        if(res!=FR_OK||tfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
         		fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);			 
    			res=f_typetell(fn);	
    			if((res&0XF0)==0X50)//取高四位,看看是不是图片文件	
    			{
    				rval++;//有效文件数增加1
    			}	    
    		}  
    	} 
    	return rval;
    }
    
     
     
    //处理JPEG数据
    //当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
    void jpeg_data_process(void)
    { 
    	if(ov2640_mode)//只有在JPEG格式下,才需要做处理.
    	{ 
    	}
    } 
    //切换为OV2640模式
    void sw_ov2640_mode(void)
    {
    	OV2640_PWDN=0;//OV2640 Power Up
    	//GPIOC8/9/11切换为 DCMI接口
     	GPIO_AF_Set(GPIOC,8,13);	//PC8,AF13  DCMI_D2
     	GPIO_AF_Set(GPIOC,9,13);	//PC9,AF13  DCMI_D3
     	GPIO_AF_Set(GPIOC,11,13);	//PC11,AF13 DCMI_D4  
    } 
    //切换为SD卡模式
    void sw_sdcard_mode(void)
    {
    	OV2640_PWDN=1;//OV2640 Power Down 
    	//GPIOC8/9/11切换为 SDIO接口
      	GPIO_AF_Set(GPIOC,8,12);	//PC8,AF12
     	GPIO_AF_Set(GPIOC,9,12);	//PC9,AF12 
     	GPIO_AF_Set(GPIOC,11,12);	//PC11,AF12  
    } 
    
    // 
    //LCD显示区域限制参数
    u16 face_offx,face_offy;
    u16 face_xsize,face_ysize; 
    
    u8 fontsize=12;		//字体大小
    
    //设置图像到屏幕最中心.
    void set_image_center(void)
    {
    	face_offx=0;
    	face_offy=0;
    	face_xsize=lcddev.width;
    	face_ysize=lcddev.height;
    	if(lcddev.id==0X1963||lcddev.id==0X5510)
    	{ 
    		face_offy=80;
    		face_ysize=640;
    		fontsize=24;
    	}else if(lcddev.id==0X5310)
    	{
    		face_offx=10;
    		face_offy=40;
    		face_xsize=300;
    		face_ysize=400;
    		fontsize=16;
    	}else fontsize=12;
    	LCD_Set_Window(face_offx,face_offy,face_xsize,face_ysize);	//设置开窗口.  
    }
    
    //读取原始图片数据
    //dbuf:数据缓存区
    //xoff,yoff:要读取的图像区域起始坐标
    //xsize:要读取的图像区域宽度
    //width:要读取的宽度(宽高比恒为3:4)  
    void frec_get_image_data(u16 *dbuf,u16 xoff,u16 yoff,u16 xsize,u16 width)
    {
    	int w, h; 
    	u16 height=width*4/3;
    	float scale=(float)xsize/width;
    	for(h=0;h1)return;
    	if(lcddev.width==240)
    	{ 
    		Show_Str(10,lcddev.height-(2-line)*fontsize-(2-line)*5,lcddev.width,fontsize,str,fontsize,0);
    	}else
    	{
    		Show_Str(10,lcddev.height-(2-line)*fontsize-(2-line)*(face_offy-fontsize*2)/3,lcddev.width,fontsize,str,fontsize,1);		
    	} 
    }	
    
    u16 * pixdatabuf; 			//图像缓存
    
    int main(void)
    {        
    	u8 res;							  
    	u8 key;					//键值		
    	u8 key_first;
    	u8 i;						 
     	u8 msgbuf[30];			//消息缓存区 
    	u8 person;
    //***********初始化界面相关的显示变量**********//
     	DIR picdir;	 		//图片目录
    	FILINFO picfileinfo;//文件信息
    	u8 *fn;   			//长文件名
    	u8 *pname;			//带路径的文件名
    	u16 totpicnum; 		//图片文件总数
    	u16 curindex;		//图片当前索引
    	u8 pause=0;			//暂停标记
    	u8 t;
    	u16 temp;
    	u16 *picindextbl;	//图片索引表  
    
    	Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz 
    	delay_init(168);			//延时初始化  
    	uart_init(84,115200);		//初始化串口波特率为115200 
    	LED_Init();					//初始化LED 
    	usmart_dev.init(84);		//初始化USMART
    	TIM3_Int_Init(100-1,8400-1);//10Khz计数,10ms中断一次
     	LCD_Init();					//LCD初始化  
    	FSMC_SRAM_Init();			//初始化外部SRAM.
     	BEEP_Init();				//蜂鸣器初始化
     	KEY_Init();					//按键初始化   
    	W25QXX_Init();				//初始化W25Q128 
    	my_mem_init(SRAMIN);		//初始化内部内存池 
    	my_mem_init(SRAMEX);		//初始化内部内存池  
    	my_mem_init(SRAMCCM);		//初始化CCM内存池 
    	exfuns_init();				//为fatfs相关变量申请内存  
      f_mount(fs[0],"0:",1); 		//挂载SD卡  
      f_mount(fs[1],"1:",1); 		//挂载SPI FLASH
    	POINT_COLOR=RED; 
    	while(font_init()) 			//检查字库
    	{	    
    		LCD_ShowString(30,50,200,16,16,"Font Error!");
    		delay_ms(200);				  
    		LCD_Fill(30,50,240,66,WHITE);//清除显示	     
    		delay_ms(200);				  
    	}
    	while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
     	{	    
    		Show_Str(30,170,240,16,"PICTURE文件夹错误!",16,0);
    		Show_Str(30,190,240,16,"原因可能是SD卡没有插好",16,0);
    		delay_ms(200);				  
    		LCD_Fill(30,170,240,186,WHITE);//清除显示	     
    		delay_ms(200);				  
    	}  
    	totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
      	while(totpicnum==NULL)//图片文件为0		
     	{	    
    		Show_Str(30,170,240,16,"没有图片文件!",16,0);
    		delay_ms(200);				  
    		LCD_Fill(30,170,240,186,WHITE);//清除显示	     
    		delay_ms(200);				  
    	}
    	picfileinfo.lfsize=_MAX_LFN*2+1;						//长文件名最大长度
    	picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize);	//为长文件缓存区分配内存
     	pname=mymalloc(SRAMIN,picfileinfo.lfsize);				//为带路径的文件名分配内存
     	picindextbl=mymalloc(SRAMIN,2*totpicnum);				//申请2*totpicnum个字节的内存,用于存放图片索引
     	while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错
     	{	    
    		Show_Str(30,170,240,16,"内存分配失败!",16,0);
    		delay_ms(200);				  
    		LCD_Fill(30,170,240,186,WHITE);//清除显示	     
    		delay_ms(200);				  
    	}
    	//记录索引
      res=f_opendir(&picdir,"0:/PICTURE"); //打开目录
    	if(res==FR_OK)
    	{
    		curindex=0;//当前索引为0
    		while(1)//全部查询一遍
    		{
    			temp=picdir.index;								//记录当前index
    	    res=f_readdir(&picdir,&picfileinfo);       		//读取目录下的一个文件
    	    if(res!=FR_OK||picfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
         	fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);			 
    			res=f_typetell(fn);	
    			if((res&0XF0)==0X50)//取高四位,看看是不是图片文件	
    			{
    				picindextbl[curindex]=temp;//记录索引
    				curindex++;
    			}	    
    		} 
    	}   
    	delay_ms(100);
    	piclib_init();										//初始化画图	   	   
    	curindex=0;											  //从0开始显示
      res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); 	//打开目录
    	if(res==FR_OK)//打开成功
    	{	
    		dir_sdi(&picdir,picindextbl[curindex]);			//改变当前目录索引	   
        res=f_readdir(&picdir,&picfileinfo);       		//读取目录下的一个文件
        fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);			 
    		strcpy((char*)pname,"0:/PICTURE/");				  //复制路径(目录)
    		strcat((char*)pname,(const char*)fn);  			//将文件名接在后面
     		LCD_Clear(BLACK);
     		ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片    
        res = 0;		
    	}
    	delay_ms(1000); 	
    	myfree(SRAMIN,picfileinfo.lfname);	//释放内存			    
    	myfree(SRAMIN,pname);				//释放内存			    
    	myfree(SRAMIN,picindextbl);			//释放内存 
    	
    	Show_Str(170,700,240,24,"Init....",24,1);
      LCD_Fill(170,700,240,24,BLACK);		   				//填充单色
    	
    	key_first = 0;
    	while(SD_Init())//检查SD卡
    	{	     
    		Show_Str(30,190,240,16,"SD Card Error!",16,0);
    		delay_ms(200);
    	  LCD_Fill(30,190,239,206,WHITE);
    		delay_ms(200);			  
    	}   	  
    	while(OV2640_Init())//初始化OV2640
    	{
    		Show_Str(30,190,240,16,"OV2640 错误!",16,0);
    		delay_ms(200);
    	  LCD_Fill(30,190,239,206,WHITE);
    		delay_ms(200);
    	}
    	pixdatabuf=mymalloc(SRAMIN,ATK_GABOR_IMG_WID*ATK_GABOR_IMG_HEI*2);	//申请内存
    	delay_ms(10);
     	OV2640_RGB565_Mode();	//RGB565输出
    	OV2640_ImageWin_Set((1600-900)/2,0,900,1200);//设置输出尺寸为:900*1200,3:4比例
     	DCMI_Init();			//DCMI配置
    	DCMI_DMA_Init((u32)&LCD->LCD_RAM,0,1,1,0);//DCMI DMA配置
    	
    	Show_Str(170,700,240,24,"Init Sucess!",24,1);
      LCD_Fill(170,700,240,24,BLACK);		   				//填充单色
    	delay_ms(300); 
    	Show_Str(170,730,240,24,"按任意键进入",24,1);
      LCD_Fill(170,730,240,24,BLACK);		   				//填充单色
    	
    while(key_first==0)	
    	{
    		key_first = KEY_Scan(0);//不支持连按
    		delay_ms(10); 	
      }
    	
    	
    	LCD_Clear(BLACK);
    	set_image_center();		//设置到屏幕正中央
    	frec_load_ui(fontsize);	//显示GUI 
     	OV2640_OutSize_Set(face_xsize,face_ysize); 
    	sw_sdcard_mode();		//SD卡模式 
    	res=atk_frec_initialization();	//初始化人脸识别
    	if(res)
    	{
    		printf("atk_frec_initialization error:%d\r\n",res);//打印错误代码
    	} 
    	sw_ov2640_mode();	//2640模式
    	DCMI_Start();		//启动传输 
    	while(1)
    	{	 
    		delay_ms(10);
     		key=KEY_Scan(0);//不支持连按
    		if(key)
    		{
    			DCMI_Stop();		//停止传输 
    			sw_sdcard_mode();	//SD卡模式
    			switch(key)
    			{
    				case KEY2_PRES: //删除所有模板
     					sprintf((char*)msgbuf,"正在删除...");
    					frec_show_msg(msgbuf,0);	 			    	 
    					for(i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413

    设计说明书:

    img

    1.2人脸识别系统的研究现状

    在世界范围内,基于人脸生物特征信息的身份识别已经得到应用在众多领域,并且发挥着至关重要的作用。早在1996年,英国的Bresso著名学者已经开始对人脸技术的学习和深入研究。到了21世纪,基于人脸生物特征信息技术已经突飞猛进,并朝着精度更高,运用领域更广的方向迈进。

    1.2.1 国内发展概况

    在华夏大地,脸生物特征信息的身份识别技术的研究始于20世纪80年代。自清华大学、北京理工大学和自动化学院等高校的众多科研人员正在进行面部识别学习研究。国内研究主要从以下三个方面进行:

    1)针对人脸的几何特征识别方法;

    2)针对关于代数特征的正面自动识别方法;

    3)针对人脸连接机制的识别方法。

    这些年,计算机硬件性能也时日益提高,各类监控系统飞速发展。为了区分越来越复杂的监控背景,各种高精度的背景监控系统被研制出来。商业、国防安全和军事等高端领域的特殊需求,高精度高要求的监控系统应运而生并日益增加。在如此强大需求背景下,基于人脸生物特征信息技术引发了许多国家的热情和关注,掀起了新一代的科技风暴狂潮。我们国家投入巨资资金和大量科研人员日以及让地开展深入的学习研究。

    1.2.2 国外发展概况

    就世界方面来说,基于人脸生物特征信息的身份识别别技术研究开始于1966年。国外著名的研究机构有:PRI的Bledsoe、美国国防部、美国陆军研究所、卡内基梅隆大学为首、东京大学、雷丁大学、麻省理工学院等国外的一些高校,还有某些科研公司的工程研究中心。这些研究机构的工作重心放在刑侦、国家安全方面,而在考试验证系统的方面深入研究很少。据阅读外国近几年的科研文献总结,国外的科研机构主要从事9个方面研究:颜色识别法、形状研究法、模板匹配法、例子学习法、神经网络法、隐马尔可夫模型法、人脸图像识别法。

    1.3 本论文的内容

    1.采用STM32单片机进行硬件电路设计以及软件程序设计;

    2.学会串行端口的使用,并使用串行端口工具将图片发送到内存卡。

    3.减少冗余电路和接线,降低功耗,提高系统运行可靠性。

    资料清单

    img

    资料下载链接

  • 相关阅读:
    2022/10/29 SVN的安装与使用
    Linux实现进度条小程序(包含基础版本和模拟下载过程版本)
    图搜索算法详解
    【目标检测】SAHI: 切片辅助推理和微调小目标检测
    2022软件测试面试题 200道大厂面试真题 刷完拿到10k职位
    道可云元宇宙每日资讯|中国移动启动算网大脑“天穹”全网试商用
    【MATLAB源码-第50期】基于simulink的BPSK调制解调仿真,输出误码率。
    C++学习之:布隆过滤器与哈希切分
    Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
    「PAT乙级真题解析」Basic Level 1003 我要通过! (问题分析+完整步骤+伪代码描述+提交通过代码)
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/126515640