Touchless Capture Results
TouchlessResults​
data class TouchlessResults(
val rawFingerprintImages: ArrayList<Bitmap>? = null,
val processedFingerprintImages: ArrayList<Bitmap>? = null,
val enhancedFingerprintImages: ArrayList<Bitmap>? = null,
val slapImage: Bitmap? = null,
val slapWsqData: ByteArray? = null,
val fullFrameImage: Bitmap? = null,
val wsqData: ArrayList<ByteArray>? = null,
val metrics: CaptureMetrics? = null
)
data class CaptureMetrics(
val nfiqMetrics: List<NfiqMetrics> = emptyList(),
val livenessConfidence: Double = 0.0,
val qualityMetric: Double = 0.0
)
data class NfiqMetrics(
val nfiqScore: Int = 0,
val mlpScore: Float = 0f
)
Accessing captured images​
The SDK returns images at three fidelity levels depending on device capability. Always use the fallback chain:
onResults = { result: TouchlessResults ->
val fingerImages = (
result.enhancedFingerprintImages
?: result.processedFingerprintImages
?: result.rawFingerprintImages
)?.toList().orEmpty()
val wsqBytes = result.wsqData?.firstOrNull()
// Quality metrics
val nfiqMetric = result.metrics?.nfiqMetrics?.firstOrNull()
val nfiq = nfiqMetric?.nfiqScore
val mlp = nfiqMetric?.mlpScore
val quality = result.metrics?.qualityMetric
val liveness = result.metrics?.livenessConfidence
// Convert WSQ to Base64 for upload
val wsqBase64 = wsqBytes?.let { Base64.encodeToString(it, Base64.NO_WRAP) }
}
Results fields​
| Field | Description |
|---|---|
enhancedFingerprintImages | Highest-quality processed bitmaps — prefer these |
processedFingerprintImages | Mid-level processed bitmaps |
rawFingerprintImages | Raw camera-frame bitmaps |
wsqData | List of WSQ binary templates (one per finger segment) |
metrics.nfiqMetrics[n].nfiqScore | NIST NFIQ 2.x quality score (0–100, higher = better) |
metrics.nfiqMetrics[n].mlpScore | MLP quality score |
metrics.qualityMetric | Overall capture quality (0.0–100.0) |
metrics.livenessConfidence | Live-finger confidence (0.0–1.0) |
NFIQ quality bands​
| NFIQ score | Quality |
|---|---|
| 0–29 | Poor — retake recommended |
| 30–59 | Fair |
| 60–74 | Good |
| 75–100 | Excellent |
info
NFIQ metrics are only populated when computeNfiqMetrics(true) is set in the configuration builder.
Full results screen example​
@Composable
fun FingerprintResultScreen(result: TouchlessResults, onDone: () -> Unit) {
val images = (result.enhancedFingerprintImages
?: result.processedFingerprintImages
?: result.rawFingerprintImages)?.toList().orEmpty()
val nfiq = result.metrics?.nfiqMetrics?.firstOrNull()?.nfiqScore
val quality = result.metrics?.qualityMetric
val ws = result.wsqData?.size ?: 0
Column(modifier = Modifier.padding(16.dp)) {
Text("Capture complete", style = MaterialTheme.typography.headlineSmall)
Spacer(Modifier.height(12.dp))
Text("Fingers captured: ${images.size}")
Text("WSQ templates: $ws")
nfiq?.let { Text("NFIQ score: $it") }
quality?.let { Text("Quality: ${String.format("%.0f", it)}") }
Spacer(Modifier.height(16.dp))
Button(onClick = onDone) { Text("Done") }
}
}