comparefaceKyc1 method
Implementation
Future<double> comparefaceKyc1(String image1, String image2) async {
try {
// Decode base64 strings to bytes
Uint8List bytes1;
Uint8List bytes2;
try {
final encoded1 = base64Decode(image1);
bytes1 = Uint8List.fromList(encoded1);
} catch (e) {
// If base64 decode fails, assume it's already raw bytes encoded as string
dev.log('Image 1 base64 decode failed, treating as raw data: $e');
bytes1 = Uint8List.fromList(utf8.encode(image1));
}
try {
final encoded2 = base64Decode(image2);
bytes2 = Uint8List.fromList(encoded2);
} catch (e) {
dev.log('Image 2 base64 decode failed, treating as raw data: $e');
bytes2 = Uint8List.fromList(utf8.encode(image2));
}
// Create properly oriented image files
final file1 = await _createOrientedImageFile(bytes1, 'img1_${DateTime.now().millisecondsSinceEpoch}.jpg');
final file2 = await _createOrientedImageFile(bytes2, 'img2_${DateTime.now().millisecondsSinceEpoch}.jpg');
final input1 = InputImage.fromFile(file1);
final input2 = InputImage.fromFile(file2);
final results = await Future.wait([
_faceService.detectFaces(input1),
_faceService.detectFaces(input2),
]);
// Check for empty results and return early
if (results[0].isEmpty) {
dev.log('No face detected in Image 1. Use an image with a clear face.');
await _cleanupFiles([file1, file2]);
return 0;
}
if (results[1].isEmpty) {
dev.log('No face detected in Image 2. Use an image with a clear face.');
await _cleanupFiles([file1, file2]);
return 0;
}
final emb1 = results[0][0].faceEmbedding;
final emb2 = results[1][0].faceEmbedding;
// Clean up temp files
await _cleanupFiles([file1, file2]);
if (emb1 != null && emb2 != null) {
final comparison = FaceDetectorService.compareFaces(emb1, emb2);
dev.log(jsonEncode(comparison.toJson()));
return comparison.similarityPercentage;
} else {
dev.log('Face embeddings could not be generated');
return 0;
}
} catch (e) {
dev.log('Comparison failed: $e');
return 0;
}
}