基于DM642的人脸检测与识别设计.docx
- 文档编号:26409304
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:33
- 大小:82.92KB
基于DM642的人脸检测与识别设计.docx
《基于DM642的人脸检测与识别设计.docx》由会员分享,可在线阅读,更多相关《基于DM642的人脸检测与识别设计.docx(33页珍藏版)》请在冰豆网上搜索。
基于DM642的人脸检测与识别设计
DSP图像处理与应用课程设计
——基于DM642的人脸检测与识别
Contents
1介绍2
2知识回顾2
2.1奇偶场2
2.2YUV色彩空间3
2.3图像缓存区3
3编程思路4
4设计方法4
4.1图像二值化5
4.2人脸范围的捕捉5
4.3人脸识别算法6
4.4名字显示7
5实验结果9
6实验感想11
7附录12
1介绍
随着社会的不断进步以及各方面对于快速有效的自动身份验证的迫切要求,生物特征识别技术在近几十年中得到了飞速的发展。
作为人的一种内在属性,并且具有很强的自身稳定性及个体差异性,生物特征成为了自动身份验证的最理想依据。
当前的生物特征识别技术主要包括有:
指纹识别,视网膜识别,虹膜识别,步态识别,静脉识别,人脸识别等。
与其他识别方法相比,人脸识别由于具有直接,友好,方便的特点,使用者无任何心理障碍,易于为用户所接受,从而得到了广泛的研究与应用。
此次研究报告,我们以所学DSP图像处理技术相关知识为背景,基于DM642芯片来实现对人脸的识别。
实验的预期效果为,当A同学出现在摄像头前,屏幕上会显示与其对应的名字,当B同学出现在摄像头前,会显示与其对应的名字,而没有人在摄像头前会显示无字,从而实现人脸检测与识别。
报告内容安排大致如下,首先我们进行所用知识进行简要的回顾,其次是提出编程思路,紧接着我们对关键的设计程序进行详细分析与解释,之后是实验结果展示,最后是实验总结。
2知识回顾
2.1奇偶场
PAL制式的模拟图像转换为数字图像后包含576行*720列个像素,一帧图像分解为奇数场和偶数场两幅图像,分别包含288行*720列个像素。
一个场由帧中的奇数行组成,叫做奇场,另一个场由帧中的偶数行组成,叫做偶场。
图2-1-1奇偶场示意图
2.2YUV色彩空间
在彩色视频信号传输中采用的YUV合成的方法。
Y代表亮度信息,U(Cb)代表蓝色色差(就是蓝色信号与亮度信号之间的差值),V(Cr)代表红色色差。
YCbCr是YUV的一个特例。
Y是亮度值信号,Cb、Cr是色差信号。
图像处理与传输中,只传输和存储Y和Cb、Cr值,而且Cb和Cr的分辨率可以比Y低。
这就减少了表示图像的数据量。
在本图像处理实验中采用YCbCr2∶1∶1的格式。
各色彩分量之间相关性小,适于进行处理操作。
色差信号常做2:
1抽样处理以节省带宽。
对于每2个像素,Y用2个字节,Cb(蓝色色差)取相同的值,用一个字节,Cr(红色色差)取相同的值,用一个字节,平均每个像素2个字节。
2.3图像缓存区
图像缓冲区包括图像采集缓冲区、图像临时缓冲区和图像显示缓冲区。
每个缓冲区包括图像亮度缓冲区Y、图像色度缓冲区Cb、图像色度缓冲区Cr。
其中色度缓冲区的大小是亮度缓冲区的一半,每个像素对应的Y(亮度)、Cb、Cr(色度)值在缓冲区中位置序号如下。
像素亮度值在Y(亮度)缓冲区中的序号=缓冲区的起始地址+所在行号*每行的像素数+像素的列位置。
像素色度值在Cb、Cr(色度)缓冲区中的序号=缓冲区的起始地址+所在行号*每行的像素数/2+像素的列位置/2。
3编程思路
图3-1编程思路
首先我们对屏幕中的图像进行二值化,把符合人肤色的像素点设置为白色,把背景设置为黑色。
然后我们进行人脸范围的捕捉,找出白色区域的左边界begX,右边界endX,上边界begY,下边界endY,然后根据找出的边界画出边框。
最后我们利用某种算法实现人脸的识别,我们主要有两个编程思路,第一种是求出矩形框中白色区域所占的比例来实现人脸的识别,另一种是通过分析脸的上边界与下边界之间的长度来实现人脸识别。
识别完成后,根据识别的结果在屏幕上显示识别出来的人的名字,从而实现人脸识别。
4设计方法
本部分,我们对此次设计的关键程序进行分析与解释,主程序详见附录。
4.1图像二值化
程序如下,根据肤色的色差范围把图形二值化。
根据经验,我们把当像素点的蓝色色差Cb大于77小于177并且红色色差Cr大于133小于156时,将此像素点视为肤色的颜色。
因此我们把亮度设置为白色(0xff),不在肤色色差范围内的我们把亮度设置为黑色。
由于色差Cb和Cr每两个像素点只占用一个字节,而亮度Y每一个像素占用一个字节,因此在本程序中我们只设置了一个i值,对于奇场来说,总像素点有720*288个,在此i值的大小为numLines*numPixels/4,即720*144,因此它可以表示奇场中的色差坐标。
同理偶场。
我们通过判断把tmpYbuffer+i*2和tmpYbuffer+i*2+1的值设置为白色或者黑色。
另外,通过这种定义方法,我们可以在同一个对i的循环中实现对奇场和偶场的处理,并不需要在对列像素再做循环。
for(i=0;i { if((*(Uint8*)(tmpCbbuffer+i)>77)&&(*(Uint8*)(tmpCbbuffer+i)<177)&&(*(Uint8*)(tmpCrbuffer+i)>133)&&(*(Uint8*)(tmpCrbuffer+i)<156)) { (*(Uint8*)(tmpYbuffer+i*2))=0xff; (*(Uint8*)(tmpYbuffer+i*2+1))=0xff; (*(Uint8*)(tmpYbuffer+i*2+numLines*numPixels/2))=0xff; (*(Uint8*)(tmpYbuffer+i*2+1+numLines*numPixels/2))=0xff; } else { (*(Uint8*)(tmpYbuffer+i*2))=0x00; (*(Uint8*)(tmpYbuffer+i*2+1))=0x00; (*(Uint8*)(tmpYbuffer+i*2+numLines*numPixels/2))=0x00; (*(Uint8*)(tmpYbuffer+i*2+1+numLines*numPixels/2))=0x00; } } 4.2人脸范围的捕捉 如下程序是实现寻找人脸所在范围的左边界、右边界、上边界和下边界。 我们先对行进行循环,在对同一行的列进行循环。 根据像素亮度条件找到肤色区域的最右边的点与肤色区域宽度,让最右边点对应的j减去宽度则得到最左边的点。 同上下边界。 理寻找因此将找到最右边的点将找到的左边界的值放到begX里面,右边界的值放到endX里面,上边界的值放到begY里面,下边界的值放到endY里面。 for(i=15;i { for(j=10;j { if(*(Uint8*)(tmpYbuffer+i*numPixels+j)==0xff) { curnum++; if(curnum>pixelnum) { pixelnum=curnum; begX=j-pixelnum; endX=j; c=begX; d=endX; } } } curnum=0; } pixelnum=0;curnum=0; //计算Y起点与终点 for(j=10;j { for(i=15;i { if(*(Uint8*)(tmpYbuffer+i*numPixels+j)==0xff)//黑色 { curnum++; if(curnum>pixelnum) { pixelnum=curnum; begY=i-pixelnum; endY=i; e=begY; f=endY; } } } curnum=0; } 4.3人脸识别算法 方案一: 如下程序是我们实现人脸识别的第一种方案,即求出所画边框中肤色像素所占的比例,通过该比例实现不同人之间的识别。 如上,a为人脸在整个矩形框中所占的像素点,b为矩形框的所有像素点,g=(double)a/(double)b即为人脸的范围所占的比例,通过判断该比例实现人脸识别。 如上h为1时,显示“王”字,h为2时,显示“黄”字,h为3时,显示“无”字。 此方法是个粗略的识别方法,因此实际操作中有一定识别误差。 //计算框内白像素百分比 b=(d-c)*(f-e); for(j=e;j { for(i=c;i { if(*(Uint8*)(tmpYbuffer+i*numPixels+j)==0xff) a++; } } g=(double)a/(double)b; if(g! =0) { if(g<0.25) h=2; else h=1; } else h=3; 方案二: 如下程序是我们实现人脸识别的第二种方案,即找出人脸的上边界与下边界之间的距离,即人脸的数值高度,从而判断出不同的人,同样,h为1时,显示“王”字,h为2时,显示“黄”字,h为3时,显示“无”字。 这种方法要求人脸固定于屏幕的某个特定位置。 g=f-e; if(g<10)h=3; elseif(g>210)h=1; elseh=2; 4.4名字显示 如下程序使我们的名字显示部分,如下通过人脸识别过程中识别的h值显示不同的名字,当h为1时,显示“王”字,h为2时,显示“黄”字,h为3时,显示“无”字。 本程序,我们定义的字体的大小为32*32,数组中每一个八位二进制数值对应八个像素点,每次判断八位数值中的一位,当其为1时,在屏幕上显示黑色,为0时显示白色。 voidNAME(intinit_lie,intinit_hang,intwenzi) { unsignedinti=0,j=0,num=0,n=0; //staticunsignedintnum; unsignedchartest_word=0x80,tre_coast=0x00; //while(F16x16[num]! ='\0') for(i=init_hang;i { for(j=init_lie;j { n=j-init_lie; if(j==init_lie||(n%8==0)) { if(wenzi==1) tre_coast=wang[num]; elseif(wenzi==3) tre_coast=WU[num]; elseif(wenzi==2) tre_coast=huang[num]; num++; } if(test_word&tre_coast) { *(Uint8*)(tmpYbuffer+i*numPixels+j)=0x00; } else *(Uint8*)(tmpYbuffer+i*numPixels+j)=0xff; tre_coast=tre_coast<<1; } } num=0; for(i=numLines/2+init_hang;i { for(j=init_lie;j { n=j-init_lie; if(j==init_lie||(n%8==0)) { if(wenzi==1)tre_coast=wang[num]; elseif(wenzi==2)tre_coast=huang[num]; elseif(wenzi==3)tre_coast=WU[num]; num++; } tre_coast=tre_coast<<1; if(test_word&tre_coast) { *(Uint8*)(tmpYbuffer+i*numPixels+j)=0x00; } else*(Uint8*)(tmpYbuffer+i*numPixels+j)=0xff; } } } 5实验结果 6实验感想 为期半个学期的DSP课程的学习就此告一段落,通过此次结课设计,我们利用所学知识,最终克服困难实现了。 总体来讲,我们收获颇丰。 首先,通过此次结课设计,我们又进一步掌握利用DSP进行图像处理的方法,了解利用仿真软件以及实验箱的对DSP图像的相关设计过程,特别是实验中所实现的图像二值化、人脸捕捉,画边框,显示名字等功能,无不体现着课堂中所学关于图像采集、阈值分割以及图像处理的相关知识,可以说这次结课设计就是对这半个学期所学内容的很好总结。 其次,此次设计我们并非一帆风顺,我们选择题目以后,收集了多方面的资料进行查阅,并及时交流讨论,通过这个过程,我们对所学知识有了更加多面的理解。 比如关于奇偶场图像处理这一块,上课的时候虽然老师给过例程,但是通过我们查找的很多资料进行参考后有了更加简单的算法,可以说这给予了我们的学习的动力。 总之,结合着我们的所学理论知识,我们对于本次设计所用的相关知识有了更加深入的理解。 当然,通过这次研讨,我们也存在着遗憾,那就是关于程序在BIOS上的实现还没有完成。 我们曾经做过尝试,因为考虑到BIOS是个更加底层的系统,它更面向硬件,因此处理速度更快。 但是,我们却遇到了诸如不能合适地建立临时缓存区这个问题,我们也请教过老师,但是由于所学知识的局限性以及设计截止日期的紧迫性,我们最终还是选择不在BIOS上实现了。 通过此课程的学习我们已经对DSP图像处理萌生了兴趣,在今后的学习中我们一定会在多做尝试。 最后,衷心感谢高海林老师长达半个学期的实验讲授以及对本设计的指导! 7附录 /********************************************************************/ /*Copyright2004bySEEDIncorporated.*/ /*Allrightsreserved.PropertyofSEEDIncorporated.*/ /*Restrictedrightstouse,duplicateordisclosethiscodeare*/ /*grantedthroughcontract.*/ /**/ /********************************************************************/ #include #include #include #include #include #include #include #include"iic.h" #include"vportcap.h" #include"vportdis.h" #include"sa7121h.h" #include"TVP51xx.h" #include"seeddm642.h" constunsignedcharWU[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xE0, 0x0F,0xFF,0xFF,0xF0,0x04,0x03,0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x80,0x00, 0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x10, 0x00,0x03,0x00,0x38,0x3F,0xFF,0xFF,0xFC,0x30,0x03,0x60,0x00,0x00,0x03,0x60,0x00, 0x00,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x0E,0x60,0x00, 0x00,0x0C,0x60,0x00,0x00,0x0C,0x60,0x00,0x00,0x18,0x60,0x08,0x00,0x38,0x60,0x08, 0x00,0x30,0x60,0x08,0x00,0x60,0x60,0x08,0x00,0xC0,0x60,0x0C,0x03,0x80,0x60,0x1E, 0x07,0x00,0x7F,0xFC,0x1C,0x00,0x3F,0xF8,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; /*---------------黄----------------*/ constunsignedcharhuang[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x18,0x1C,0x00, 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x70,0x0F,0xFF,0xFF,0xF0,0x00,0x18,0x18,0x00, 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x18,0x7F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFE, 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x80,0x01,0xFF,0xFF,0xC0,0x01,0x81,0x81,0xC0, 0x01,0x81,0x81,0x80,0x01,0x81,0x81,0x80,0x01,0x81,0x81,0x80,0x01,0xFF,0xFF,0x80, 0x01,0x81,0x81,0x80,0x01,0x81,0x81,0x80,0x01,0x81,0x81,0x80,0x01,0xFF,0xFF,0x80, 0x01,0x98,0x01,0x80,0x00,0x3C,0x1C,0x00,0x00,0x78,0x07,0x80,0x00,0xE0,0x03,0xE0, 0x03,0x80,0x00,0xF0,0x0E,0x00,0x00,0x70,0x18,0x00,0x00,0x30,0x00,0x00,0x00,0x00, }; /*---------------王----------------*/ constunsignedcharwang[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x0F,0xFF,0xFF,0xF8,0x00,0x01,0x80,0x00, 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00, 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0xC0, 0x07,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00, 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00, 0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x18, 0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; EMIFA_ConfigSeeddm642ConfigA={ 0x00052078,/*gblctlEMIFA(B)globalcontrolregistervalue*/ /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/ 0xffffffd3,/*cectl0CE0spacecontrolregistervalue*/ /*将CE0空间设为SDRAM*/ 0x73a28e01,/*cectl1CE1spacecontrolregistervalue*/ /*Readhold: 1clock; MTYPE: 0000,选择8位的异步接口 Readstrobe: 001110;14个clock宽度 TA: 2clock;Readsetup2clock; Writehold: 2clock;Writestrobe: 14clock Writesetup: 7clock ---------------- \14c/1c \----------------/*/ 0x22a28a22,/*cectl2CE2spacecontrolregistervalue*/ 0x22a28a42,/*cectl3CE3spacecontrolregistervalue*/ 0x57115000,/*sdctlSDRAMcontrolregistervalue*/ 0x0000081b,/*sdtimSDRAMtimingregistervalue*/ 0x001faf4d,/*sdextSDRAMextensionregistervalue*/ 0x00000002,/*cesec0CE0spacesecondarycontrolregistervalue*/ 0x00000002,/*cesec1CE1spacesecondarycontrolregistervalu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DM642 检测 识别 设计