指纹识别系统设计(VC++)

news2024/12/23 13:54:44

目 录
摘 要 I
Abstract II
1绪论 1
1.1选题背景及意义 1
1.2研究现状 2
1.3研究主要内容 2
2技术介绍 3
2.1软件环境 3
2.1.1 C++的产生和发展以及特点简介 3
2.1.2 Visual C++6.0简介及其优点 5
2.2硬件环境 5
3指纹识别系统需求分析 6
3.1业务需求分析 6
3.2功能需求分析 6
3.3性能需求分析 7
4指纹识别系统总体设计 8
4.1指纹模式对象的信息量 8
4.2指纹识别系统算法的组成及流程 11
4.3指纹识别系统总体算法流程规划 14
5指纹识别系统的详细设计 15
5.1指纹识别系统界面设计 15
5.2指纹图像预处理算法 18
5.2.1 指纹图像畸变矫正 18
5.2.2指纹图像方向场和分割 22
5.2.3指纹图像均衡 25
5.2.4指纹图像去噪 26
5.2.5指纹图像的智能化增强 27
5.2.6指纹图像二值化 28
5.2.7指纹图像的细化 30
5.3指纹图像特征点提取 31
5.3.1 指纹特征端点的提取 31
5.3.2 指纹特征交叉点的提取 31
5.3.3 指纹特征中心点和三角点的提取 32
5.4指纹图像匹配 33
5.4.1指纹图像的配准 33
5.4.2 指纹图像的匹配 33
5.5指纹采集仪的制作 34
结 论 36
致 谢 37
参考文献 38
3指纹识别系统需求分析
在进行指纹识别系统的开之前发,我们必须首先了解与分析用户与市场的需求。在做一个软件之前做需求调研是不可不缺少的,因为我们不能做一个没有实际用户的软件。通过调研,我们就可以知道,我们所做的软件是否实用,并且可以给软件所具有的功能作出导向。因此需求分析是整个设计过程的基础,它可以直接影响到软件的开发速度和质量。
经过现场的调研,本章主要对指纹系统的业务需求、功能需求、性能需求、软件需求进行详细分析。需求分析是整个设计过程的基础,它将直接影响应用程序的开发速度与质量,所以对指纹识别系统的需求调研分析必不可少。
3.1业务需求分析
指纹识别系统在业务上的应用主要是起到一个身份鉴别的作用。身份鉴别就像一把钥匙,也可以理解为权限,只有得到了这把钥匙,我们才能进行接下来的工作。它就犹如一个大门,只允许主人进去,一切陌生人都被拒之门外。传统的身份鉴别作用越来越不能适应当今社会的脚步,而且可应用的范围很小。指纹识别技术在身份鉴别上的应用顺应历史潮流,势不可挡。
指纹识别系统可以应用在社会服务管理、医保服务管理、身份护照管理、银行账户管理、智能家居管理等等。把指纹识别系统嵌入在身份验证模块中,只需要本人的指纹轻轻一按,就能快速识别,进入接下来的工作,快捷,安全。在上面的这些行业中迫切需要指纹识别技术的加入让工作变的轻松,简单[4]。
3.2功能需求分析
通过一系列的调查研究,对应上一节的业务需求分析,本节主要从指纹识别系统的几个功能模块指纹图像采集、指纹图像预处理、指纹特征提取、指纹特征比配、特征数据库这几个方面来分析公司的功能需求。
a)指纹图像采集 :用于捕捉指纹图像。
b)指纹图像预处理 :预处理过程是整个系统关键的第一步。指纹图像由于输入设备等原因会发生畸变、不清晰、产生噪音,所以特征提取之前,需要对图像进行预处理。常用的预处理过程一般包括:增强、细化,分割、二值化等。
c)指纹特征提取:指纹特征提取根据指纹对象预处理后形成的指纹框架,提取出指纹的特征点,然后把特征点分类,形成特征点拓扑数据结构。特征点整体上分成局部特征点和整体特征点。局部特征点有端点、交叉点,整体特征点有三角点和中心点。
d)指纹特征比配:指纹特征比配就是输入的指纹特征与事先保存起来的模板特征进行对比,从而判断这两个指纹图像是否来自同一个手指。使用最普遍的指纹匹配算法是基于细节点的匹配算法
e)特征数据库用来存储指纹图像模板。
3.3性能需求分析
性能需求有以下几个方面:
a)自己制作的指纹采集装置,采集图片要清晰。主要是拟采用COMS摄像头和三菱镜,应用光的折射成像原理来捕获指纹图像。应用三菱镜通过光的折射会增加图像采集的精度。
b)指纹的信息量很大,要使计算机做到识别速度快,质量高,提高软件的性能,就必须要对信息做出合理化的减少。通过一系列的指纹模式转化可以极大地减少指纹的信息量。从而达到指纹识别的高速,高质。
c) 软件的指纹比对结果要准确。拟采用数学上的拓扑数据知识,来完成指纹的比对。把指纹的特征点装配成指纹拓扑数据结构,然后利用整体特征点来进行匹配,使其处在一个坐标系下,再利用分支特征点进行精密的比对。达到精确地指纹比对结果。
4指纹识别系统总体设计
本章的内容是介绍指纹识别系统的总体设计。总体设计就像是一个设计蓝图,和方向标,给我们的工作作出指引。同时总体设计对项目的开发进度和项目的质量有着至关重要的影响。通过上一章对指纹识别系统的需求分析,在本章规划一个指纹识别系统的总体设计方向。
指纹识模式识别系统存在着大量的算法,每个算法之间存在着独立性,把所有的算法按一定的逻辑关系就能实现强大的指纹识别系统。本章主要介绍指纹识别系统的算法总论,在对开发系统进行全面分析调查的基础上,制定出应用指纹识别系统的算法规划,对建立一个该系统来说是必须的,也是全面展开开发工作的重要基础。其中指纹识别系统的算法总论分为三个大部分:指纹模式对象的信息量、指纹模式转化方法、指纹识别系统算法的组成及流程。
4.1指纹模式对象的信息量
在起初开始做指纹识别系统之前,我很迷茫,不知道到底该如何插手,面对我们自己的真实指纹,既熟悉又陌生。熟悉的是它就是在我们身上,摸得到,看得到,陌生的是指纹的特点,我们该如何进行辨别,还有计算机要出入处理,处理什么。后来我在图书馆查阅了很多关于指纹识别的很多书,逐渐的我找到了我的设计方向。设计思维导图如图4.1所示。

// FPEngine.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "FPEngine.h"
#include "VF_Api.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}


// This is an example of an exported variable
FPENGINE_API int nFPEngine=0;

// This is an example of an exported function.
FPENGINE_API int fnFPEngine(void)
{
	return 42;
}

// This is the constructor of a class that has been exported.
// see FPEngine.h for the class definition
CFPEngine::CFPEngine()
{ 
	return; 
}


//
// Extract: 从指纹图像中提取指纹特征
//

FPENGINE_API int Analyze(BYTE *lpImage, int Width, int Height, BYTE *lpFeature, int *lpSize)
{
///
//  Width:	[in] 指纹图像宽度
//  Height:	[in] 指纹图像高度
//  lpImage:    [in] 指纹图像数据指针
//  Resolution:	[in] 指纹图像分辨率,默认500
//  lpFeature:	[out] 提取的指纹特征数据指针
//  lpSize:	[out] 指纹特征数据大小
///

	// TODO: Add your implementation code here
	VF_RETURN	re;

	// 导入指纹图像数据
	VF_ImportFinger(lpImage, Width, Height);
	
	// 处理指纹图像,提取指纹特征
	re = VF_Process();
	if(re != VF_OK)
		return re;
	
	// 对指纹特征进行编码
	re = VF_FeatureEncode(&g_Feature, lpFeature, lpSize);
	if(re != VF_OK)
		return re;

	return 0;
}

//
// ExtractEx: 从指纹图像BMP文件中提取指纹特征
//
FPENGINE_API int AnalyzeFromFile(LPCSTR lpszFileName, BYTE *lpFeature, int *lpSize)
{
//
//  lpszFileName: [in] 指纹图像文件路径
//  Resolution: [in] 指纹图像分辨率
//  lpFeature: [out] 提取的指纹特征数据缓冲区指针
//  lpSize: [out] 提取的指纹特征数据大小
//
	// TODO: Add your implementation code here
	VF_RETURN	re;
	
	// 读取指纹图像数据
	re = VF_LoadFinger(lpszFileName);
	if(re != VF_OK)
		return re;

	// 处理指纹图像,提取指纹特征
	re = VF_Process();
	if(re != VF_OK)
		return re;

	// 对指纹特征进行编码
	re = VF_FeatureEncode(&g_Feature, lpFeature, lpSize);
	if(re != VF_OK)
		return re;

	return 0;
}

//
// VerifyMatch: 两个指纹特征间的比对
//
FPENGINE_API int PatternMatch(BYTE *lpFeature1, BYTE *lpFeature2, int *lpScore)
{
//
//	lpFeature1:		[in] 第一个指纹特征
//	lpFeature2:		[in] 第二个指纹特征
//	lpScore:		[out] 比对的相似度
//	FastMode:		[in] 是否进行快速模式比对
//
	// TODO: Add your implementation code here
	VF_RETURN	re;
	MATCHRESULT mr;
	FEATURE		feat1, feat2;

	// 第一个指纹特征的解码
	re = VF_FeatureDecode(lpFeature1, &feat1);
	if(re != VF_OK)
		return re;
	
	// 第二个指纹特征的解码
	re = VF_FeatureDecode(lpFeature2, &feat2);
	if(re != VF_OK)
		return re;

	*lpScore = 0;

	bool FastMode = true;

	if(FastMode)
	{
		// 快速模式的比对
		VF_VerifyMatch(&feat1, &feat2, &mr, VF_MATCHMODE_IDENTIFY);
	}
	else
	{
		// 精确模式的比对
		VF_VerifyMatch(&feat1, &feat2, &mr, VF_MATCHMODE_VERIFY);
	}

	// 匹配的相似度
	if(mr.MMCount < 8)
		*lpScore = 0;
	else
		*lpScore = mr.Similarity;

	return 0;
}

//
// SaveFeature: 保存指纹特征到文件中
//
FPENGINE_API int SaveFeature(LPCSTR lpszFileName, BYTE *lpFeature)
{
/
//	lpFeature: [in] 指纹特征
//  lpszFileName: [in] 文件路径
/
	// TODO: Add your implementation code here
   	FILE               *fp = NULL;
	BYTE v;
	int         i;
	
	// 对指纹特征进行校验
	v = 0;
	for(i = 0; i < (lpFeature[0]*256+lpFeature[1]); i++)
	{
		v = v ^ lpFeature[i];
	}
	// 校验失败返回错误
	if(v != 0) 
		return VF_SAVEFEATURE_ERR;
	
	// 创建并写入指纹特征数据
	fp = fopen(lpszFileName, "wb");
	if(fp == NULL)
	{
		return VF_SAVEFEATURE_ERR;
	}
	fwrite((char *)lpFeature, lpFeature[0]*256+lpFeature[1], 1, fp);
	fclose(fp);	

	return 0;
}

//
// LoadFeature: 从指纹特征到文件中读取指纹特征
//
FPENGINE_API int LoadFeature(LPCSTR lpszFileName, BYTE *lpFeature, int *lpSize)
{
/
//  lpszFileName: [in] 指纹特征文件路径
//	lpFeature: [out] 指纹特征
//  lpSize: [out] 指纹特征大小
/

	// TODO: Add your implementation code here
   	FILE               *fp = NULL;
	BYTE v;
	int         i;

	fp = fopen(lpszFileName, "rb");
	if(fp == NULL)
	{
		return VF_LOADFEATURE_ERR;
	}
	// 读取指纹特征大小
	fread((void *)&lpFeature[0], 2, 1, fp);
	// 读取指纹特征其他字段数据
	fread((void *)&lpFeature[2], lpFeature[0]*256+lpFeature[1]-1, 1, fp);

	fclose(fp);	

	// 校验
	v = 0;
	for(i = 0; i < (lpFeature[0]*256+lpFeature[1]); i++)
	{
		v = v ^ lpFeature[i];
	}
	// 校验失败返回错误
	if(v != 0)
		return VF_LOADFEATURE_ERR;


	return 0;
}

//
// LoadFinger: 从指纹图像文件中读取指纹图像数据
//
FPENGINE_API int LoadFingerImage(LPCSTR lpszFileName, BYTE *lpFinger, int *lpWidth, int *lpHeight)
{
/
//  lpszFileName: [in] 指纹图像文件路径
//	lpFinger: [out] 指纹图像矩阵数据
//  lpWidth: [out] 图像宽度指针
//  lpHeight: [out] 图像高度指针
/

	// TODO: Add your implementation code here
	int	re;

	// 读取图像数据并得到图像大小
	re = loadBitmap((char *)lpszFileName, lpFinger, lpWidth, lpHeight);
	if(re != 0)
		return VF_LOADFINGER_ERR;

	return 0;
}

//
// SaveFinger: 将指纹图像数据保存为BMP文件
//
FPENGINE_API int SaveFingerImage(LPCSTR lpszFileName, BYTE *lpFinger, int Width, int Height)
{
/
//	lpFinger: [in] 指纹图像矩阵数据
//  Width: [in] 图像宽度
//  Height: [in] 图像高度
//  lpszFileName: [in] 指纹图像文件路径
/

	// TODO: Add your implementation code here
	int	re;

	// 保存指纹图像数据为BMP文件
	try {
		re = saveBitmap(lpFinger, Width, Height, (char *)lpszFileName);
	} catch (char *str) {		
		FILE	*fp = NULL;
		fp = fopen("d:\\err.txt", "wb");
		fwrite(str, strlen(str), 1, fp);
		fclose(fp);	
	}
	if(re != 0)
		return VF_SAVEFINGER_ERR;


	return 0;
}

//
// GetQuality: 获取指纹图像质量分数(100分满分)
//
FPENGINE_API int GetImageQuality(BYTE *lpFinger, int Width, int Height, int *pScore)
{
/
//	lpFinger: [in] 指纹图像矩阵数据
//  Width: [in] 图像宽度
//  Height: [in] 图像高度
//  pScore: [out] 质量分数指针
/

	// TODO: Add your implementation code here
	VF_RETURN	re;
	sint32	x, y, num;
	sint32  temp,score;

	// 导入指纹图像数据
	re = VF_ImportFinger(lpFinger, Width, Height);
	
	if(re != VF_OK)
		return re;
	
	// 对指纹图像进行二次平滑
	smooth(g_lpOrgFinger, g_lpTemp, 1, 1);
	smooth(g_lpOrgFinger, g_lpTemp, 1, 1);
	memcpy(g_lpOrgFinger, g_lpTemp, IMGSIZE);
	// 利用图像低频部分计算方向场,提高速度
	zoomout();
	// 计算指纹图像的方向场,得到幅值
	getOrientMap(6);
	// 分割指纹图像
	divide(12, 32);

	//统计前景区域大小
	temp = 0;
	num = 0;
	for(y = 0; y < IMGH; y++)
	{
		for(x = 0; x < IMGW; x++)
		{
			if(*(g_lpDivide + temp + x) != 255)
			{
				num++;
			}
		}
		temp += IMGW;
	}
	
	// 计算质量分数
	score = (int)(100*num/(0.8*IMGSIZE)+0.5);
	if(score > 100)
		score = 100;
	*pScore = score;

	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四招教你样式化界面组件KendoReact,让应用程序主题更个性化

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for React能够为客户提供更好的用户体验&#xff0c;并且能够更快地构建更好的应用程序。 开发人员在应用程序主题色的选择…

省重点实验室成果转化:24h在线的专业数字朋友,不用欠人情的网上解答神器~

数据解决大师 一个适合所有人的 数据问题咨询小程序 海量数据如何安全储存&#xff1f; 电脑系统崩溃&#xff0c;关键文档丢失怎么办&#xff1f; 手机被格式化&#xff0c;视频文档等数据如何恢复&#xff1f; 毕业论文遭恶意破坏&#xff0c;如何操作能将损失降至最低&…

Java Final关键字使用

Final关键字 final可以修饰类, 属性, 方法和局部变量 在某些情况下程序员可能有以下需求&#xff0c;就会使用到final: 1)当不希望类被继承时&#xff0c;可以用final修饰. 2)当不希望父类的某个方法被子类覆盖/重写(override)时&#xff0c;可以用final关键字修饰。[访问修饰…

谷粒学院——Day06【整合阿里云OSS、EasyExcel技术实现Excel导入分类】

阿里云存储OSS 一、对象存储OSS 1. 开通“对象存储OSS”服务 阿里云&#xff1a;https://www.aliyun.com/申请阿里云账号实名认证开通“对象存储OSS”服务进入管理控制台 2. 创建Bucket 选择&#xff1a;标准存储、公共读、不开通。 3.上传默认头像 4. 创建RAM子用户 二、…

如何手写一个单向链表?看这里

一. 问题展现 通常我们在大多数的面试中&#xff0c;遇到关于集合的问题都是比较多的。一般情况下&#xff0c;许多面试官通常都会问我们关于Set集合和Map集合的相关知识点&#xff0c;并对此进行重重陷阱的布置&#xff0c;此时很多面试者往往就很容易被带到面试官挖好的陷阱…

netstat命令详解

netstat命令详情一、前言二、netstat查看端口命令三、显示每个协议的统计信息四、显示核心路由信息五、netstat的其他参数一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;小伙伴们&#xff0c;让我们一起来学习netstat命令使用&#xff0c;netstat命令是一个监控TC…

echarts疑难杂症

echarts疑难杂症1.调整柱状图、饼图的大小2.嵌套饼图且颜色保持一致3.并排展示饼图且中间展示文字4.折线图&#xff08;柱状图&#xff09;双y轴5.使用echarts56.图形不展示的问题1.调整柱状图、饼图的大小 //柱状图主要根据grid属性中的top/bottom/left/right属性调整大小 le…

【毕业设计】机器视觉行人口罩佩戴检测系统 - python 深度学习

文章目录0 前言1 简介2 效果展示3 实现方法3.1 模型介绍3.2 获取数据集3.3 数据集获取4 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学…

164页5万字轨道交通BIM方案建议书

目录 1、 概况 1.1. BIM国内外现状 1.1.1. 国外BIM现状 1.1.2. 国内BIM现状 1.2. BIM在轨道交通工程领域的发展概况 1.3. 中铁二院BIM发展总体思路的建议 2、 解决方案总体架构 2.1. 解决方案应具备的要素 2.2. 解决方案整体架构 2.3匹配度分析 3、 设计阶段解决方案…

数据库的基本操作(5)

先回顾一下在上一篇中的内容&#xff1a; 聚合查询&#xff1a;行和行之间的数据的加工。 聚合函数&#xff1a;count&#xff0c;avg&#xff0c;sum...... group..by...进行分组&#xff0c;将指定列的值进行分组&#xff0c;将相同的记录合并到一个组中。每个组还可以进行…

Golang入门笔记(10)—— 包

使用包的原因&#xff1a; 1.不可能把所有的不同业务功能的函数都放在一个源文件中&#xff0c;这样不便于管理。通常的做法是&#xff1a;我们会把具有相同一些功能和业务的维度的函数&#xff0c;分门别类的放在不同的源文件中。 2.不同的包名&#xff0c;可以解决两个函数…

【SQL 中级语法 3】三值逻辑和NULL

普通语言里的布尔型只有true和false两个值&#xff0c;这种逻辑体系被称为二值逻辑。而SQL语言里&#xff0c;除此之外还有第三个值unknown&#xff0c;因此这种逻辑体系被称为三值逻辑&#xff08;three-valued logic&#xff09;。 为什么SQL语言采用了三值逻辑呢&#xff1…

java项目-第139期ssm博客系统-ssm毕业设计_计算机毕业设计

java项目-第139期ssm博客系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm博客系统》 该项目分为前台和后台2个部分。 前台不需要登录&#xff0c;游客都可以访问&#xff0c;并发表评论 管理员登录后可以进行文章的发表&#xff0c;分类&…

德鲁克《卓有成效的管理者》学习读书-总结

有幸学习了管理大师德鲁克先生的《卓有成效的管理者》&#xff0c;帮助学习者理清了在理论和实践之间建立桥梁&#xff0c;使其生根落地&#xff0c;开花结果&#xff1b;管理不是常识&#xff0c;管理是个实践学科&#xff0c;要不断温习&#xff0c;不断与领导同事联接&#…

人肠道宏病毒与其宿主和环境因素的关联分析

近期《Nature Communications》期刊上(IF17.694)发表的“Extensive gut virome variation and its associations with host and environmental factors in a population-level cohort”研究论文中&#xff0c;对从4198个个体的肠道宏基因组中获得的人类肠道病毒进行分析&#x…

PCB设计时如何选择合适的叠层方案

大家在画多层PCB的时候都要进行层叠的设置&#xff0c;其中层数越多的板子层叠方案也越多&#xff0c;很多人对多层PCB的层叠不够了解&#xff0c;通常一个好的叠层方案可以降低板子产生的干扰&#xff0c;我们的层叠结构是影响PCB板EMC性能的重要因素,下面我们以四层板和六层板…

刨根问底 Redis, 面试过程真好使

充满寒气的互联网如何在面试中脱颖而出&#xff0c;平时积累很重要&#xff0c;八股文更不能少&#xff01;下面带来的这篇 Redis 问答希望能够在你的 offer 上增添一把&#x1f525;。 在 Web 应用发展的初期阶段&#xff0c;一个网站的访问量本身就不是很高&#xff0c;直接使…

SRM供应商关系管理系统解决方案

SRM供应商关系管理系统解决方案供应商关系管理(SRM)软件的采购指南 什么是供应商关系管理(SRM)软件? 供应商关系管理(SRM)软件是一个通讯解决方案制造商、分销商和零售商的供应链。供应商管理用于将所有有关组织的供应商通讯和颜色编码索引卡片。现在SRM管理的数字由一个国家…

OOM内存溢出分析

Mat内存溢出dump文件分析工具http://www.eclipse.org/mat/downloads.php 模拟OOM Java 程序 package org.cj.oom;import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit;/*** 创建内存分析* java启动参数指定内存 -Xms1m -Xmx1m* author…

没有上司的舞会 - 树形DP

目录题目描述前言C代码题目描述 Ural 大学有 NNN 名职员&#xff0c;编号为 1∼N1∼N1∼N。 他们的关系就像一棵以校长为根的树&#xff0c;父节点就是子节点的直接上司。 每个职员有一个快乐指数&#xff0c;用整数 HiH_iHi​ 给出&#xff0c;其中 1≤i≤N1≤i≤N1≤i≤N。…