SourceAFIS是一种指纹识别引擎,可以获取一对人类的指纹图像并返回其相似性分数。 它可以进行1:1的比较以及高效的1:N搜索。 这是SourceAFIS算法的Java实现
<!-- https://mvnrepository.com/artifact/com.machinezoo.sourceafis/sourceafis -->
<dependency>
<groupId>com.machinezoo.sourceafis</groupId>
<artifactId>sourceafis</artifactId>
<version>2.0.11</version>
</dependency>
不用maven的可以通过上方注释的地址去下载,注意依赖gson.jar
package com.example.fingerprint;
import java.nio.file.Files;
import java.nio.file.Paths;
import com.machinezoo.sourceafis.FingerprintMatcher;
import com.machinezoo.sourceafis.FingerprintTemplate;
/**
* 通过三方库实现指纹识别对比
*
* @author xq
*
*/
public class Test {
public static void main(String[] args) {
try {
//首先是读取两张对比的指纹图片,图片必须是白色背景,指纹为黑色
byte[] probeImage = Files.readAllBytes(Paths.get("d://fp//da1.png"));
byte[] candidateImage = Files.readAllBytes(Paths.get("d://fp//da2.png"));
FingerprintTemplate probe = new FingerprintTemplate(probeImage);
// 由于直接从二进制中生成指纹模板非常消耗性能,推荐第一次使用后序列话成JSON,内部提供方法。再通过json生成模板
// String jsonTemplete=probe.json();
// probe=new FingerprintTemplate(jsonTemplete);
FingerprintTemplate candidate = new FingerprintTemplate(candidateImage);
FingerprintMatcher matcher = new FingerprintMatcher(probe);
double score = matcher.match(candidate);
System.out.println("匹配得分:" + score);
boolean match = score >= 40;
System.out.println("是否匹配:" + match);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class UserDetails {
int id;
String name;
FingerprintTemplate template;
}
我们现在可以定义一种方法,它可以获取探针指纹和候选指纹列表,并返回最佳匹配,如果不匹配则返回null。
UserDetails find(FingerprintTemplate probe, Iterable<UserDetails> candidates) {
FingerprintMatcher matcher = new FingerprintMatcher(probe);
UserDetails bestCandidate = null;
double bestScore = 0;
for (UserDetails candidate : candidates) {
double score = matcher.match(candidate.template);
if (score > bestScore) {
bestScore = score;
bestCandidate = candidate;
}
}
double threshold = 40;
return bestScore >= threshold ? bestCandidate : null;
}
构造FingerprintMatcher只需要一次,因为这是一个昂贵的操作。 FingerprintMatcher构建内存数据结构,加快匹配。 个人电话匹配方法相对较快。byte[] image = Files.readAllBytes(Paths.get("fingerprint.jpeg"));
FingerprintTemplate template = new FingerprintTemplate(image);
String json = template.json();
模板的JSON表示可以存储在数据库中,以加快应用程序的重新启动。 当应用程序启动时,它反序列化JSON模板,而不是从指纹图像中重新创建它们。
FingerprintTemplate template = new FingerprintTemplate(json);
JSON模板不能代替指纹图像。 它们被绑定到特定的SourceAFIS版本。 为了允许SourceAFIS升级,应用程序应始终存储原始指纹图像,并将JSON模板视为临时缓存。
http://blog.xqlee.com/article/269.html