指纹识别代码
JavaScript奇技淫巧:设备指纹

JavaScript奇技淫巧:设备指纹设备指纹,通常指浏览器设备指纹,通过从浏览器获取的特征信息,从而可以识别是否是同一访问者。
指纹信息通常从数个维度获取,大类如:navigator、window、screen。
例,navigator信息:这些信息中,有些特别的、固定的、可以于识别用户系统特征的数据,如:操作系统类型、语言、浏览器名称、浏览器插件、屏幕分辨率、屏幕大小、CPU数量、时区、屏幕是否支持触控、是否支持Cookie、是否支持本地存储、是否支持webgl等等。
这些数据的集合,便形成了该设备的唯一特征,就像人的指纹一样,可以通过它来识别一个设备。
如下图所示:注:指纹识别的准确率决定于识别选择的数据源,但数据源并非越多越好,太多或太少,都容易造成误报,通常是经过大量测试,选取合适的数据项,本文做演示,仅使用了少量数据源。
此时,已经获取到指纹数据,但内容多,不利用比对指纹以识别设备。
通常,这时会对数据进行进一步处理,比如:进行md5化,形成一个字符串特征码。
当然也可以采用其它的算法,这里,采用一种简单的自定义算法获取特征:源码<html><script>//获取浏览器指纹function get_fingerprint(){var fingerprint = [];//用户代理fingerprint.push({key: "user_agent", value: erAgent });//语言fingerprint.push({key: "language", value: nguage});//设备像素比:物理像素和设备独立像素的比例fingerprint.push({key: "pixel_ratio", value: window.devicePixelRatio });//硬件并发数,即:几核CPUfingerprint.push({key: "hardware_concurrency", value: navigator.hardwareConcurrency });//屏幕的宽度、高度fingerprint.push({key: "resolution", value: [screen.width, screen.height] });//屏幕分辨率的高、宽fingerprint.push({key: "available_resolution", value: [screen.availHeight, screen.availWidth] });//格林威治时间与本地时间的差值,单位是分钟fingerprint.push({key: "timezone_offset", value: new Date().getTimezoneOffset() });//本地存储支持度识别,例:window.openDatabase被IE、Google Chrome支持、但FireFox不支持fingerprint.push({key: "session_storage", value: !window.sessionStorage });fingerprint.push({key: "local_storage", value: !window.localStorage });fingerprint.push({key: "indexed_db", value: !window.indexedDB });fingerprint.push({key: "open_database", value: !window.openDatabase });//系统平台类型,如:win32fingerprint.push({key: "navigator_platform", value: navigator.platform });//系统类型及版,如:Windows NT 10.0; Win64; x64fingerprint.push({key: "navigator_oscpu", value: navigator.oscpu });//浏览器是否开启隐私保护fingerprint.push({key: "do_not_track", value: navigator.doNotTrack });//屏幕是否支持触摸fingerprint.push({key: "touch_support", value: navigator.maxTouchPoints });//浏览器插件for(i=0; i<navigator.plugins.length;i ++){fingerprint.push({key: "navigator_plugin_" + i, value: navigator.plugins[i].name });}//是否支持cookiefingerprint.push({key: "cookie_enabled", value: navigator.cookieEnabled });console.log(fingerprint);//简化指纹var short_fingerprint = "";for(j=0; j<fingerprint.length; j++){short_fingerprint += fingerprint[j].value.toString().toLowerCase().substring(0,1);}short_fingerprint += fingerprint.length;short_fingerprint += navigator.plugins.length;console.log("设备指纹:",short_fingerprint)}get_fingerprint();</script></html>运行效果设备指纹主要用于:免登录校验、陌生用户识别,比如判断一个来访客户是第几次访问、访问了多少个页面、是否点击了商品、广告、是否下单、在哪个页面退出、是否进行了危险操作等等。
FM-180指纹识别模块用户手册

UART 通讯指令格式详解
FM-180是完整的指纹识别模块,不需挂接任何外围部件,模块始终处于从属地位(Slave mode),主机(Host)需要通过不同的指令让模块完成各种功能。主机的指令、模块的应答 以及数据交换都是按照规定格式的数据包来进行的。主机必须按照下述格式封装要发送的指 令或数据,也必须按下述格式解析收到的数据包。
用户记事本
在FLASH 中开辟了一个512 字节的存储区域作为用户记事本,该记事本逻辑上被分成16 页, 每页32 字节。上位机可以通过PS_WriteNotepad 指令和PS_ReadNotepad 指令访问任意一 页。注意写记事本某一页的时候,该页32 字节的内容被整体写入,原来的内容被覆盖。
应答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
N bytes
2 bytes
0xEF01
芯片地址 包标识07
包长度
确认码
返回参数
校验和
FM-180 指纹识别模块用户手册 V1.1
确认码定义: 1. 00h:表示指令执行完毕或OK; 2. 01h:表示数据包接收错误; 3. 02h:表示传感器上没有手指; 4. 03h:表示录入指纹图像失败; 5. 04h:表示指纹图像太干、太淡而生不成特征; 6. 05h:表示指纹图像太湿、太糊而生不成特征; 7. 06h:表示指纹图像太乱而生不成特征; 8. 07h:表示指纹图像正常,但特征点太少(或面积太小)而生不成特征; 9. 08h:表示指纹不匹配; 10. 09h:表示没搜索到指纹; 11. 0ah:表示特征合并失败; 12. 0bh:表示访问指纹库时地址序号超出指纹库范围; 13. 0ch:表示从指纹库读模板出错或无效; 14. 0dh:表示上传特征失败; 15. 0eh:表示模块不能接受后续数据包; 16. 0fh:表示上传图像失败; 17. 10h:表示删除模板失败; 18. 11h:表示清空指纹库失败; 19. 12h:表示不能进入低功耗状态; 20. 13h:表示口令不正确; 21. 14h:表示系统复位失败; 22. 15H:表示缓冲区内没有有效原始图而生不成图像; 23. 16H:表示在线升级失败; 24. 17H:表示残留指纹或两次采集之间手指没有移动过; 25. 18H:表示读写FLASH 出错; 26. 0xf0:有后续数据包的指令,正确接收后用0xf0 应答; 27. 0xf1:有后续数据包的指令,命令包用0xf1 应答; 28. 0xf2:表示烧写内部FLASH 时,校验和错误; 29. 0xf3:表示烧写内部FLASH 时,包标识错误; 30. 0xf4:表示烧写内部FLASH 时,包长度错误; 31. 0xf5:表示烧写内部FLASH 时,代码长度太长; 32. 0xf6:表示烧写内部FLASH 时,烧写FLASH 失败; 33. 0x19:未定义错误; 34. 0x1a:无效寄存器号; 35. 0x1b:寄存器设定内容错误号; 36. 0x1c:记事本页码指定错误; 37. 0x1d:端口操作失败; 38. 0x1e:自动注册(enroll)失败; 39. 0x1f:指纹库满 40. 0x20—0xefh:Reserved。 指令只能由上位机下给模块,模块向上位机应答。 系统上电复位后将首先检查默认的设备握手口令是否被修改,若未被修改,则系统认为上位 机没有验证口令的需求,SOC 直接进入正常工作状态;若已被修改,则必须首先验证设备握
Android指纹识别详解及实现方法

Android指纹识别详解及实现⽅法最近项⽬需要使⽤到指纹识别的功能,查阅了相关资料后,整理成此⽂。
指纹识别是在Android 6.0之后新增的功能,因此在使⽤的时候需要先判断⽤户⼿机的系统版本是否⽀持指纹识别。
另外,实际开发场景中,使⽤指纹的主要场景有两种:纯本地使⽤。
即⽤户在本地完成指纹识别后,不需要将指纹的相关信息给后台。
与后台交互。
⽤户在本地完成指纹识别后,需要将指纹相关的信息传给后台。
由于使⽤指纹识别功能需要⼀个加密对象(CryptoObject)该对象⼀般是由对称加密或者⾮对称加密获得。
上述两种开发场景的实现⼤同⼩异,主要区别在于加密过程中密钥的创建和使⽤,⼀般来说,纯本地的使⽤指纹识别功能,只需要对称加密即可;⽽与后台交互则需要使⽤⾮对称加密:将私钥⽤于本地指纹识别,识别成功后将加密信息传给后台,后台开发⼈员⽤公钥解密,以获得⽤户信息。
下⾯先简单介绍⼀下对称加密和⾮对称加密的相关概念,然后对两种开发⽅式的实现分别进⾏讲解。
对称加密、⾮对称加密和签名在正式使⽤指纹识别功能之前,有必要先了解⼀下对称加密和⾮对称加密的相关内容。
对称加密:所谓对称,就是采⽤这种加密⽅法的双⽅使⽤⽅式⽤同样的密钥进⾏加密和解密。
密钥是控制加密及解密过程的指令。
算法是⼀组规则,规定如何进⾏加密和解密。
因此加密的安全性不仅取决于加密算法本⾝,密钥管理的安全性更是重要。
因为加密和解密都使⽤同⼀个密钥,如何把密钥安全地传递到解密者⼿上就成了必须要解决的问题。
⾮对称加密:⾮对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
公开密钥与私有密钥是⼀对,如果⽤公开密钥对数据进⾏加密,只有⽤对应的私有密钥才能解密;如果⽤私有密钥对数据进⾏加密,那么只有⽤对应的公开密钥才能解密。
因为加密和解密使⽤的是两个不同的密钥,所以这种算法叫作⾮对称加密算法。
⾮对称加密算法实现机密信息交换的基本过程是:甲⽅⽣成⼀对密钥并将其中的⼀把作为公⽤密钥向其它⽅公开;得到该公⽤密钥的⼄⽅使⽤该密钥对机密信息进⾏加密后再发送给甲⽅;甲⽅再⽤⾃⼰保存的另⼀把专⽤密钥对加密后的信息进⾏解密。
公安出入境管理用指纹采集设备接口规范

公安出⼊境管理⽤指纹采集设备接⼝规范附件1:公安出⼊境管理⽤指纹采集设备接⼝规范1范围本规范规定了出⼊境管理中建档和核验⽤指纹采集设备指纹图像采集和指纹⽐对接⼝规范。
本规范适⽤于出⼊境管理中建档和核验⽤的指纹采集设备。
2引⽤标准下列标准所包含的条⽂,通过在本规范中引⽤⽽构成为本规范的条⽂。
在规范出版时,所⽰版本均为有效。
GB 2312 信息交换⽤汉字编码字符集基本集GB 18030 信息技术中⽂编码字符集GA/T 625-2010 活体指纹图像采集技术规范GA/T 626.1-2010 活体指纹图像应⽤程序接⼝规范第1部分:采集设备GA/T 774.1-2008 指纹特征规范第1部分指纹⽅向GA 776-2008 指纹⾃动识别系统产品编码规则3术语纠偏 image deviation rectify通过旋转、移动等图像处理⽅式,使得采集到的指纹图像有效区域位于图像⼏何中⼼,并且指纹⽅向保持垂直向上。
4图像采集接⼝4.1初始化采集设备函数原型: int __stdcall LIVESCAN_Init()说明:遵循GA/T 626.1—2010中3.1规定。
4.2释放采集设备函数原型: int __stdcall LIVESCAN_Close()说明:遵循GA/T 626.1—2010中3.2规定。
4.3获得采集设备通道数量函数原型: int __stdcall LIVESCAN_ GetChannelCount()说明:遵循GA/T 626.1—2010中3.3规定。
4.4设置采集设备当前的亮度函数原型: int __stdcall LIVESCAN_SetBright(int nChannel, int nBright)说明:遵循GA/T 626.1—2010中3.4规定。
4.5设置采集设备当前的对⽐度函数原型: int __stdcall LIVESCAN_SetContrast(int nChannel, intnContrast)说明:遵循GA/T 626.1—2010中3.5规定。
指纹识别模块程序及原理图

程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define Dbus P0#define buffer1ID 0x01#define buffer2ID 0x02#define queren 0x88#define tuichu 0x84#define shanchu 0x82sbit B0=B^0;sbit B7=B^7;sbit jidianqi=P3^6;sbit RS=P2^2;sbit RW=P2^1;sbit E1=P2^0;sbit LEDK=P3^4; //控制背光sbit SCLK=P2^3;sbit IO=P2^5;sbit RST=P2^4;uchar code ta[8]={0x00,0x51,0x09,0x10,0x05,0x02,0x11,0xbe}; uchar data a[7]; // 秒分时日月星期年uchar dz[4]; //存键输入值uchar mima[7];uchar mimaID[6]={1,2,3,4,5,6};uchar data K;uchar data Key;uint PageID;uchar data querenma;uchar sum[2];int summaf,summas;uchar code nian[]={"年"};uchar code yue[]={"月"};uchar code ri[]={"日"};uchar code xinqi[]={"星期"};uchar code mao=0x3a;unsigned char code text1[]={" 请按指纹"};unsigned char code text2[]={" 请再次按指纹"};unsigned char code text3[]={" 指纹采集成功"};unsigned char code text4[]={"请按任意键继续"};unsigned char code text5[]={" 指纹采集失败"};unsigned char code text6[]={"输入删去的指纹号"};unsigned char code text7[]={" 删指纹号成功"};unsigned char code text8[]={"按键一:增加指纹"};unsigned char code text9[]={"按键二:删去指纹"};unsigned char code text10[]={" 请重新按指纹"};unsigned char code text11[]={"清空指纹库成功"};unsigned char code text12[]={" 没搜索到指纹"};unsigned char code text13[]={"请先按键再刷指纹"};unsigned char code text14[]={" 请重新操作"};unsigned char code text15[]={" 删去失败"};unsigned char code text16[]={" 接收包出错"};unsigned char code text17[]={" 编号为:"};unsigned char code text18[]={"指纹已找到请进"};unsigned char code text19[]={" 该指纹已存储"};unsigned char code text20[]={" 请输入密码"};unsigned char code text21[]={" 密码错误"};unsigned char code text22[]={"按键三:更新密码"}; // @@@ unsigned char code text23[]={"请再次输入密码"};unsigned char code text24[]={"两次输入的密码不"};unsigned char code text25[]={"一致,请重新操作"};unsigned char code text26[]={" 密码更新成功"};另外:void delay(uint tt){ uchar i;while(tt--){for(i=0;i<125;i++);}}void initialize51(){SCON= 0x50; //串口方式1 //REN=1; 允许接收PCON=0x80; //SMOD=1TMOD= 0x20; //定时器1定时方式2TH1= 0xff; //11.0592MHz 模块默认波特率为57600bps TL1= 0xff;TR1= 1; //启动定时器}unsigned char Keycan(void) //按键扫描程序P1.0--P1.3为行线P1.4--P1.7为列线{unsigned char rcode, ccode;P1 = 0xF0; // 发全0行扫描码,列线输入if((P1&0xF0) != 0xF0) // 若有键按下{delay(1);// 延时去抖动if((P1&0xF0) != 0xF0){ rcode = 0xFE; // 逐行扫描初值while((rcode&0x10) != 0){P1 = rcode; // 输出行扫描码if((P1&0xF0) != 0xF0) // 本行有键按下{ccode = (P1&0xF0)|0x0F;//do{;}while((P1&0xF0) != 0xF0); //等待键释放return ((~rcode) + (~ccode)); // 返回键编码}elsercode = (rcode<<1)|0x01; // 行扫描码左移一位}}}return 0; // 无键按下,返回值为0}void KeyDeal(unsigned char Key){ //unsigned char n;if(Key!=0){switch(Key){case 0x11: K=1; break;case 0x21: K=2; break;case 0x41: K=3; break;case 0x81: break; //K=funguanliyuan;case 0x12: K=4; break;case 0x22: K=5; break;case 0x42: K=6; break;case 0x82: K=34;break; //K=funshanchu;case 0x14: K=7; break;case 0x24: K=8; break;case 0x44: K=9; break;case 0x84: break; //K=funtuichu;case 0x18: break; //K=shuazhiwencase 0x28: K=0; break;case 0x48: break;case 0x88: break; //K=funqueren;default: break;}}}//*************************************//12864//读12864忙void ReadBusy(void){unsigned char ch;cheak:Dbus=0xff;RS=0;RW=1;E1=1;ch=Dbus;E1=0;ch=ch|0x7f;if(ch!=0x7f)goto cheak;}//向LCD写命令void WriteCommand(uchar command){ReadBusy();RW=0;Dbus=command;E1=1;E1=0;}//向LCD写数据void WriteData(uchar Lcd_data){ReadBusy();RS=1;RW=0;Dbus=Lcd_data;E1=1;E1=0;}//清屏函数清DDRAMvoid Clrram (void){WriteCommand(0x01);}//LCD12864初始化程序void Lcd_int(){WriteCommand(0x30); //30---基本指令动作WriteCommand(0x0c); //开显示,关游标WriteCommand(0x01); //清屏,地址指针指向00HWriteCommand(0x02);}//LCD12864显示时间void playtime(){uchar i,n3,n4,y1,y2,r1,r2,s1,s2,f1,f2,m1,m2;WriteCommand(0x80); //指定第一行显示位置for(i=0;i<16;i++)WriteData(text13[i]); //显示LCD12864并行显示n3=a[6]>>4; n4=a[6]&0x0f;WriteCommand(0x90); //指定第二行显示位置WriteData(0x32);WriteData(0x30);WriteData(0x30+n3);WriteData(0x30+n4);for(i=0;i<2;i++) WriteData(nian[i]);y1=a[4]>>4; y2=a[4]&0x0f;WriteData(0x30+y1);WriteData(0x30+y2);for(i=0;i<2;i++) WriteData(yue[i]);r1=a[3]>>4; r2=a[3]&0x0f;WriteData(0x30+r1);WriteData(0x30+r2);for(i=0;i<2;i++)WriteData(ri[i]);WriteCommand(0x88); //指定第三行显示位置for(i=0;i<4;i++)WriteData(xinqi[i]);WriteData(a[5]+0x30);s1=a[2]>>4;s2=a[2]&0x0f; f1=a[1]>>4;f2=a[1]&0x0f; m1=a[0]>>4;m2=a[0]&0x0f;WriteCommand(0x98); //指定第四行显示位置WriteData(0x30+s1);WriteData(0x30+s2);WriteData(mao);WriteData(0x30+f1);WriteData(0x30+f2);WriteData(mao);WriteData(0x30+m1);WriteData(0x30+m2);}//*************************************//12864//*********************************//ds1302控制uchar r1302() //读数据ds1302{ uchar i;for(i=0;i<8;i++){B>>=1;B7 = IO;SCLK=1;SCLK=0;}return B;}void w1302(uchar co) // 写ds1302 单字节{uchar i;B = co;for(i=0;i<8;i++){IO = B0; //原来是使用ACC寄存器,但不行,后改使用B寄存器后才正常运行???SCLK=1;SCLK=0;B>>=1;}}void w(uchar a, uchar d) //寻址,写数{RST = 0;SCLK = 0;RST = 1;w1302(a);w1302(d);SCLK = 1;RST = 0;}uchar r(uchar a) //寻址,读数{uchar r;RST = 0;SCLK = 0;RST = 1;w1302(a);r=r1302();SCLK = 1;RST = 0;return r;}void wclo(uchar *p) //写多字节ds1302 {uchar i;w(0x8e,0x00); //写允许RST=0;SCLK=0;RST=1;w1302(0xbe); //写多字节命令for(i=0;i<8;i++)w1302(*(p+i)); //写时钟数据w(0x00,0x50); //??? 启动定时器SCLK=1;RST=0;}void rclo(uchar *p) //读出多字节ds1302 {uchar i;RST=0;SCLK=0;RST=1;w1302(0xbf);for(i=0;i<7;i++)*(p+i) = r1302(); //读出时钟数据SCLK=1;RST=0;}//***************************************//void SFG_getimage() //录入指纹图像{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;TI=0;summaf=0x05;SBUF=summaf;while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_genchar(uchar bufferID) //生成特征并存于charbuffer1/2 调用后单片机波特率变化@@@ {uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X04;while(TI==0);TI=0;SBUF=0X02;while(TI==0);TI=0;SBUF=bufferID;while(TI==0);TI=0;summaf=0x07+bufferID; sum[0]=summaf;sum[1]=summaf>>8; SBUF=sum[1];while(TI==0)TI=0;SBUF=sum[0];while(TI==0)TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF; while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_regmodel() //合并生成模板{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X05;while(TI==0);TI=0;SBUF=0X00;while(TI==0);summaf=0x09;SBUF=summaf; //校验和while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_storechar(uint pageID) //储存模板ID=1010也储存成功ID>=1011 querenma=0x18?@@@{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X06;while(TI==0);TI=0;SBUF=0X06;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;ID1=pageID;ID2=pageID>>8; SBUF=ID2;while(TI==0);TI=0;SBUF=ID1;while(TI==0);TI=0;summaf=0x0e+ID1+ID2; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_empty() //清空指纹库{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X0d;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x11;SBUF=summaf;while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_fastsearch(uchar bufferID) //搜索指纹返回指纹ID号sum、pagenum>255都会使程序卡@@@ {uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X08;while(TI==0);TI=0;SBUF=0X1b;while(TI==0);TI=0;SBUF=bufferID;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=180;while(TI==0);TI=0;summaf=9+0x1b+bufferID+180; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF; //接收到的ID号while(RI==0);RI=0;while(RI==0);RI=0;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void SFG_enroll() //自动注册模板返回存储ID =录图像+合并生成模板+储存模板{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X10;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x14;SBUF=summaf; //校验和while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void SFG_deletchar(uint pageID) //删除指纹校验和在2字节的页码处应分高低字节相加{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);SBUF=0X00;while(TI==0);TI=0;SBUF=0X07;while(TI==0);TI=0;SBUF=0X0c;while(TI==0);TI=0;ID1=pageID;ID2=pageID>>8; SBUF=ID2;while(TI==0);TI=0;SBUF=ID1;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=1;while(TI==0);TI=0;summaf=0x15+ID1+ID2; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_writereg(uchar N) //设置波特率{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X05;while(TI==0);TI=0;SBUF=0X0e;while(TI==0);TI=0;SBUF=4;while(TI==0);TI=0;SBUF=N;while(TI==0);TI=0;summaf=0x1a;sum[0]=summaf;sum[1]=0;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_identify() //自动验证指纹录图像+生成特征+搜索{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X11;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x15;SBUF=summaf; //校验和while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF;while(RI==0);RI=0;while(RI==0);RI=0; //得分while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void shuazhiwen(){uchar i,IDs1,IDs2,IDs3;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text1[i]); //显示LCD12864并行显示请按指纹//SFG_getimage();//SFG_genchar(1);//SFG_fastsearch(1);SFG_identify();while(querenma==2)SFG_identify();if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text18[i]); //显示LCD12864并行显示指纹通过门已开IDs1=PageID/100;IDs2=PageID/10%10;IDs3=PageID%10;WriteCommand(0x88); //指定第三行显示位置for(i=0;i<10;i++)WriteData(text17[i]); //显示LCD12864并行显示编号为:WriteData(0x30+IDs1);WriteData(0x30+IDs2);WriteData(0x30+IDs3);jidianqi=0; //开门}else if(querenma==9){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text12[i]); //显示LCD12864并行显示没搜索到指纹}else{Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text16[i]); //显示LCD12864并行显示接收包出错}WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}void addfinger(){uchar i,IDa1,IDa2,IDa3;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text1[i]); //显示LCD12864并行显示请按指纹SFG_getimage();while(querenma!=0)SFG_getimage();SFG_genchar(buffer1ID);initialize51();SFG_fastsearch(buffer1ID);while(querenma==1)SFG_fastsearch(buffer1ID);if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text19[i]); //显示LCD12864并行显示该指纹已存储WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}else if(querenma==9){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text2[i]); //显示LCD12864并行显示请再次按指纹SFG_enroll();while(querenma==2)SFG_enroll();Clrram();if(querenma==0){IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text3[i]); //显示LCD12864并行显示指纹采集成功WriteCommand(0x88); //指定第三行显示位置for(i=0;i<10;i++)WriteData(text17[i]); //显示LCD12864并行显示编号为:pgaeID WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);}else if(querenma!=0){WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text5[i]); //显示LCD12864并行显示指纹采集失败WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text14[i]); //显示LCD12864并行显示请重新采集}WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Clrram();}void deletfinger(){uchar i,j=0;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text6[i]); //显示LCD12864并行显示请输入删去的指纹号for(i=0;i<5;i++)dz[i]=0; //不输入时会默认为000 @@@Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30); //按键有抖动@@@if(Key==0)K=10;if((K>=0)&&(K<=9)){dz[j]=K;if(j<3){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x30+dz[j]);}++j;if(j==4)j=3; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}if(j>=2)PageID=dz[2]+dz[1]*10+dz[0]*100;if(j==1)PageID=dz[1]+dz[0]*10;if(j==0)PageID=dz[0];SFG_deletchar(PageID);if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置显示删除成功for(i=0;i<16;i++)WriteData(text7[i]); //显示LCD12864并行显示}else{Clrram();WriteCommand(0x90); //指定第二行显示位置显示删除失败for(i=0;i<16;i++)WriteData(text15[i]); //显示LCD12864并行显示}WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);Clrram();}void gaimima(){uchar i,j,mima1[6],mima2[6];Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text20[i]); //显示LCD12864并行显示请输入密码for(i=0;i<6;i++)mima1[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima1[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang } //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();Clrram();j=0;WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text23[i]); //显示LCD12864并行显示请再次输入密码for(i=0;i<6;i++)mima2[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima2[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3 ])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5])){for(i=0;i<6;i++)mimaID[i]=mima1[i];WriteCommand(0x80); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text26[i]); //显示LCD12864并行显示密码更新成功WriteCommand(0x88); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}else{WriteCommand(0x80); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text24[i]); //显示LCD12864并行显示两次输入的密码不WriteCommand(0x90); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text25[i]); //显示LCD12864并行显示一致,请重新操作WriteCommand(0x88); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Clrram();}void guanliyuan(){ uchar i,j;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text20[i]); //显示LCD12864并行显示请输入密码for(i=0;i<6;i++)mima[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();if((mima[0]==mimaID[0])&&(mima[1]==mimaID[1])&&(mima[2]==mimaID[2])&&(mima[3]==mimaID[3])&& (mima[4]==mimaID[4])&&(mima[5]==mimaID[5])){while(Keycan()!=tuichu){WriteCommand(0x90); //指定第二行显示位置按键1:增加指纹for(i=0;i<16;i++)WriteData(text8[i]); //显示LCD12864并行显示WriteCommand(0x88); //指定第三行显示位置按键2:删除指纹for(i=0;i<16;i++)WriteData(text9[i]); //显示LCD12864并行显示WriteCommand(0x98); //指定第三行显示位置按键3:改密码for(i=0;i<16;i++)WriteData(text22[i]); //显示LCD12864并行显示KeyDeal(Keycan());switch(K){case 1: addfinger();K=6; break;case 2: deletfinger(); break;case 3: gaimima(); break;default: break;}}}else{WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text21[i]); //显示LCD12864并行显示密码错误WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Key=0;}void main(){initialize51();LEDK=0;Lcd_int();Clrram();wclo(ta);delay(100);//SFG_empty();///@@@@//SFG_deletchar(255);//SFG_storechar(1011);//SFG_fastsearch(1);// WriteCommand(0x90); //指定第二行显示位置// WriteData(0x30+((0xf0&querenma)>>4));WriteData(0x30+(0x0f&querenma));while(1){Key=Keycan();if(Key==0x18) //指纹刷机{Clrram();shuazhiwen();Clrram();}if(Key==0x81) //管理员操作{Clrram();guanliyuan();Clrram();}rclo(a); playtime(); delay(100); jidianqi=1; }}。
指纹识别代码

sum4=I(x-2,y+1)+I(x-4,y+2)+I(x+2,y-1)+I(x+4,y-2);
sum5=I(x-2,y)+I(x-4,y)+I(x+2,y)+I(x+4,y);
for x=1:m
for y=1:n
if I(x,y)>=M1
I(x,y)=150+sqrt(100*(I(x,y)-M1)*(I(x,y)-M1)/var1);
else
I(x,y)=150-sqrt(100*(M1-I(x,y))*(M1-I(x,y))/var1);
gtotle1=gtotle1+aveg1(x,y);
end
if 0<var1(x,y)<V1
vtemp1=vtemp1+1;
vtotle1=vtotle1+var1(x,y);
end
end
end
end
figure, imshow(uint8(I))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 分割,采用均值方差法
M = 10; %1
H = m/M; L= n/M;
aveg1=zeros(H,L);
var1=zeros(H,L);
M1=M/(m*n); %%M1就是公式中的AVE,即均值
for x=1:m
for y=1:n
最优指纹法归因代码

最优指纹法归因代码在软件开发中,"最优指纹法归因"通常指的是一种用于跟踪用户行为和归因分析的技术。
这种方法通过收集和分析用户设备(如手机、电脑等)的唯一标识符(即“指纹”)来跟踪用户行为,从而帮助广告主和广告平台衡量广告投放的效果,优化广告策略。
这里有一个使用Python实现的简单示例代码,展示了如何创建一个基础的指纹识别和归因系统:python复制代码import uuidimport hashlibimport requestsclass Fingerprinter:def __init__(self):er_fingerprint = Nonedef get_fingerprint(self):# 这里可以添加更多的指纹信息,如设备操作系统、浏览器类型、屏幕分辨率等user_fingerprint = {}user_fingerprint['uuid'] = str(uuid.uuid4()) # 生成UUID作为指纹的一部分user_fingerprint['hash'] =hashlib.sha256(str(uuid.uuid4()).encode()).hexdigest() # 对UUID进行SHA256哈希,增强其唯一性return user_fingerprintdef get_attribution(self, user_id, event):# 这里可以根据实际需求实现归因逻辑# 例如,如果用户在看到广告后进行了购买行为,那么可以将购买行为归因给广告if user_id in er_fingerprint:return {'attributed': True, # 表示该事件可以归因给广告'reason': 'saw_ad', # 归因原因,这里假设是因为用户看到了广告}else:return {'attributed': False, # 表示该事件不能归因给广告}# 使用示例:fingerprinter = Fingerprinter()user_fingerprint = fingerprinter.get_fingerprint()user_id = 'example_user_id' # 用户ID,可以是用户在应用内的唯一标识符,也可以是其他标识符event = 'purchase' # 事件类型,例如购买、注册等attribution = fingerprinter.get_attribution(user_id, event)print(f"User fingerprint: {user_fingerprint}")print(f"Attribution result: {attribution}")这个示例代码展示了一个简单的指纹识别和归因系统。
RT1011指纹识别仪模块用户手册

指纹识别仪模块用户手册1 FLASH存储结构a)存储结构:地址 内容 大小 0x0000—0x7fff Codes 32k words0x8000—0x87ff 系统存储区 2k words0x8800—0xffff 指纹库 30k words—结束b)该存储结构由ROM系统定义,若客户自行开发整套DSP软件,则不受此结构限制;c)指纹库大小随FLASH容量而变,系统会自动判别。
2 系统参数存储区结构d)系统参数存储区结构:页号 内容 注解 FLASH物理地址(字节地址)0x8000 0 保留0x8200 1 参数表0x8400 2 用户记事本0x8600 3 保留0x8800 4 保留0x8a00 5 保留0x8c00 6 保留0x8e00 7 指纹库索引表 可供索引2048枚指纹e)系统参数存储区分为8页,每页512字节。
3 用户记事本在FLASH中开辟了一个512字节的存储区域作为用户记事本,该记事本逻辑上被分成16页,每页32字节。
上位机可以通过PS_WriteNotepad指令和PS_ReadNotepad指令访问任意一页。
注意写记事本某一页的时候,该页32字节的内容被整体写入,原来的内容被覆盖。
4 缓冲区与指纹库芯片内设有一个72K字节的图像缓冲区与二个512 bytes(256字)大小的特征文件缓冲区,名字分别称为:ImageBuffer,CharBuffer1,CharBuffer2。
用户可以通过指令读写任意一个缓冲区。
CharBuffer1或CharBuffer2既可以用于存放普通特征文件也可以用于存放模板特征文件。
通过UART口上传或下载图像时为了加快速度,只用到像素字节的高四位,即将两个像素合成一个字节传送。
通过USB口则是整8位像素。
指纹库容量根据挂接的FLASH容量不同而改变,系统会自动判别。
指纹模板按照序号存放,序号定义为:0—N-1(N指指纹库容量)。
用户只能根据序号访问指纹库内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
'Parent', ud.hComponent5Axes);
%=================================
% 112.5度
ud.hComponent6Axes = axes(Ax, ...
'Position', [5*hs+4*175 vs/2 175 175]);
% - Features:特征可视化
% - FingerCode:在数据库中加入该指纹
% - Check:指纹匹配
%
%
%指纹识别中一个至关重要的步骤就是中心点的确定。如果剪切指纹图像时出现了任何
%错误,你可以使用辅助的m文件"vedicentro.m":它使得输入指纹可视化并计算指纹
%中心,借助于m函数"centralizing.m"。
% Defaults for image axes
Ax = Std;
Ax.Units = 'Pixels';
Ax.Parent = FpextractDemoFig;
Ax.ydir = 'reverse';
Ax.XLim = [.5 128.5];
Ax.YLim = [.5 128.5];
Ax.CLim = [0 1];
'Parent', ud.hComponent3Axes);
%================================
% 67.5度
ud.hComponent4Axes = axes(Ax, ...
'Position', [3*hs+2*175 vs/2 175 175]);
title('67.5度组成');
horizDecorations = 10; %调整大小.
vertDecorations = 45; %标题栏.
screenSize = get(0,'ScreenSize');
dx = screenSize(3) - figpos(1) - figpos(3) - horizDecorations;
Edit.BackgroundColor = 'white';
Edit.ForegroundColor = 'black';
Menu = Ctl;
Menu.Style = 'Popupmenu';
Text = Ctl;
Text.Style = 'text';
Text.HorizontalAlignment = 'left';
%框架
ud.hControlFrame = uicontrol(Std, ...
'Parent', FpextractDemoFig, ...
'Style', 'Frame', ...
'Units', 'pixels', ...
'Position', [vs/6 5*vs-vs/6-81 200 vs+vs/8], ...
if ~isempty(h)
figure(h(1))
return
end
screenD = get(0, 'ScreenDepth');
if screenD>8
grayres=256;
else
grayres=128;
end
FpextractDemoFig = figure( ...
'Name','指纹特征提取演示程序Modified by PRTsinghua@', ...
'Position', [cols-175 5*vs-vs/6 175 175]);
title('157.5度组成');
ud.hComponent8Image = image(Img, ...
'Parent', ud.hComponent8Axes);
%=================================
'BackgroundColor', bgcolor);
%====================================
%图像弹出菜单
ud.hImgPop = uicontrol(Menu, ...
'Position',[vs/6+vs/8 5*vs-2*vs/3+7 180 vs/16], ...
Ctl.Units = 'Pixels';
Ctl.Parent = FpextractDemoFig;
Btn = Ctl;
Btn.Style = 'pushbutton';
Btn.Enable = 'off';
Edit = Ctl;
Edit.Style = 'edit';
Edit.HorizontalAlignment = 'right';
Ax.XTick = [];
Ax.YTick = [];
Img = Std;
Img.CData = [];
Img.Xdata = [1 128];
Img.Ydata = [1 128];
Img.CDataMapping = 'Scaled';
Img.Erasemode = 'none';
Ctl = Std;
end
set(FpextractDemoFig, 'position', figpos);
rows = figpos(4);
cols = figpos(3);
% Colors
bgcolor = [0.45 0.45 0.45];%背景颜色
wdcolor = [.8 .8 .8];% Window颜色
title('原始指纹图像');
ud.hOriginalImage = image(Img, ...
'Parent', ud.hOriginalAxes);
ud.OriginalImageIsStale = 1;
%================================
% 157.5度
ud.hComponent8Axes = axes(Ax, ...
function fpextractdemo(action, varargin)
%FPEXTRACTDEMO指纹特征提取演示程序
% Modified by PRTsinghua@
%
%输入图像必须是256×256的灰度图
% 8-bit灰度级的图像@ 500 dpi.
%如果这些条件不满足,一些函数中的参数必须做相应的改变
title('0度');
ud.hComponent1Image = image(Img, ...
'Parent', ud.hComponent1Axes);
%================================
%原始指纹图像
ud.hOriginalAxes = axes(Ax, ...
'Position', [cols/2-128 5*vs-vs/6-81 256 256]);
dy = screenSize(4) - figpos(2) - figpos(4) - vertDecorations;
if (dx < 0)
figpos(1) = max(5,figpos(1) + dx);
end
if (dy < 0)
figpos(2) = max(5,figpos(2) + dy);
title('112.5度组成');
ud.hComponent6Image = image(Img, ...
'Parent', ud.hComponent6Axes);
%=================================
% 135度
ud.hComponent7Axes = axes(Ax, ...
% 22.5度
ud.hComponent2Axes = axes(Ax, ...
'Position', [hs vs/2 175 175]);
title('22.5度组成');
ud.hComponent2Image = image(Img, ...
'Parent', ud.hComponent2Axes);
'Position', [6*hs+5*175 vs/2 175 175]);
title('135度组成');
ud.hComponent7Image = image(Img, ...
'Parent', ud.hComponent7Axes);
%=================================
'String','Whorl|Twin loop|Left loop|Right loop|Other image', ...
'Callback','fpextractdemo(''LoadNewImage'')');