自动识别应用的开发所涉及的领域非常广泛,采用的技术手段也各不相同。针对二维码、RFID和声纹等自动识别技术所开发的应用已经深入到人们的日常生活之中。
随着移动互联网和智能手机的发展,使得手机二维码得到了广泛应用。利用手机摄像头实现二维码的识别,不仅克服了传统识别设备价格昂贵、体积大、不便于携带等缺点,还可将数据信息随时上传到网络。手机二维码在O2O(线上到线下)中,实现了信息的快速传递,成为线上线下结合的关键接口。
Android是目前智能手机的主流操作系统之一,在Android平台上实现二维码生成和识别应用需要用到第三方开发包,如Qrcode_swetake.jar提供的编码API、QRCode.jar提供的解码API和谷歌提供的开源类库ZXing,前两者专门用于QR二维码的编解码,ZXing还能够用来识别多种格式的条码和二维码。2014年,我国正式发布二维码统一编解码SDK,涵盖多种码制、多种操作系统和多种应用终端。
二维码识别系统的开发通常包含两部分:二维码的生成和二维码的识别。生成二维码时,调用编码API将用户输入的字符转换成二维数组,然后调用绘制功能完成对二维码的图形绘制。识别二维码时,首先是调用手机的摄像头完成二维码图像的采集,然后调用解码API将二维码符号携带的信息译出。
1.二维码的生成
二维码的生成主要是靠相应的编码包,将用户输入的字符转换成二维数组,然后根据二维码的编码规范,使用绘图功能对二维码进行绘制。
二维码的生成主要分为名片、短信、文本、电子邮件和网络书签的生成,系统应该提供相应的交互界面,让用户选择自己想要生成的类型,并输入数据,具体的开发步骤如下。
1)编写交互界面,供用户输入需要生成的字符串内容。
2)编写QR码的编码函数,方法是调用第三方开发包Qrcode_swetake.jar,导入com.swetake.util.Qrcode,利用Qrcode.calQrcode()函数将输入的字符串转变成二维数组。
3)编写二维码的绘制函数,方法是利用Canvas类完成对QR二维码的绘制,并通过交互界面上的ImageView控件显示生成的二维码。
2.二维码的识别
二维码的识别模板主要包括图像预处理和解码两部分。图像预处理是为了实现更好的识别效果,通过摄像头采集的二维码图像可能会有光照不均、图像模糊扭曲等问题,通过图像预处理可以使这些问题得到矫正,提高识别效率。预处理后的二维码按照译码标准提取数据。
进行二维码识别时,首先启动摄像头进行扫描,将检测到的图像进行预处理,然后将图像数据送入后台解析。若解析成功,弹出对话框显示识别出的信息,若解析不成功,则再次调用摄像头,重复前面步骤,直到预设定的时间之后,结束扫描,弹出对话框,显示扫描失败。具体的开发步骤如下。
1)编写图像采集模块,使用Camera类来完成摄像头的调用和图像采集。通过实现Camera.PreviewCallback的接口onPreviewFrame(byte[]data,Camera camera)来获得摄像头的图像数据data。为了能够得到清晰的图像,需要调用Autofocus Callback自动对焦,每隔一定时间自动对焦一次。
2)编写预处理模块,完成对所采集图像的灰度化、二值化、图像滤波、定位和校正。在实际编程实现中,该部分属于对识别效果的优化步骤,也可以省略预处理模块,直接将采集的图像交由解码函数解码。
3)编写QR二维码的解码函数,方法是调用第三方开发包QRCode.jar,导入jp.sourceforge.qrcode.QRCodeDecoder,利用QRCodeDecoder.decode()函数依照解码规范对预处理后得到的QR码符号部分进行解码,将图像解析为数据信息,最后输出数据。
RFID技术目前已被应用于各行各业,在学校食堂、公交车上及一些小区的门卫处,都能见到以RFID技术为基础的应用系统。以门禁系统为例,系统通过RFID读写器读取通行人员所持门禁卡携带的身份信息与数据中心存储的数据进行比对,认证通过后向微控制器发送指令来控制打开电磁锁放行,从而实现人员身份的快速确认,自动完成从身份认证到放行的整个过程。
1.门禁系统的构成
门禁系统分为3个子系统,即RFID管理系统、数据库管理系统和门禁控制系统,其结构图如图3-20所示。
图3-20 门禁系统结构图
1)RFID管理系统由RFID读写器和计算机上的控制程序组成,负责完成人员信息的采集和识别功能。标签的ID信息是持卡人身份的判别标志,系统控制程序会将读取的标签ID信息与数据库中的持卡人ID信息进行比对,比对结果将作为持卡人是否可以通过的判据。
2)数据库管理系统是门禁系统的数据中心,负责建立人员信息库,方便系统查询持卡人的通过权限。对于一个需要管理流动人口信息的门禁系统,数据库的删除、更新和查找等操作必不可少,这些操作确保了门禁系统的正确运行。
3)门禁控制系统是门禁系统的控制中心,主要包括微控制器和电磁锁。它的主要功能是识别开关门信息,依据判别结果完成自控门的开关操作。
2.门禁系统的实现
本例中的门禁管理系统RFID读写器采用RFID开发板JT-2860实现,如图3-21所示。读写器的主要功能是读取和设置电子标签携带的用户信息,并将得到的用户信息上传给整个系统的处理中心。系统的处理中心为一台运行有门禁系统应用软件的计算机,同时也作为人员信息数据库的服务器。门禁的控制系统采用STC89C52RC单片机,负责获取系统的处理中心的开关门标志,并控制门禁电磁锁的开闭。
图3-21 JT-2860开发板实物图
JT-2860开发板采用超高频读写模块,该超高频读写模块有以下几个特点。
1)功耗低,供电电源为3.5~3.8V,所允许的最大工作电流为200mA。
2)读卡的灵敏度高,模块的输出功率最大可以达到24dBm,一般可以读取1m内的有效标签,写入距离也达到15cm。
3)EPC区、保留区和用户区都支持加密解锁功能,确保标签信息的安全性。
4)支持相邻判别功能,可防止同一张卡在短时间(1~255s可调)内重复上传。
超高频读写模块采用异步串口通信协议(UART),通过FCP排线(可在一定程度内弯曲的连接线组)与开发板相连。FCP排线引脚中的P1是模块接地脚。P2、P3是UART2通信接口。P5、P7是UART1通信接口。P4是工作在触发模式时的外部触发源。P6是读卡成功后输出的3.3V提示电压。P8由外接CPU控制,以达到模块电源使能控制的效果。P9是蜂鸣器输出脚,该引脚上可以外加一个蜂鸣器,当成功读卡时,会发出读卡成功的提示音。
JT-2860开发板为连接计算机提供了RS-232和USB接口。运行有控制程序的计算机可以通过串口或者USB接口向RFID读写模块发送指令。在开发控制程序时,既可以根据读写器的通信协议自行编写通信程序,也可以直接使用模块生产商提供的应用程序开发包(SDK)。SKD为读写模块应用程序的开发者提供与读写模块功能相对应的API,包括开关串口、初始化标签和读写标签等功能。通常SDK以动态链接库文件形式提供给开发者使用,可以帮助开发者高效、正确地完成应用软件的开发。应用软件的开发步骤如下。
1)在计算机上安装开发环境Visual C++6.0。
2)在VC 6.0中建立一个基于对话框的MFC项目,并完成用户界面的设计。
3)将SDK中的dll及其lib文件添加到链接路径,并在代码中添加对dll的头文件的引用。
4)调用SDK提供的API,完成对RFID读写器的控制功能。
声纹识别技术也称为说话人识别技术,是一种新型的基于生物特征的认证技术。通过提取语音信号中携带的个性特征信息,进行模型训练和比较识别,可以自动确定说话人的身份。该技术具有广泛的应用前景,在互联网、经济领域和军事安全等各个领域都起到了重要作用。
1.声纹识别系统的框架和匹配方法
声纹识别系统的逻辑框图如图3-22所示,整个系统分为训练和识别两部分。训练阶段的过程是指记录说话人随意说出的一段话,不限定内容,提取该段语音中的特征参数,然后建立该说话人自己的模型参数集。识别阶段的过程是提取待测语音的特征参数,与训练阶段得到的说话人的数据集合进行比较,并按照相似性准则进行判决。
图3-22 声纹识别系统的逻辑框图
目前声纹识别的模式匹配方法分为以下几种。
1)动态时间规整方法(DTW)。由于说话人的语音有稳定因素(发声器官的结构和发声习惯等)和不稳定因素(语速、语调、重音和韵律等),所以将识别的模板与参照模板进行时间对比,得出两个模板之间有多大程度的相似。
2)矢量量化方法(VQ)。按照一定的失真测度,利用特定算法将数据进行分类。该方法判断速度较快,精度较高。
3)隐马尔可夫模型方法(HMM)。它是基于状态转移概率矩阵和输出矩阵的模型,在与文本无关的说话人识别过程中采用各态遍历型HMM,它不需要时间规整,可以节约计算时间和存储量,但计算量较大。
4)高斯混合模型方法(GMM)。求取特征参数的混合权重、均值和协方差,建立说话人模型,然后把待测语音的特征参数输入每个说话人模型,以计算得到的概率值最大的说话人作为判决结果。
2.语音库的建立与系统仿真
在进行声纹识别系统的仿真之前,首先要建立语音库,语音库是整个实验的基础。录制过程需要在一个比较安静的环境中进行,利用计算机上的麦克风(传声器)等即可,录音软件可采用系统软件或Adobe Audition等。说话人以正常语速和语调叙述一段内容,说话内容、采样频率和采样位数均不限,将语音文件保存为wav格式。每位说话人录两段语音,一段作为训练语音,另一段作为识别语音。每次录音长度为20s,录取结束后用Adobe Audition软件把每段语音前面的空白去掉,并截取每段语音为15s。最后对每段语音都进行标记,按照统一的规则对其进行命名。
语音库建立之后,采用MATLAB软件对声纹识别系统进行仿真,需要下载voicebox工具放到MATLAB的路径下。
首先进行训练过程,用wavread()函数读取语音信号之后进行预处理,用filter()函数实现预加重,预加重系数取0.95。然后进行分帧加窗处理,用enframe()函数对读取的语音序列进行分帧,帧长为256,帧移为80,窗函数选择汉明窗。
接下来是特征参数的提取,选取比较常用的梅尔倒谱系数(MFCC)。利用melbankm函数生成mel滤波器系数,mel滤波器的个数为20,阶数为32,提取后得到MFCC参数和一阶差分MFCC参数。
提取参数之后开始进行概率统计模型GMM的训练。GMM模型的混合度选择32,用K-means的方法求得均值和协方差的初始值,每个高斯函数的权重相同,迭代次数选择50次。用EM参数估计的方法求得每个说话人模型的均值、协方差和权重,建立每个说话人的训练模型,并进行存储。
识别阶段的预处理和特征参数提取过程与训练阶段基本相同。将预处理后的待测语音的特征参数代入之前训练好的每个说话人的模型中,以求得的概率值最大的说话人作为识别结果。