matlab的指纹识别系统 运行过程如视频所示 gui界面 源码代码大概论述指纹库今天咱们来拆解一个用MATLAB搞的指纹识别系统。这玩意儿看起来挺唬人的实际上拆开也就是预处理、特征提取、匹配三件套。先看效果——运行起来有个自带的GUI界面左边选指纹库右边实时显示处理过程最后给你蹦个相似度数值。先看核心的预处理代码段function enhanced_img preprocess(img) % 自适应直方图均衡 img_eq adapthisteq(img); % 方向场估算这个最耗性能 [orient_map,~] orientation_estimator(img_eq,16); % Gabor滤波增强 enhanced_img gabor_filter(img_eq, orient_map); % 二值化细化 enhanced_img bwmorph(enhanced_img graythresh(enhanced_img), thin, Inf); end这里有个坑要注意阈值别用全局的graythresh实测局部自适应效果更好。方向场计算那块用了16x16的块划分你要是想提速可以改大块尺寸但精度会扑街。特征点提取用的是经典的交叉点算法bifurcations []; ridgeEnds []; skel bwmorph(enhanced_img,skel,Inf); [rows,cols] find(skel); for k 1:length(rows) r rows(k); c cols(k); neighbor skel(r-1:r1, c-1:c1); neighbor(2,2) 0; % 挖掉中心点 if sum(neighbor(:)) 1 ridgeEnds [ridgeEnds; c r]; elseif sum(neighbor(:)) 3 bifurcations [bifurcations; c r]; end end这暴力遍历看着蠢但有效实测300x300图像处理也就0.2秒左右。特征点坐标记得要转极坐标存后面匹配时候算相对距离方便。matlab的指纹识别系统 运行过程如视频所示 gui界面 源码代码大概论述指纹库GUI界面核心在回调函数function loadFingerprint_Callback(hObject,~,handles) [file,path] uigetfile(*.bmp); if ~isequal(file,0) raw_img imread(fullfile(path,file)); enhanced_img preprocess(raw_img); axes(handles.axes1); imshow(raw_img); axes(handles.axes2); imshow(enhanced_img); setappdata(handles.figure1,template,extract_features(enhanced_img)); end end这里用setappdata来跨函数传递特征数据比global变量优雅点。注意axes控件切换前一定要带handles不然容易画错地方。指纹库建议别用网上那些老掉牙的数据库自己采集可以用手机摄像头透明胶带大法。存的时候记得按[姓名ID序号.bmp]格式命名后面管理起来方便。实测20人×5张的库在i5处理器上跑1vN比对大概3秒出结果。最后说下匹配算法里的骚操作——动态限界匹配match_score 0; for i 1:size(feat1,1) min_dist inf; for j 1:size(feat2,1) delta_theta abs(feat1(i,3)-feat2(j,3)); if delta_theta pi/4 % 超过45度直接pass continue; end dist norm(feat1(i,1:2)-feat2(j,1:2)); if dist 15 % 15像素距离阈值 min_dist min(min_dist, dist); end end if min_dist inf match_score match_score 1; end end这双循环看着时间复杂度爆炸实际因为提前做了极坐标转换和角度过滤200个特征点对200个特征点大概0.01秒搞定。分数归一化记得用双边特征数做分母别傻乎乎直接除以总点数。整个系统最大的槽点是没做活体检测拿照片也能骗过去。想升级的话可以加个脉搏检测模块或者上深度学习那套语义分割。不过对于课程设计级别的东西现在这版已经够导师眼前一亮了。
matlab的指纹识别系统 运行过程如视频所示 gui界面 源码+代码大概论述+指纹库
matlab的指纹识别系统 运行过程如视频所示 gui界面 源码代码大概论述指纹库今天咱们来拆解一个用MATLAB搞的指纹识别系统。这玩意儿看起来挺唬人的实际上拆开也就是预处理、特征提取、匹配三件套。先看效果——运行起来有个自带的GUI界面左边选指纹库右边实时显示处理过程最后给你蹦个相似度数值。先看核心的预处理代码段function enhanced_img preprocess(img) % 自适应直方图均衡 img_eq adapthisteq(img); % 方向场估算这个最耗性能 [orient_map,~] orientation_estimator(img_eq,16); % Gabor滤波增强 enhanced_img gabor_filter(img_eq, orient_map); % 二值化细化 enhanced_img bwmorph(enhanced_img graythresh(enhanced_img), thin, Inf); end这里有个坑要注意阈值别用全局的graythresh实测局部自适应效果更好。方向场计算那块用了16x16的块划分你要是想提速可以改大块尺寸但精度会扑街。特征点提取用的是经典的交叉点算法bifurcations []; ridgeEnds []; skel bwmorph(enhanced_img,skel,Inf); [rows,cols] find(skel); for k 1:length(rows) r rows(k); c cols(k); neighbor skel(r-1:r1, c-1:c1); neighbor(2,2) 0; % 挖掉中心点 if sum(neighbor(:)) 1 ridgeEnds [ridgeEnds; c r]; elseif sum(neighbor(:)) 3 bifurcations [bifurcations; c r]; end end这暴力遍历看着蠢但有效实测300x300图像处理也就0.2秒左右。特征点坐标记得要转极坐标存后面匹配时候算相对距离方便。matlab的指纹识别系统 运行过程如视频所示 gui界面 源码代码大概论述指纹库GUI界面核心在回调函数function loadFingerprint_Callback(hObject,~,handles) [file,path] uigetfile(*.bmp); if ~isequal(file,0) raw_img imread(fullfile(path,file)); enhanced_img preprocess(raw_img); axes(handles.axes1); imshow(raw_img); axes(handles.axes2); imshow(enhanced_img); setappdata(handles.figure1,template,extract_features(enhanced_img)); end end这里用setappdata来跨函数传递特征数据比global变量优雅点。注意axes控件切换前一定要带handles不然容易画错地方。指纹库建议别用网上那些老掉牙的数据库自己采集可以用手机摄像头透明胶带大法。存的时候记得按[姓名ID序号.bmp]格式命名后面管理起来方便。实测20人×5张的库在i5处理器上跑1vN比对大概3秒出结果。最后说下匹配算法里的骚操作——动态限界匹配match_score 0; for i 1:size(feat1,1) min_dist inf; for j 1:size(feat2,1) delta_theta abs(feat1(i,3)-feat2(j,3)); if delta_theta pi/4 % 超过45度直接pass continue; end dist norm(feat1(i,1:2)-feat2(j,1:2)); if dist 15 % 15像素距离阈值 min_dist min(min_dist, dist); end end if min_dist inf match_score match_score 1; end end这双循环看着时间复杂度爆炸实际因为提前做了极坐标转换和角度过滤200个特征点对200个特征点大概0.01秒搞定。分数归一化记得用双边特征数做分母别傻乎乎直接除以总点数。整个系统最大的槽点是没做活体检测拿照片也能骗过去。想升级的话可以加个脉搏检测模块或者上深度学习那套语义分割。不过对于课程设计级别的东西现在这版已经够导师眼前一亮了。