我们在开发中经常会有人脸识别的需求,今天就实现一个简单的人脸识别,调用的第三方SDK服务
0.先去注册服务
登录网址 虹软视觉开放平台—以免费人脸识别技术为核心的人脸识别算法开放平台
点击进行注册
进入之后新增我的服务
成功之后点击首页人脸识别添加服务
之后填写如下信息
下载SDK
之后的话去拉项目(项目现在如果有的话不需要加,没有的话如下)
在IDEA直接拉版本控制即可:GitHub - chengxy-nds/ArcSoftFaceDemo: ArcSoft基于虹软人脸识别2.0 Java服务端Demo代码,最完整的服务端Demo。
(1)把包放到lib文件夹
(2)加载包
在xml加入以下配置
com.arcsoft.face
arcsoft-sdk-face
2.2.0.1
system
${basedir}/lib/arcsoft-sdk-face-2.2.0.1.jar
org.springframework.boot
spring-boot-maven-plugin
true
true
之后的话根据表生成sql脚本
官方提供了如图
我用的是
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user_face_info
-- ----------------------------
DROP TABLE IF EXISTS `user_face_info`;
CREATE TABLE `user_face_info` (
`id` int(10) NOT NULL,
`group_id` int(10) NULL DEFAULT NULL,
`gace_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int(10) NULL DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`gender` smallint(10) NULL DEFAULT NULL,
`phone_number` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`face_feature` blob NULL,
`create_time` timestamp NULL DEFAULT NULL,
`update_time` timestamp NULL DEFAULT NULL,
`fpath` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of user_face_info
-- ----------------------------
SET FOREIGN_KEY_CHECKS = 1;
执行生成表之后再项目application.properties修改数据库,用户名和密码
点击启动类运行
之后访问端口http://127.0.0.1:8089/demo就可以看到
如果出现Can't load library: d:/arcsoft_lib\libarcsoft_face.dll这个错误说明你缺少这个dll文件,添加即可
解压到D盘
有两种一种是摄像头识别,另一种事照片识别,这样就可以实现人脸识别(开发环境使用第三方SDK比较方便)
接下来是指纹认证,这边只写了一个简单的模版实现指纹认证,如下
public class CustomFingerprintComparison {
// 模拟指纹模板
private static final byte[] fingerprintTemplate1 = new byte[] { 1, 2, 3, 4, 5 ,1};
private static final byte[] fingerprintTemplate2 = new byte[] { 5, 24, 34, 6, 5 ,3 }; // 改变一个像素值
// 设置比对阈值
private static final int threshold = 3;
public static void main(String[] args) {
// 模拟指纹比对
boolean isMatch = matchFingerprints(fingerprintTemplate1, fingerprintTemplate2);
double similarity = calculateSimilarity(fingerprintTemplate1, fingerprintTemplate2);
if (isMatch) {
System.out.print("指纹匹配,认证通过 ");
} else {
System.out.print("指纹不匹配,认证失败 ");
}
System.out.println("指纹相似度: " + similarity + "%");
}
// 模拟指纹比对函数
private static boolean matchFingerprints(byte[] template1, byte[] template2) {
// 比对两个指纹模板,计算差异值
int difference = calculateDifference(template1, template2);
// 如果差异值低于阈值,认为指纹匹配
return difference <= threshold;
}
// 计算指纹相似度函数
private static double calculateSimilarity(byte[] template1, byte[] template2) {
// 计算相似度百分比
int difference = calculateDifference(template1, template2);
int maxPossibleDifference = template1.length * 255; // 假设最大可能的差异值
int similarityPercentage = ((maxPossibleDifference - difference) * 100) / maxPossibleDifference;
return similarityPercentage;
}
// 模拟计算差异值函数
private static int calculateDifference(byte[] template1, byte[] template2) {
// 模拟计算两个指纹模板的差异值,实际情况下需要使用专业库或API
int difference = 0;
for (int i = 0; i < template1.length; i++) {
difference += Math.abs(template1[i] - template2[i]);
}
return difference;
}
}
结果如下
这样就可以了