|
|
@@ -16,7 +16,6 @@ import java.nio.file.Paths;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Comparator;
|
|
|
import java.util.List;
|
|
|
-import java.util.Set;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
@@ -25,7 +24,7 @@ import java.util.concurrent.Executors;
|
|
|
/**
|
|
|
* <p>
|
|
|
* FingerprintComparison<br>
|
|
|
- * 指纹比对算法(图片)
|
|
|
+ * 指纹比对算法(dat)
|
|
|
* </p>
|
|
|
*
|
|
|
* @author CGJ
|
|
|
@@ -39,7 +38,7 @@ public class FingerprintComparisonByDat {
|
|
|
private static final double THRESHOLD = 40; // 相当于错误率是0.01%,THRESHOLD越高,错误率越低
|
|
|
private static final ExecutorService THREAD_POOL_EXECUTOR = Executors.newFixedThreadPool(4); // 线程池
|
|
|
|
|
|
- public static VerificationVO completableFutureComparison(final MultipartFile file, final Set<String> matcherDat) {
|
|
|
+ public static VerificationVO completableFutureComparison(final MultipartFile file, final List<String> matcherDat) throws IOException {
|
|
|
// 转成list
|
|
|
List<String> matcherImgList = new ArrayList<>(matcherDat);
|
|
|
// 切分四等份
|
|
|
@@ -48,10 +47,18 @@ public class FingerprintComparisonByDat {
|
|
|
denominator = 4;
|
|
|
}
|
|
|
List<List<String>> averageMatcherImgList = Lists.partition(matcherImgList, matcherImgList.size() / denominator);
|
|
|
+ // 开始解析输入的指纹到指纹模板
|
|
|
+ byte[] bytes = file.getBytes();
|
|
|
+ // 创建FingerprintImage对象
|
|
|
+ FingerprintImage fingerprintImage = new FingerprintImage()
|
|
|
+ .dpi(500) // 设置DPI,具体值取决于你的图像分辨率
|
|
|
+ .decode(bytes);
|
|
|
+ // 提取指纹特征值
|
|
|
+ FingerprintTemplate fingerprintTemplate = new FingerprintTemplate(fingerprintImage);
|
|
|
// 构建四个线程进行处理,防止人员过多对比速度太慢
|
|
|
CompletableFuture<VerificationVO>[] completableFutureArray = averageMatcherImgList.stream().map(
|
|
|
partitionFingerprint -> CompletableFuture.supplyAsync(
|
|
|
- () -> comparison(file, new ArrayList<>(partitionFingerprint)), THREAD_POOL_EXECUTOR)
|
|
|
+ () -> comparison(fingerprintTemplate, new ArrayList<>(partitionFingerprint)), THREAD_POOL_EXECUTOR)
|
|
|
).toArray(CompletableFuture[]::new);
|
|
|
// 等待所有任务执行完
|
|
|
CompletableFuture.allOf(completableFutureArray).join();
|
|
|
@@ -75,16 +82,8 @@ public class FingerprintComparisonByDat {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public static VerificationVO comparison(final MultipartFile file, final List<String> matcherDatList) {
|
|
|
+ public static VerificationVO comparison(final FingerprintTemplate fingerprintTemplate, final List<String> matcherDatList) {
|
|
|
try {
|
|
|
- // 开始解析输入的指纹到指纹模板
|
|
|
- byte[] bytes = file.getBytes();
|
|
|
- // 创建FingerprintImage对象
|
|
|
- FingerprintImage fingerprintImage = new FingerprintImage()
|
|
|
- .dpi(500) // 设置DPI,具体值取决于你的图像分辨率
|
|
|
- .decode(bytes);
|
|
|
- // 提取指纹特征值
|
|
|
- FingerprintTemplate fingerprintTemplate = new FingerprintTemplate(fingerprintImage);
|
|
|
if (!matcherDatList.isEmpty()) {
|
|
|
// 输入的被验证指纹
|
|
|
FingerprintMatcher matcher = new FingerprintMatcher(fingerprintTemplate);
|
|
|
@@ -109,59 +108,6 @@ public class FingerprintComparisonByDat {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- public static void main(String[] args) throws IOException {
|
|
|
- /*try {
|
|
|
- String imagePath = "C:\\Users\\车车\\Desktop\\指纹\\finger(1)\\finger\\2\\image_2.bmp"; // 替换为你的指纹图片路径
|
|
|
- byte[] fingerprintData = extractFingerprintTemplate(imagePath);
|
|
|
-
|
|
|
- // 保存到文件
|
|
|
- Files.write(Paths.get("C:\\Users\\车车\\Desktop\\指纹\\finger(1)\\finger\\2\\fingerprint_2.dat"), fingerprintData);
|
|
|
- System.out.println("指纹特征值已保存!");
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }*/
|
|
|
-
|
|
|
- String aa = "C:/Users/车车/Desktop/指纹/finger(1)/finger/2/fingerprint_0.dat";
|
|
|
- String bb = "C:/Users/车车/Desktop/指纹/finger(1)/finger/2/fingerprint_0.dat";
|
|
|
- // 加载模板1(数据库或文件中加载)
|
|
|
- byte[] templateData1 = Files.readAllBytes(Paths.get(aa));
|
|
|
- String jsonString = new String(templateData1);
|
|
|
- FingerprintTemplate template1 = new FingerprintTemplate().deserialize(jsonString);
|
|
|
-
|
|
|
- // 加载模板2(待比对指纹)
|
|
|
- byte[] templateData2 = Files.readAllBytes(Paths.get(bb));
|
|
|
- String jsonString2 = new String(templateData2);
|
|
|
- FingerprintTemplate template2 = new FingerprintTemplate().deserialize(jsonString2);
|
|
|
-
|
|
|
- // 匹配
|
|
|
- double score = new FingerprintMatcher().index(template1).match(template2);
|
|
|
-
|
|
|
- System.out.println("匹配得分: " + score);
|
|
|
- if (score >= 40) { // 经验阈值,一般为 40 分
|
|
|
- System.out.println("指纹匹配!");
|
|
|
- } else {
|
|
|
- System.out.println("指纹不匹配!");
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- public static byte[] extractFingerprintTemplate(String imagePath) throws IOException {
|
|
|
- // 读取图像文件(灰度图像 PNG, BMP, JPEG 等)
|
|
|
- byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
|
|
|
-
|
|
|
- // 提取特征值
|
|
|
- FingerprintTemplate template = new FingerprintTemplate()
|
|
|
- .dpi(500) // 指定 DPI (重要,通常为 500)
|
|
|
- .create(imageBytes);
|
|
|
-
|
|
|
- // 导出为 byte[] 保存特征值
|
|
|
- return template.serialize().getBytes();
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|