1、指纹传感器
- FTIR(Frustrated Total Internal Reflection),受抑全内反射。在屏幕的夹层中加入LED光线,当用户按下屏幕时,使夹层的光线造成不同的反射效果,感应器接收光线变化而捕捉用户的施力点。 明显的缺点:体积太大。薄膜晶体管TFT( Thin Film Transistor)是目前制造大型LCD面板的成熟且廉价的技术,它通过在玻璃基板上沉积非晶硅薄膜来创建晶体管。晶体管仅覆盖每个像素区域的一小部分,薄膜的其余部分被蚀刻掉以允许光线通过。为了开发TFT光学传感器,阵列的每个像素都由光电二极管和读出晶体管组成。TFT技术允许设计大面积面板和高分辨率设备。透明材料和柔性基板可用于将TFT光学传感器嵌入便携式设备的显示器中,或将它们包裹在曲面上。
- 高分辨率相机。非接触式采集。优点皮肤不会发生弹性变形,更卫生,传感器表面没有残留指纹。缺点指纹图像的对比度较低。
- 光学相干断层扫描(Optical Coherence Tomography,OCT)使用低相干光来捕获生物组织的深层图像,目前主要应用在医疗领域(观察皮肤、眼睛、血管等)。
- 电容传感器是嵌入面板的微型电容阵列。手指按在芯片上时,手指和每个电容之间形成了电荷。这些电荷的大小取决于指纹和电容之间的距离,指纹脊和谷导致板上的电容值不同。为了准确测量电容,研究者开放出各种方法以获得足够的灵敏度区分脊和谷。在第一代电容指纹传感器中,微电容阵列是嵌入在CMOS技术制造的硅片中,小面积。新一代的电容传感器是基于TFT工艺将传感器阵列嵌入在玻璃基板上,大面积,而且可以显示。TFT电容传感器的设计比光学TFT更简单,因为后者需要提供照明并引导反射的光子束汇聚在像素上。然而,电容技术的缺点是隔着较厚的玻璃难以获取高质量的指纹图像。
- 超声波传感是基于发送声学指向指尖的信号,并捕获回波信号(见下图),从回声信号计算指纹的脊线结构。主要组件是发送器和接收器。前者产生声脉冲,后者检测这些脉冲从指纹反弹时的响应。该方法是对手指较深层次的皮肤进行成像(甚至能透过薄手套),因此对脏手指、潮湿手指的成像比较好。
2、指纹特征提取
指纹的特征可以分为从粗到细的三个级别。
第一级:脊线方向场和频率图(脊线疏密程度)。按照傅里叶分析的观点,如果把局部脊线图像看作二维正弦波,一级特征就是正弦波的方向和频率,而不包括相位。一级特征中的方向场尤其重要。方向场在指纹的多数区域是平滑的,但在个别区域呈现出独特的形状(表现为脊线曲率变大、大量脊线终止)。这些区域称为奇异点或者奇异区,有两种基本类型:环形和三角形,奇异点通常位于手指中央。按照数学公式,仅用奇异点的位置和类型,就可以近似拟合出原始方向场;因此奇异点可以看作是方向场的非常紧致(compact)的表示;
第二级:脊线骨架图(细节点minutia是脊线的特殊点)。细节点的数量可以超过100个,实际仅需12-15个匹配细节点就足以推断两个指纹来自同一根手指。指纹识别算法通常只考虑两种基本类型:结束点和分叉点,因为其他复合细节点类型可以表示为结束点和分叉点的组合。由于细节点的属性至少包括位置和角度,实际上指纹的细节点集合包含了大量的一级特征;
第三级:脊线的内外轮廓(汗孔即内轮廓)。
3、指纹匹配
指纹匹配技术,最根本的差异在于指纹的特征表示,其次是对齐方法和匹配分数计算方法。
细节点是最著名和最广泛使用的指纹表示。优点:指纹鉴定专家在比对指纹时也主要关注细节点;存储空间小;鉴别能力强(信息量大)。缺点:当传感器的面积很小时,例如只有4-5个细节点,细节点匹配技术的性能也会剧烈下降;由于细节点数量可变和缺乏自然顺序,匹配算法的复杂度较高。
除了细节点集合,还有方法:灰度图像;脊线方向场;脊线图;经验设计的纹理特征;深度网络学习的特征;关键点集合;多种表示的融合。
细节特征点的数量、位置和所在区域的纹线方向来度量,细节特征的集合形成一个拓扑结构?。指纹匹配就是两个拓扑结构的匹配问题。
目前主流的匹配方法主要分为模板匹配、图像相关、细节匹配、纹线匹配。
1)模板匹配:这类方法多利用指纹的纹理信息,如比较两枚指纹的指纹及其插值改进模板等,通过计算模板之间的相似程度来得到两枚指纹的匹配结果。模板匹配方法的匹配速度较快,但建立模板常需要进行多次滤波,滤波的耗时会极大地影响登录的速度。对于许多类型相似的指纹,从宏观角度描述的模板缺乏足够的鉴别能力。
2)图像匹配:这类方法借鉴一般图像匹配的思路,找到指纹图像的参考点之后,对整幅指纹图像进行相关处理,计算其相似程度来鉴别身份。这种方法在上这种方法非常适合在线识别,但受指纹质量影响较大,需要采集者密切配合。这种方法对于形变和劣质指纹具有较明显的优势,但是匹配速度较慢。
3)纹线匹配:这类方法将纹线作为指纹匹配的直接对象,首先比较两条纹线之间的相似程度,然后计算判断其附近的纹线是否匹配,接着选取匹配程度最大的纹线对作为参考纹线,计算其它纹线的相似程度。相对于点模式匹配,这类方法判断纹线是否匹配时有很多的判断,速度较慢。在非线性形变的影响下,纹线的严格匹配关系难以准确建立。
4)细节匹配:这类方法主要利用了指纹细节点之间对应关系的不变性。点模式匹配是其中的典型代表,它首先提取指纹的细节点特征,形成特征点集,然后对输入指纹和模板指纹的细节点集进行比对,对输入指纹的细节点进行几何变换之后,寻找模板指纹中对应的细节点,在重合面积内找到的细节点数目超过一定阈值,则两者可视为来自同一手指。
模板匹配方法步骤
1、特征提取
指纹的特征提取,用3x3的模板逐点对细化后的指纹图像的脊线进行检测,就可以初步选出所有的细节特征,记录下这些细节特征的类型和位置坐标,以便于下一步的剪枝处理。先去除伪特征端点,得到想要的特征点和中心点。特征端点用’o’标注,特征分叉点用’+‘标注,中心点用红色’*'标注。
2、指纹的匹配
- 根据得到的特征端点和特征点进行分类,特征端点分类为1,特征分叉点分类为2;
- 建立特征端点和特征分叉点相对中心点的距离向量;
- 建立特征端点和特征分叉点相对中心点的方向向量。
- 按相同的原理得到待匹配指纹的特征点和特征端点;
- 选用点类型匹配?,找到一个指纹细化图像的特征点后,在该端点周围找到四十个端点或者交叉点,统计在这四十个特征点中端点的个数和交叉点的个数。若有两幅指纹细化图像中的端点所占的比例近似相同,则两幅图像相匹配,越近似,则越相同。
opencv实现指纹匹配
以下是一个简单的示例,演示了如何使用OpenCV库中的指纹识别算法进行指纹匹配。
import cv2
import numpy as np
def match_fingerprints(fingerprint1, fingerprint2):
# 读取指纹图片
img1 = cv2.imread(fingerprint1, 0)
img2 = cv2.imread(fingerprint2, 0)
# 提取指纹特征点
orb = cv2.ORB_create(nfeatures=5000)
keypoints1, descriptors1 = orb.detectAndCompute(img1, None)
keypoints2, descriptors2 = orb.detectAndCompute(img2, None)
# 匹配指纹特征点
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
matches = sorted(matches, key=lambda x: x.distance)
# 计算匹配率
num_matches = len(matches)
num_good_matches = int(num_matches * 0.7) # 选取前70%的匹配点
good_matches = matches[:num_good_matches]
match_score = len(good_matches) / float(num_matches)
return match_score
```
matlab实现指纹匹配
以下是一个简单的示例,使用MATLAB自带的Image Processing Toolbox进行指纹图像处理和特征提取。
```
% 读取指纹图片
fingerprint1 = imread('fingerprint1.png');
fingerprint2 = imread('fingerprint2.png');
% 对指纹图像进行预处理
preprocessed_fingerprint1 = preprocess_fingerprint(fingerprint1);
preprocessed_fingerprint2 = preprocess_fingerprint(fingerprint2);
% 提取指纹特征
feature_vector1 = extract_fingerprint_features(preprocessed_fingerprint1);
feature_vector2 = extract_fingerprint_features(preprocessed_fingerprint2);
% 计算匹配分数
match_score = calculate_match_score(feature_vector1, feature_vector2);
function preprocessed_fingerprint = preprocess_fingerprint(fingerprint)
% 将指纹图像转换为灰度图像
grayscale_fingerprint = rgb2gray(fingerprint);
% 进行直方图均衡化以增强对比度
equalized_fingerprint = histeq(grayscale_fingerprint);
% 使用高斯滤波器平滑图像
gaussian_filtered_fingerprint = imgaussfilt(equalized_fingerprint, 2);
% 对图像进行二值化处理
binary_fingerprint = imbinarize(gaussian_filtered_fingerprint);
% 去除噪声
noise_removed_fingerprint = medfilt2(binary_fingerprint);
% 对图像进行形态学处理
se = strel('disk', 3);
preprocessed_fingerprint = imdilate(noise_removed_fingerprint, se);
end
function feature_vector = extract_fingerprint_features(preprocessed_fingerprint)
% 使用方向性梯度直方图提取特征
[Gx, Gy] = imgradientxy(preprocessed_fingerprint);
[Gmag, Gdir] = imgradient(Gx, Gy);
feature_vector = extractHOGFeatures(preprocessed_fingerprint, 'CellSize', [8 8], 'BlockSize', [2 2]);
end
function match_score = calculate_match_score(feature_vector1, feature_vector2)
% 计算两个指纹特征向量之间的欧几里得距离
match_score = norm(feature_vector1 - feature_vector2);
end
```
参考资料6。matlab实现特征提取,端点和分叉点。没有指纹匹配。
%Program for Fingerprint Minutiae Extraction
%
%Author : Athi Narayanan S
%Senior Research Associate
%http://sites.google.com/site/athisnarayanan/
%s_athi1983@yahoo.co.in
%
%Program Description
%This program extracts the ridges and bifurcation from a fingerprint image该程序从指纹图像中提取脊和分叉
%Read Input Image
%基于阈值的方法将输入图像转换为m×n矩阵形式的二值图像bw
binary_image=im2bw(imread('input_1.tif'));
% Small region is taken to show output clear
% 显示部分二值化指纹
binary_image = binary_image(120:400,20:250);
figure;imshow(binary_image);title('Input image');
% Thinning
% bwmorph对二值图像的形态学运算。‘thin’通过从对象边界删除像素,将对象收缩为线。使没有孔洞的对象收缩为具有最小连通性的线,有孔洞的对象收缩为每个孔洞和外边界之间的连通环。执行inf次。显示。
thin_image=~bwmorph(binary_image,'thin',Inf);
figure;imshow(thin_image);title('Thinned Image');
% Minutiae extraction
% 特征提取。分叉点bifurcation和脊ridge。
s=size(thin_image);
N=3;%window size
n=(N-1)/2;
r=s(1)+2*n;
c=s(2)+2*n;
double temp(r,c);
temp=zeros(r,c);bifurcation=zeros(r,c);ridge=zeros(r,c);
temp((n+1):(end-n),(n+1):(end-n))=thin_image(:,:);
outImg=zeros(r,c,3);%For Display
outImg(:,:,1) = temp .* 255;
outImg(:,:,2) = temp .* 255;
outImg(:,:,3) = temp .* 255;
for x=(n+1+10):(s(1)+n-10)
for y=(n+1+10):(s(2)+n-10)
e=1;
for k=x-n:x+n
f=1;
for l=y-n:y+n
mat(e,f)=temp(k,l);
f=f+1;
end
e=e+1;
end;
if(mat(2,2)==0)
ridge(x,y)=sum(sum(~mat));
bifurcation(x,y)=sum(sum(~mat));
end
end;
end;
% RIDGE END FINDING
% 寻找端点。
[ridge_x ridge_y]=find(ridge==2);
len=length(ridge_x);
%For Display
for i=1:len
outImg((ridge_x(i)-3):(ridge_x(i)+3),(ridge_y(i)-3),2:3)=0;
outImg((ridge_x(i)-3):(ridge_x(i)+3),(ridge_y(i)+3),2:3)=0;
outImg((ridge_x(i)-3),(ridge_y(i)-3):(ridge_y(i)+3),2:3)=0;
outImg((ridge_x(i)+3),(ridge_y(i)-3):(ridge_y(i)+3),2:3)=0;
outImg((ridge_x(i)-3):(ridge_x(i)+3),(ridge_y(i)-3),1)=255;
outImg((ridge_x(i)-3):(ridge_x(i)+3),(ridge_y(i)+3),1)=255;
outImg((ridge_x(i)-3),(ridge_y(i)-3):(ridge_y(i)+3),1)=255;
outImg((ridge_x(i)+3),(ridge_y(i)-3):(ridge_y(i)+3),1)=255;
end
% BIFURCATION FINDING
% 寻找分叉点。
[bifurcation_x bifurcation_y]=find(bifurcation==4);
len=length(bifurcation_x);
%For Display
for i=1:len
outImg((bifurcation_x(i)-3):(bifurcation_x(i)+3),(bifurcation_y(i)-3),1:2)=0;
outImg((bifurcation_x(i)-3):(bifurcation_x(i)+3),(bifurcation_y(i)+3),1:2)=0;
outImg((bifurcation_x(i)-3),(bifurcation_y(i)-3):(bifurcation_y(i)+3),1:2)=0;
outImg((bifurcation_x(i)+3),(bifurcation_y(i)-3):(bifurcation_y(i)+3),1:2)=0;
outImg((bifurcation_x(i)-3):(bifurcation_x(i)+3),(bifurcation_y(i)-3),3)=255;
outImg((bifurcation_x(i)-3):(bifurcation_x(i)+3),(bifurcation_y(i)+3),3)=255;
outImg((bifurcation_x(i)-3),(bifurcation_y(i)-3):(bifurcation_y(i)+3),3)=255;
outImg((bifurcation_x(i)+3),(bifurcation_y(i)-3):(bifurcation_y(i)+3),3)=255;
end
figure;imshow(outImg);title('Minutiae');
运行结果:
嵌入式平台/实际传感器中的指纹识别
使用电容式指纹传识别模块AD-013。指纹识别芯片上的型号是杭州晟元芯片技术有限公司(Synochip)的AS608。模块厂商基于AS608设计外围电路,集成一个可供2次开发的指纹模块,比如 AS608+电容传感器、 AS608+摄像头。所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。
指纹特征提取和匹配算法已经存储在AS608芯片ROM内,无法得知。模块只能完成后续工作,或使用模块开发其他场景应用,如使用指纹控制舵机模仿指纹锁功能等。
AS608用户手册(中文版)(ADH版)要点:
- 参数表由MCU初始化程序(ROM或用户定义)在芯片第一次通电时配置,结果存储在FLASH(的SPM区域)。上电后,DSP初始化程序将参数表从FLASH加载到RAM,然后根据参数表初始化寄存器。参数表的长度为64word(128byte)在RAM中的地址是0x200~0x23F。
- 芯片中有一个72K字节的图像缓冲区ImageBuffer和两个512字节的特征文件缓冲区CharBuffer1和CharBuffer2。用户可以通过指令读取/写入上述任何缓冲区。CharBuffer1或CharBuffer2可用于存储常规要素文件和模板要素文件。为了减少通过UART接口上传或下载图像时的通信时间,只应用像素字节的高4位,即在传输时将两个像素字节合并为一个字节。在通过USB接口进行传输时,没有这样的技巧。指纹数据库的容量随着FLASH存储器容量的变化而变化,FLASH存储器的容量由系统自动识别。指纹模板按照序列号顺序存储,序列号的定义为:0~(N-1)(N=指纹数据库容量)。注意:只有通过序列号索引,用户才能访问指纹数据库。
- 指纹特征文件占用256字节,包括一般信息(56byte)和细节信息(200byte,每个细节4byte,具体见图),即一个指纹不超过50个细节特征;模板文件占用512字节,是同一指纹的两个特征文件的总和。
- ROM包含完整的指纹识别系统,包括通信协议、命令解释、算法、FLASH管理以及传感器FPC1011C、LTT C500(或HF105)的驱动程序。因此,如果实现了传感器FPC1011C或LTT C500,除了引脚GPIO[13:8]的正确设置外,在整个系统的构建中不需要加载或写入额外的驱动器。
- MCU SOC可以与几个必要的外围电路(传感器、闪光灯、电源等)组成完整的指纹识别模块。该模块始终处于从模式。主机可以针对各种功能向模块发出不同的指令。主机指令、模块ACK和数据交换都是按照给定格式的数据包工作的。主机应根据以下格式对需要传输的指令和数据进行分组,并分析接收到的数据分组。对于多字节数据,高字节在前,低字节在后。
- 确认码ACK是向主机报告相关的命令运行情况和结果,ACK包包含参数,可以与连续数据包在一起。只有当主机接收到SOC的ACK包时,才能确认SOC包接收和指令执行的条件。根据手册在库文件h中定义。
- 指令集。包含多个函数,在库文件.cpp中实现。举例:PS_UpImage函数上传图像。功能:将模块图像缓冲区ImageBuffer中的数据上传给上位机。输入参数:none。返回参数:确认字。指令代码:0x0a。1byte包含2像素,每个像素有4bit。AD013的传感器是160x160 pixels。
AD013电容传感器参数如下:
1、硬件连接
传感器模块板如下,6个端口引脚:1电源3.3v、2地GND、3RX串口输入、4TX串口输出、5和6脚不接。中间方块部分空缺芯片即为AS608。
RX、TX分别接入arduino UNO的6、7脚。连接规则源于主程序。
SoftwareSerial mySerial(6, 7);
以下是AD013原理图。左边芯片是电容传感器,右边芯片是AS608。J1为AS608和UNO的接口。
2、程序调试
在连接指纹传感器之前,先测试arduino开发板是否正常工作,再安装指纹识别芯片库文件。
- 设置开发板。“工具”→“端口”选择连接到电脑的端口COM?,“工具”→“开发板”选择开发板型号‘UNO’。
- 指示灯闪烁示例。“文件”→“示例”blink,“项目”→“上传”代码上传到开发板的程序存储空间。
- 串口调试。“工具”→“串口监视器”。
- 添加/管理库文件。“项目”→“包含库”,添加自己的库文件,或直接搜索网络上的库文件。在库管理重搜索并安装 Adafruit_Fingerprint库,该库就是AS608的库。库文件必须包含至少3个文件:头文件h、函数文件cpp、库参数文件library.properties,缺少这些文件就无法添加库。
3、程序结构分析
程序由3部分组成:
- 主程序文件.ino。完成逻辑功能。
- .h文件。宏定义20多个确认码;宏定义10多个指令代码;定义1个结构体表示UART数据包;定义1个类表示指纹,声明所有函数但不定义。还定义了LED控制相关宏,不具有通用性不做解释。注:宏定义确认码和指令码非必须,但可以让程序易读。
- .cpp文件。指纹类的所有函数定义;宏定义发送和接受指令2个函数。
这样的程序结构设计理由来源于C++文献20,8.5.2节的类声明和成员函数定义的分离。
4、实验与结果分析
主程序按不同功能分3个,程序来源资料14《Using Lcd1602 ,Arduino uno and as608》。
实验1:enroll。指纹录入。
第一步:在setup程序段中,检查传感器是否连接,并返回传感器参数:存储容量、设备安全等级、设备地址、波特率。
如果找到传感器,在串口监视器中显示:
Adafruit Fingerprint sensor enrollment
Found fingerprint sensor!
Reading sensor parameters
Status: 0x0
Sys ID: 0x0
Capacity: 40
Security level: 3
Device address: FFFFFFFF
Packet len: 128
Baud rate: 57600
Ready to enroll a fingerprint!
Please type in the ID # (from 1 to 127) you want to save this finger as...
未连接成功返回:
Adafruit Fingerprint sensor enrollment
Did not find fingerprint sensor :(
第二步:循环录入指纹。在loop程序段中,输入指纹编号(1~127),将手指放在传感器上录入指纹,成功后返回“Image taken”,接着指纹图像自动生成特征,存入特征缓冲区CharBuffer1,成功后返回“Image converted”,手指离开传感器,等待2秒后,再次录入相同指纹,成功后返回“Image taken”,接着指纹图像自动生成特征,成功后返回“Image converted”,存入CharBuffer2,两次录入都成功后,自动生成该指纹的模板,自动储存模板。等待下一个指纹录入。
用到的指令函数:获取指纹getImage(),生成指纹特征image2Tz(),生成指纹模板createModel(),储存指纹模板storeModel()。其中image2Tz(区号)带参数“1”或“2”,分别存入2个缓冲区.
参考资料:
1、指纹识别_minutiae的博客-CSDN博客 https://blog.csdn.net/minutiae/category_12149402.html
2、【指纹识别】基于matlab GUI指纹打卡系统【含Matlab源码 867期】_matlab指纹识别_海神之光的博客-CSDN博客 https://blog.csdn.net/TIQCmatlab/article/details/116308915
3、指纹的特征提取和匹配研究- 附部分代码_dhmbt04664的博客-CSDN博客 https://blog.csdn.net/dhmbt04664/article/details/101647305
4、【老生谈算法】基于matlab的指纹处理和识别算法详解及程序源码——指纹识别算法_阿里matlab建模师的博客-CSDN博客 https://blog.csdn.net/m0_53407570/article/details/124617860?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-16-124617860-blog-101647305.235%5Ev27%5Epc_relevant_default_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-16-124617860-blog-101647305.235%5Ev27%5Epc_relevant_default_base1&utm_relevant_index=22
5、Fingerprint Minutiae Extraction - File Exchange - MATLAB Central https://ww2.mathworks.cn/matlabcentral/fileexchange/31926-fingerprint-minutiae-extraction?s_tid=srchtitle_extract%20fingerprint_8
6、针对二值图像的形态学运算 - MATLAB bwmorph - MathWorks 中国 https://ww2.mathworks.cn/help/images/ref/bwmorph.html?searchHighlight=bwmorph&s_tid=srchtitle_bwmorph_1
7、SEN-15338 - SparkFun | Development Boards | Evelta https://evelta.com/uart-capacitive-fingerprint-scanner-module/
8、AS608指纹模块详解_跋扈洋的博客-CSDN博客 https://blog.csdn.net/qq_44629109/article/details/108582138
9、AD-013- ADH Technology Co. Ltd. http://www.adh-tech.com.tw/?83,ad-013
10、【Arduino教學】實作01-基礎Blink_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1YW411Z76E?p=4&vd_source=28b3868c0af23aa93c8a1590fa7a0ae1
11、电容式指纹识别传感器Wiki - DFRobot https://wiki.dfrobot.com.cn/_SKU_SEN0348_%E7%94%B5%E5%AE%B9%E5%BC%8F%E6%8C%87%E7%BA%B9%E8%AF%86%E5%88%AB%E4%BC%A0%E6%84%9F%E5%99%A8#target_6
12、指纹锁—AS608指纹模块_待在图书馆的毛毛虫的博客-CSDN博客 https://blog.csdn.net/wxhxiaowen/article/details/126872173
13、arduino程序封装成静态库_arduino 静态库_Jan___的博客-CSDN博客 https://blog.csdn.net/mynameisjw/article/details/121036878
14、GitHub - jefine/Arduino-Fingerprint: Using Lcd1602 ,Arduino uno and as608 https://github.com/jefine/Arduino-Fingerprint
15、中文数据手册 https://cdn-shop.adafruit.com/datasheets/DY001fingerprint.pdf
16、自己写传感器的Arduino驱动_清晨曦月的博客-CSDN博客 https://blog.csdn.net/zcsor/article/details/123459143
17、如何编写自己的Arduino库? - lulipro - 博客园 https://www.cnblogs.com/lulipro/p/6090407.html
18、编写Arduino库文件(二) - 知乎 https://zhuanlan.zhihu.com/p/483677371
19、电容式指纹识别传感器Wiki - DFRobot https://wiki.dfrobot.com.cn/_SKU_SEN0348_%E7%94%B5%E5%AE%B9%E5%BC%8F%E6%8C%87%E7%BA%B9%E8%AF%86%E5%88%AB%E4%BC%A0%E6%84%9F%E5%99%A8#target_6
20、《C++程序设计(谭浩强)》
21、
22、
23、文章来源:https://www.toymoban.com/news/detail-416379.html
24、文章来源地址https://www.toymoban.com/news/detail-416379.html
到了这里,关于指纹识别q的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!