Java通过sourceafis比对指纹图片的相似度判断指纹

作者 xqlee
浏览次数 543


什么是SourceAFIS?

SourceAFIS是一种指纹识别引擎,可以获取一对人类的指纹图像并返回其相似性分数。 它可以进行1:1的比较以及高效的1:N搜索。 这是SourceAFIS算法的Java实现

1.maven环境依赖引入

	    <!-- 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

2.Java通过sourceafis比对指纹图片

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();
		}

	}

}

3.1:N操作

假设我们要比较一下刚刚从指纹读取器读取的探针指纹与已经存储在数据库中的多个候选指纹。 数据库通常是磁盘,但是指纹数据库必须是内存,因为探针指纹必须与每个候选指纹进行比较。
以1:N匹配,返回匹配得分已经不够了。 我们需要识别指纹匹配的用户,也许是通过描述用户的类来识别。
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构建内存数据结构,加快匹配。 个人电话匹配方法相对较快。

您可能会想知道为什么SourceAFIS不会在API中提供这样的搜索方法。 除了更容易将模板与应用程序定义的用户身份相关联,保持应用程序侧的搜索循环允许应用程序自定义循环。 此类定制的示例包括:

并行策略,
人口过滤,例如只搜索男性,
手指位置过滤,例如将右拇指仅匹配到右拇指,
多指搜索,例如要求左索引和右食指匹配,以及
多视图搜索,为每个用户保留同一个手指的多个模板,以提高识别率。

4.除了匹配器比较耗资源通过二进制流创建指纹模板其实也很消耗资源,如何缓存?

每次应用程序重新启动时,从原始指纹图像重新创建数据库中的所有指纹模板是不合理的。 因此,SourceAFIS提供了缓存指纹模板的方法。
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模板视为临时缓存。

 

暂无评论
站内搜索
搜索
广而告之(广告说明)
加入QQ群(641395244)
qq group
支持博客发展
support
推荐博客
暂无推荐
分享本文