@simprints/simface-sdk 0.11.1 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/simface-capture.js +26 -24
- package/dist/components/simface-capture.js.map +1 -1
- package/dist/services/face-detection.js +17 -1
- package/dist/services/face-detection.js.map +1 -1
- package/dist/services/face-quality.d.ts +4 -0
- package/dist/services/face-quality.js +71 -12
- package/dist/services/face-quality.js.map +1 -1
- package/dist/services/sharpness.d.ts +36 -0
- package/dist/services/sharpness.js +97 -0
- package/dist/services/sharpness.js.map +1 -0
- package/dist/shared/capture-runtime.d.ts +4 -0
- package/dist/shared/capture-runtime.js +12 -0
- package/dist/shared/capture-runtime.js.map +1 -1
- package/dist/shared/capture-session.js +4 -1
- package/dist/shared/capture-session.js.map +1 -1
- package/dist/simface-sdk.js +1107 -992
- package/dist/simface-sdk.umd.cjs +49 -47
- package/dist/types/index.d.ts +2 -1
- package/package.json +1 -1
|
@@ -404,7 +404,8 @@ let SimFaceCapture = class SimFaceCapture extends LitElement {
|
|
|
404
404
|
SimFaceCapture.styles = css `
|
|
405
405
|
:host {
|
|
406
406
|
display: block;
|
|
407
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
407
|
+
font-family: 'Mulish', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
408
|
+
color: #212529;
|
|
408
409
|
max-width: 400px;
|
|
409
410
|
margin: 0 auto;
|
|
410
411
|
text-align: center;
|
|
@@ -419,9 +420,9 @@ SimFaceCapture.styles = css `
|
|
|
419
420
|
.container {
|
|
420
421
|
position: relative;
|
|
421
422
|
padding: 16px;
|
|
422
|
-
border: 1px solid #
|
|
423
|
+
border: 1px solid #E0E0E0;
|
|
423
424
|
border-radius: 16px;
|
|
424
|
-
background: #
|
|
425
|
+
background: #F6F6F6;
|
|
425
426
|
}
|
|
426
427
|
|
|
427
428
|
.close-btn {
|
|
@@ -438,7 +439,7 @@ SimFaceCapture.styles = css `
|
|
|
438
439
|
border: none;
|
|
439
440
|
border-radius: 50%;
|
|
440
441
|
background: rgba(0, 0, 0, 0.06);
|
|
441
|
-
color: #
|
|
442
|
+
color: #5D5E5E;
|
|
442
443
|
cursor: pointer;
|
|
443
444
|
transition: background-color 0.15s;
|
|
444
445
|
}
|
|
@@ -461,7 +462,7 @@ SimFaceCapture.styles = css `
|
|
|
461
462
|
|
|
462
463
|
.capture-copy {
|
|
463
464
|
margin: 0;
|
|
464
|
-
color: #
|
|
465
|
+
color: #5D5E5E;
|
|
465
466
|
text-align: center;
|
|
466
467
|
width: 100%;
|
|
467
468
|
}
|
|
@@ -473,8 +474,8 @@ SimFaceCapture.styles = css `
|
|
|
473
474
|
aspect-ratio: 3 / 4;
|
|
474
475
|
border-radius: 22px;
|
|
475
476
|
background:
|
|
476
|
-
radial-gradient(circle at top, rgba(
|
|
477
|
-
linear-gradient(180deg, #
|
|
477
|
+
radial-gradient(circle at top, rgba(0, 179, 209, 0.16), transparent 30%),
|
|
478
|
+
linear-gradient(180deg, #1a1a1a, #0d0d0d);
|
|
478
479
|
box-shadow: inset 0 0 0 1px rgba(148, 163, 184, 0.2);
|
|
479
480
|
}
|
|
480
481
|
|
|
@@ -506,7 +507,7 @@ SimFaceCapture.styles = css `
|
|
|
506
507
|
}
|
|
507
508
|
|
|
508
509
|
.guide-mask {
|
|
509
|
-
fill: rgba(
|
|
510
|
+
fill: rgba(42, 42, 42, 0.75);
|
|
510
511
|
fill-rule: evenodd;
|
|
511
512
|
}
|
|
512
513
|
|
|
@@ -520,7 +521,7 @@ SimFaceCapture.styles = css `
|
|
|
520
521
|
|
|
521
522
|
.ring-progress {
|
|
522
523
|
fill: none;
|
|
523
|
-
stroke: #
|
|
524
|
+
stroke: #00B3D1;
|
|
524
525
|
stroke-width: 2.8;
|
|
525
526
|
stroke-linecap: round;
|
|
526
527
|
stroke-linejoin: round;
|
|
@@ -544,24 +545,25 @@ SimFaceCapture.styles = css `
|
|
|
544
545
|
border: none;
|
|
545
546
|
border-radius: 100px;
|
|
546
547
|
font-size: 15px;
|
|
547
|
-
font-weight:
|
|
548
|
-
letter-spacing: 0.
|
|
548
|
+
font-weight: 700;
|
|
549
|
+
letter-spacing: 0.04em;
|
|
550
|
+
text-transform: var(--simface-button-text-transform, uppercase);
|
|
549
551
|
cursor: pointer;
|
|
550
552
|
transition: background-color 0.15s, box-shadow 0.15s;
|
|
551
553
|
}
|
|
552
554
|
|
|
553
555
|
.btn-primary {
|
|
554
|
-
background: #
|
|
556
|
+
background: #00B3D1;
|
|
555
557
|
color: white;
|
|
556
558
|
}
|
|
557
559
|
|
|
558
560
|
.btn-primary:hover {
|
|
559
|
-
background: #
|
|
560
|
-
box-shadow: 0 1px 3px rgba(
|
|
561
|
+
background: #009DB8;
|
|
562
|
+
box-shadow: 0 1px 3px rgba(0, 179, 209, 0.3);
|
|
561
563
|
}
|
|
562
564
|
|
|
563
565
|
.btn-primary:disabled {
|
|
564
|
-
background: #
|
|
566
|
+
background: #80D9E8;
|
|
565
567
|
cursor: not-allowed;
|
|
566
568
|
box-shadow: none;
|
|
567
569
|
}
|
|
@@ -587,12 +589,12 @@ SimFaceCapture.styles = css `
|
|
|
587
589
|
}
|
|
588
590
|
|
|
589
591
|
.btn-secondary {
|
|
590
|
-
background: #
|
|
591
|
-
color: #
|
|
592
|
+
background: #E0E0E0;
|
|
593
|
+
color: #212529;
|
|
592
594
|
}
|
|
593
595
|
|
|
594
596
|
.btn-secondary:hover {
|
|
595
|
-
background: #
|
|
597
|
+
background: #D0D0D0;
|
|
596
598
|
}
|
|
597
599
|
|
|
598
600
|
.quality-msg {
|
|
@@ -619,21 +621,21 @@ SimFaceCapture.styles = css `
|
|
|
619
621
|
}
|
|
620
622
|
|
|
621
623
|
.quality-neutral {
|
|
622
|
-
background: #
|
|
623
|
-
color: #
|
|
624
|
+
background: #E0E0E0;
|
|
625
|
+
color: #212529;
|
|
624
626
|
}
|
|
625
627
|
|
|
626
628
|
.quality-manual {
|
|
627
|
-
background: #
|
|
628
|
-
color: #
|
|
629
|
+
background: #E0F7FB;
|
|
630
|
+
color: #212529;
|
|
629
631
|
}
|
|
630
632
|
|
|
631
633
|
.spinner {
|
|
632
634
|
display: inline-block;
|
|
633
635
|
width: 24px;
|
|
634
636
|
height: 24px;
|
|
635
|
-
border: 3px solid #
|
|
636
|
-
border-top: 3px solid #
|
|
637
|
+
border: 3px solid #E0E0E0;
|
|
638
|
+
border-top: 3px solid #00B3D1;
|
|
637
639
|
border-radius: 50%;
|
|
638
640
|
animation: spin 0.8s linear infinite;
|
|
639
641
|
margin: 12px auto;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simface-capture.js","sourceRoot":"","sources":["../../src/components/simface-capture.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"simface-capture.js","sourceRoot":"","sources":["../../src/components/simface-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FaceDetector, FilesetResolver } from '@mediapipe/tasks-vision';
|
|
2
2
|
import { evaluateFaceQuality } from './face-quality.js';
|
|
3
|
+
import { computeSharpnessScore } from './sharpness.js';
|
|
3
4
|
const WASM_CDN = 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/wasm';
|
|
4
5
|
const MODEL_URL = 'https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite';
|
|
5
6
|
// Minimum confidence to consider a face detected
|
|
@@ -40,13 +41,28 @@ export async function assessFaceQuality(imageElement) {
|
|
|
40
41
|
height: imageElement.naturalHeight,
|
|
41
42
|
});
|
|
42
43
|
}
|
|
44
|
+
// Reusable offscreen canvas for sharpness computation (avoids allocation per frame)
|
|
45
|
+
let sharpnessCanvas = null;
|
|
43
46
|
export async function assessFaceQualityForVideo(videoElement, timestamp) {
|
|
44
47
|
const detector = await getVideoDetector();
|
|
45
48
|
const result = detector.detectForVideo(videoElement, timestamp);
|
|
49
|
+
const detections = mapDetections(result.detections);
|
|
46
50
|
return evaluateFaceQuality({
|
|
47
|
-
detections
|
|
51
|
+
detections,
|
|
48
52
|
width: videoElement.videoWidth,
|
|
49
53
|
height: videoElement.videoHeight,
|
|
54
|
+
resolveSharpnessScore: detections.length === 1 && detections[0].boundingBox
|
|
55
|
+
? () => {
|
|
56
|
+
const bbox = detections[0].boundingBox;
|
|
57
|
+
sharpnessCanvas ?? (sharpnessCanvas = document.createElement('canvas'));
|
|
58
|
+
return computeSharpnessScore(videoElement, {
|
|
59
|
+
x: bbox.originX,
|
|
60
|
+
y: bbox.originY,
|
|
61
|
+
width: bbox.width,
|
|
62
|
+
height: bbox.height,
|
|
63
|
+
}, sharpnessCanvas);
|
|
64
|
+
}
|
|
65
|
+
: undefined,
|
|
50
66
|
});
|
|
51
67
|
}
|
|
52
68
|
function mapDetections(detections) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-detection.js","sourceRoot":"","sources":["../../src/services/face-detection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"face-detection.js","sourceRoot":"","sources":["../../src/services/face-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,10 @@ interface FaceQualityInput {
|
|
|
18
18
|
width: number;
|
|
19
19
|
height: number;
|
|
20
20
|
detections: FaceDetectionSnapshot[];
|
|
21
|
+
/** Normalised sharpness score (0–1) for the face region. Omit when unavailable (e.g. image mode). */
|
|
22
|
+
sharpnessScore?: number;
|
|
23
|
+
/** Lazily compute sharpness only after framing and pose checks pass. */
|
|
24
|
+
resolveSharpnessScore?: () => number;
|
|
21
25
|
}
|
|
22
26
|
export declare function evaluateFaceQuality(input: FaceQualityInput): FaceQualityResult;
|
|
23
27
|
export {};
|
|
@@ -1,20 +1,31 @@
|
|
|
1
|
+
import { MIN_SHARPNESS_SCORE } from './sharpness.js';
|
|
1
2
|
const MIN_FACE_AREA_RATIO = 0.1;
|
|
2
3
|
const MAX_FACE_AREA_RATIO = 0.42;
|
|
3
4
|
const IDEAL_FACE_AREA_RATIO = 0.24;
|
|
4
5
|
const CENTER_TOLERANCE_X = 0.14;
|
|
5
6
|
const CENTER_TOLERANCE_Y = 0.18;
|
|
7
|
+
/** Yaw: max horizontal nose offset / interocular distance. */
|
|
6
8
|
const MAX_NOSE_OFFSET_RATIO = 0.12;
|
|
9
|
+
/** Roll: max eye vertical difference / interocular distance. */
|
|
10
|
+
const MAX_EYE_TILT_RATIO = 0.2;
|
|
11
|
+
/** Pitch ceiling: live BlazeFace signal shows higher ratios when the chin is tucked / looking down. */
|
|
12
|
+
const MAX_PITCH_RATIO = 0.95;
|
|
13
|
+
/** Pitch floor: live BlazeFace signal shows lower ratios when the chin is raised / looking up. */
|
|
14
|
+
const MIN_PITCH_RATIO = 0.2;
|
|
15
|
+
/** Image-mode sharpness is unavailable, so do not penalise captures for a missing live-video metric. */
|
|
16
|
+
const DEFAULT_SHARPNESS_SCORE = 1;
|
|
7
17
|
const KEYPOINT_RIGHT_EYE = 0;
|
|
8
18
|
const KEYPOINT_LEFT_EYE = 1;
|
|
9
19
|
const KEYPOINT_NOSE = 2;
|
|
10
20
|
export function evaluateFaceQuality(input) {
|
|
11
|
-
const { detections, width, height } = input;
|
|
21
|
+
const { detections, width, height, sharpnessScore, resolveSharpnessScore } = input;
|
|
12
22
|
if (detections.length === 0) {
|
|
13
23
|
return createQualityResult({
|
|
14
24
|
hasFace: false,
|
|
15
25
|
faceCount: 0,
|
|
16
26
|
confidence: 0,
|
|
17
27
|
captureScore: 0,
|
|
28
|
+
sharpnessScore: 0,
|
|
18
29
|
isCentered: false,
|
|
19
30
|
passesQualityChecks: false,
|
|
20
31
|
feedback: 'no-face',
|
|
@@ -27,6 +38,7 @@ export function evaluateFaceQuality(input) {
|
|
|
27
38
|
faceCount: detections.length,
|
|
28
39
|
confidence: detections[0]?.confidence ?? 0,
|
|
29
40
|
captureScore: 0,
|
|
41
|
+
sharpnessScore: 0,
|
|
30
42
|
isCentered: false,
|
|
31
43
|
passesQualityChecks: false,
|
|
32
44
|
feedback: 'multiple-faces',
|
|
@@ -41,6 +53,7 @@ export function evaluateFaceQuality(input) {
|
|
|
41
53
|
faceCount: 1,
|
|
42
54
|
confidence: detection.confidence,
|
|
43
55
|
captureScore: 0,
|
|
56
|
+
sharpnessScore: 0,
|
|
44
57
|
isCentered: false,
|
|
45
58
|
passesQualityChecks: false,
|
|
46
59
|
feedback: 'face-unclear',
|
|
@@ -68,34 +81,50 @@ export function evaluateFaceQuality(input) {
|
|
|
68
81
|
if (faceCenterY > 0.5 + CENTER_TOLERANCE_Y) {
|
|
69
82
|
return createFrameAdjustmentResult(detection.confidence, 'move-up', 'Move your face slightly up.');
|
|
70
83
|
}
|
|
71
|
-
const
|
|
72
|
-
if (
|
|
73
|
-
return createFrameAdjustmentResult(detection.confidence,
|
|
84
|
+
const poseFeedback = detectPoseFeedback(detection.keypoints);
|
|
85
|
+
if (poseFeedback) {
|
|
86
|
+
return createFrameAdjustmentResult(detection.confidence, poseFeedback.feedback, poseFeedback.message);
|
|
87
|
+
}
|
|
88
|
+
const resolvedSharpness = sharpnessScore ?? resolveSharpnessScore?.() ?? DEFAULT_SHARPNESS_SCORE;
|
|
89
|
+
if (resolvedSharpness < MIN_SHARPNESS_SCORE) {
|
|
90
|
+
return createQualityResult({
|
|
91
|
+
hasFace: true,
|
|
92
|
+
faceCount: 1,
|
|
93
|
+
confidence: detection.confidence,
|
|
94
|
+
captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio, resolvedSharpness),
|
|
95
|
+
sharpnessScore: resolvedSharpness,
|
|
96
|
+
isCentered: true,
|
|
97
|
+
passesQualityChecks: false,
|
|
98
|
+
feedback: 'too-blurry',
|
|
99
|
+
message: 'Hold still so the image is not blurry.',
|
|
100
|
+
});
|
|
74
101
|
}
|
|
75
102
|
return createQualityResult({
|
|
76
103
|
hasFace: true,
|
|
77
104
|
faceCount: 1,
|
|
78
105
|
confidence: detection.confidence,
|
|
79
|
-
captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio),
|
|
106
|
+
captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio, resolvedSharpness),
|
|
107
|
+
sharpnessScore: resolvedSharpness,
|
|
80
108
|
isCentered: true,
|
|
81
109
|
passesQualityChecks: true,
|
|
82
110
|
feedback: 'good',
|
|
83
111
|
message: 'Hold still. Capturing automatically...',
|
|
84
112
|
});
|
|
85
113
|
}
|
|
86
|
-
function
|
|
114
|
+
function detectPoseFeedback(keypoints) {
|
|
87
115
|
const rightEye = keypoints[KEYPOINT_RIGHT_EYE];
|
|
88
116
|
const leftEye = keypoints[KEYPOINT_LEFT_EYE];
|
|
89
117
|
const nose = keypoints[KEYPOINT_NOSE];
|
|
90
118
|
if (!rightEye || !leftEye || !nose) {
|
|
91
119
|
return null;
|
|
92
120
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
if (eyeDistance === 0) {
|
|
121
|
+
const eyeDistanceX = Math.abs(leftEye.x - rightEye.x);
|
|
122
|
+
if (eyeDistanceX === 0) {
|
|
96
123
|
return null;
|
|
97
124
|
}
|
|
98
|
-
|
|
125
|
+
// Yaw: horizontal nose offset relative to eye midpoint
|
|
126
|
+
const eyeMidpointX = (rightEye.x + leftEye.x) / 2;
|
|
127
|
+
const noseOffsetRatio = (nose.x - eyeMidpointX) / eyeDistanceX;
|
|
99
128
|
if (noseOffsetRatio <= -MAX_NOSE_OFFSET_RATIO) {
|
|
100
129
|
return {
|
|
101
130
|
feedback: 'turn-left',
|
|
@@ -108,6 +137,35 @@ function detectTurnFeedback(keypoints) {
|
|
|
108
137
|
message: 'Turn slightly right so your face points at the camera.',
|
|
109
138
|
};
|
|
110
139
|
}
|
|
140
|
+
// Roll: head tilt detected via eye vertical difference
|
|
141
|
+
const eyeTiltRatio = (rightEye.y - leftEye.y) / eyeDistanceX;
|
|
142
|
+
if (eyeTiltRatio >= MAX_EYE_TILT_RATIO) {
|
|
143
|
+
return {
|
|
144
|
+
feedback: 'tilt-left',
|
|
145
|
+
message: 'Straighten your head — it is tilting to the right.',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (eyeTiltRatio <= -MAX_EYE_TILT_RATIO) {
|
|
149
|
+
return {
|
|
150
|
+
feedback: 'tilt-right',
|
|
151
|
+
message: 'Straighten your head — it is tilting to the left.',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Pitch: nose vertical offset relative to eye midpoint
|
|
155
|
+
const eyeMidpointY = (rightEye.y + leftEye.y) / 2;
|
|
156
|
+
const pitchRatio = (nose.y - eyeMidpointY) / eyeDistanceX;
|
|
157
|
+
if (pitchRatio >= MAX_PITCH_RATIO) {
|
|
158
|
+
return {
|
|
159
|
+
feedback: 'look-up',
|
|
160
|
+
message: 'Raise your chin slightly so your face points at the camera.',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (pitchRatio <= MIN_PITCH_RATIO) {
|
|
164
|
+
return {
|
|
165
|
+
feedback: 'look-down',
|
|
166
|
+
message: 'Lower your chin slightly so your face points at the camera.',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
111
169
|
return null;
|
|
112
170
|
}
|
|
113
171
|
function createFrameAdjustmentResult(confidence, feedback, message) {
|
|
@@ -116,6 +174,7 @@ function createFrameAdjustmentResult(confidence, feedback, message) {
|
|
|
116
174
|
faceCount: 1,
|
|
117
175
|
confidence,
|
|
118
176
|
captureScore: 0,
|
|
177
|
+
sharpnessScore: 0,
|
|
119
178
|
isCentered: false,
|
|
120
179
|
passesQualityChecks: false,
|
|
121
180
|
feedback,
|
|
@@ -125,12 +184,12 @@ function createFrameAdjustmentResult(confidence, feedback, message) {
|
|
|
125
184
|
function createQualityResult(result) {
|
|
126
185
|
return result;
|
|
127
186
|
}
|
|
128
|
-
function calculateCaptureScore(confidence, faceCenterX, faceCenterY, faceAreaRatio) {
|
|
187
|
+
function calculateCaptureScore(confidence, faceCenterX, faceCenterY, faceAreaRatio, sharpnessScore) {
|
|
129
188
|
const xPenalty = Math.abs(faceCenterX - 0.5) / CENTER_TOLERANCE_X;
|
|
130
189
|
const yPenalty = Math.abs(faceCenterY - 0.5) / CENTER_TOLERANCE_Y;
|
|
131
190
|
const centerScore = 1 - Math.min((xPenalty + yPenalty) / 2, 1);
|
|
132
191
|
const maxAreaDistance = Math.max(Math.abs(IDEAL_FACE_AREA_RATIO - MIN_FACE_AREA_RATIO), Math.abs(MAX_FACE_AREA_RATIO - IDEAL_FACE_AREA_RATIO));
|
|
133
192
|
const sizeScore = 1 - Math.min(Math.abs(faceAreaRatio - IDEAL_FACE_AREA_RATIO) / maxAreaDistance, 1);
|
|
134
|
-
return Number((confidence * 0.
|
|
193
|
+
return Number((confidence * 0.40 + centerScore * 0.25 + sizeScore * 0.10 + sharpnessScore * 0.25).toFixed(4));
|
|
135
194
|
}
|
|
136
195
|
//# sourceMappingURL=face-quality.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-quality.js","sourceRoot":"","sources":["../../src/services/face-quality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"face-quality.js","sourceRoot":"","sources":["../../src/services/face-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image sharpness estimation via Laplacian variance.
|
|
3
|
+
*
|
|
4
|
+
* A sharp image has strong edges (high second-derivative response) and
|
|
5
|
+
* therefore a high variance in the Laplacian-filtered output. A blurry
|
|
6
|
+
* image has weak edges and low variance.
|
|
7
|
+
*/
|
|
8
|
+
export interface SharpnessRegion {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
14
|
+
/** Minimum sharpness score (0–1) below which a frame is considered too blurry. */
|
|
15
|
+
export declare const MIN_SHARPNESS_SCORE = 0.15;
|
|
16
|
+
/**
|
|
17
|
+
* Compute a normalised sharpness score (0–1) for the given video frame.
|
|
18
|
+
*
|
|
19
|
+
* The score is the Laplacian variance of the face region, clamped and
|
|
20
|
+
* mapped to [0, 1] using {@link REFERENCE_VARIANCE} as the ceiling.
|
|
21
|
+
*
|
|
22
|
+
* @param video The video element to sample from.
|
|
23
|
+
* @param region The face bounding box in pixel coordinates.
|
|
24
|
+
* @param canvas An optional reusable offscreen canvas (avoids allocation per call).
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeSharpnessScore(video: HTMLVideoElement, region: SharpnessRegion, canvas?: HTMLCanvasElement): number;
|
|
27
|
+
/**
|
|
28
|
+
* Compute the Laplacian variance of an ImageData buffer.
|
|
29
|
+
*
|
|
30
|
+
* 1. Convert RGBA → luminance using BT.601 luma weights.
|
|
31
|
+
* 2. Convolve with the 3×3 Laplacian kernel: [[0,1,0],[1,-4,1],[0,1,0]]
|
|
32
|
+
* 3. Return the variance of the filtered values.
|
|
33
|
+
*
|
|
34
|
+
* Exported for direct unit-testing with synthetic ImageData.
|
|
35
|
+
*/
|
|
36
|
+
export declare function laplacianVariance(imageData: ImageData, grayBuffer?: Float32Array): number;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image sharpness estimation via Laplacian variance.
|
|
3
|
+
*
|
|
4
|
+
* A sharp image has strong edges (high second-derivative response) and
|
|
5
|
+
* therefore a high variance in the Laplacian-filtered output. A blurry
|
|
6
|
+
* image has weak edges and low variance.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Reference Laplacian variance used to normalise the raw variance into a
|
|
10
|
+
* 0–1 score. Values at or above this are mapped to 1.0. This was tuned
|
|
11
|
+
* empirically against 640×480 webcam frames; it may need adjustment for
|
|
12
|
+
* significantly different resolutions.
|
|
13
|
+
*/
|
|
14
|
+
const REFERENCE_VARIANCE = 800;
|
|
15
|
+
const GRAY_BUFFER_GROWTH_FACTOR = 1.5;
|
|
16
|
+
/** Minimum sharpness score (0–1) below which a frame is considered too blurry. */
|
|
17
|
+
export const MIN_SHARPNESS_SCORE = 0.15;
|
|
18
|
+
const grayBuffersByCanvas = new WeakMap();
|
|
19
|
+
/**
|
|
20
|
+
* Compute a normalised sharpness score (0–1) for the given video frame.
|
|
21
|
+
*
|
|
22
|
+
* The score is the Laplacian variance of the face region, clamped and
|
|
23
|
+
* mapped to [0, 1] using {@link REFERENCE_VARIANCE} as the ceiling.
|
|
24
|
+
*
|
|
25
|
+
* @param video The video element to sample from.
|
|
26
|
+
* @param region The face bounding box in pixel coordinates.
|
|
27
|
+
* @param canvas An optional reusable offscreen canvas (avoids allocation per call).
|
|
28
|
+
*/
|
|
29
|
+
export function computeSharpnessScore(video, region, canvas) {
|
|
30
|
+
const target = canvas ?? document.createElement('canvas');
|
|
31
|
+
target.width = region.width;
|
|
32
|
+
target.height = region.height;
|
|
33
|
+
const ctx = target.getContext('2d');
|
|
34
|
+
if (!ctx)
|
|
35
|
+
return 0;
|
|
36
|
+
ctx.drawImage(video, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
|
|
37
|
+
const imageData = ctx.getImageData(0, 0, region.width, region.height);
|
|
38
|
+
const grayBuffer = canvas ? getReusableGrayBuffer(canvas, region.width * region.height) : undefined;
|
|
39
|
+
const variance = Math.max(laplacianVariance(imageData, grayBuffer), 0);
|
|
40
|
+
return Math.min(Math.max(variance / REFERENCE_VARIANCE, 0), 1);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compute the Laplacian variance of an ImageData buffer.
|
|
44
|
+
*
|
|
45
|
+
* 1. Convert RGBA → luminance using BT.601 luma weights.
|
|
46
|
+
* 2. Convolve with the 3×3 Laplacian kernel: [[0,1,0],[1,-4,1],[0,1,0]]
|
|
47
|
+
* 3. Return the variance of the filtered values.
|
|
48
|
+
*
|
|
49
|
+
* Exported for direct unit-testing with synthetic ImageData.
|
|
50
|
+
*/
|
|
51
|
+
export function laplacianVariance(imageData, grayBuffer) {
|
|
52
|
+
const { data, width, height } = imageData;
|
|
53
|
+
// --- Step 1: grayscale luminance ---
|
|
54
|
+
const pixelCount = width * height;
|
|
55
|
+
const gray = grayBuffer && grayBuffer.length >= pixelCount
|
|
56
|
+
? grayBuffer
|
|
57
|
+
: new Float32Array(pixelCount);
|
|
58
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
59
|
+
const offset = i * 4;
|
|
60
|
+
// ITU-R BT.601 luma weights
|
|
61
|
+
gray[i] = data[offset] * 0.299 + data[offset + 1] * 0.587 + data[offset + 2] * 0.114;
|
|
62
|
+
}
|
|
63
|
+
// --- Step 2: Laplacian convolution (skip 1-pixel border) ---
|
|
64
|
+
const innerPixels = (width - 2) * (height - 2);
|
|
65
|
+
if (innerPixels <= 0)
|
|
66
|
+
return 0;
|
|
67
|
+
let sum = 0;
|
|
68
|
+
let sumSq = 0;
|
|
69
|
+
for (let y = 1; y < height - 1; y++) {
|
|
70
|
+
for (let x = 1; x < width - 1; x++) {
|
|
71
|
+
const idx = y * width + x;
|
|
72
|
+
const lap = gray[idx - width] + // top
|
|
73
|
+
gray[idx - 1] + // left
|
|
74
|
+
-4 * gray[idx] + // center
|
|
75
|
+
gray[idx + 1] + // right
|
|
76
|
+
gray[idx + width]; // bottom
|
|
77
|
+
sum += lap;
|
|
78
|
+
sumSq += lap * lap;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// variance = E[X²] - E[X]²
|
|
82
|
+
const mean = sum / innerPixels;
|
|
83
|
+
return Math.max(sumSq / innerPixels - mean * mean, 0);
|
|
84
|
+
}
|
|
85
|
+
function getReusableGrayBuffer(canvas, pixelCount) {
|
|
86
|
+
const existing = grayBuffersByCanvas.get(canvas);
|
|
87
|
+
if (existing && existing.length >= pixelCount) {
|
|
88
|
+
return existing;
|
|
89
|
+
}
|
|
90
|
+
const nextSize = existing
|
|
91
|
+
? Math.max(pixelCount, Math.ceil(existing.length * GRAY_BUFFER_GROWTH_FACTOR))
|
|
92
|
+
: pixelCount;
|
|
93
|
+
const next = new Float32Array(nextSize);
|
|
94
|
+
grayBuffersByCanvas.set(canvas, next);
|
|
95
|
+
return next;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=sharpness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharpness.js","sourceRoot":"","sources":["../../src/services/sharpness.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,10 @@ export declare class CameraAccessError extends Error {
|
|
|
6
6
|
}
|
|
7
7
|
export interface ReusableFrameCapture {
|
|
8
8
|
captureBlob: (video: HTMLVideoElement) => Promise<Blob>;
|
|
9
|
+
/** Snapshot the current video frame to an internal working canvas. */
|
|
10
|
+
captureWorkingFrame: (video: HTMLVideoElement) => void;
|
|
11
|
+
/** Copy the working canvas to the best-frame canvas, replacing any previous best. */
|
|
12
|
+
promoteWorkingToBest: () => void;
|
|
9
13
|
storeBestFrame: (video: HTMLVideoElement) => void;
|
|
10
14
|
hasStoredBestFrame: () => boolean;
|
|
11
15
|
storedBestFrameToBlob: () => Promise<Blob>;
|
|
@@ -78,6 +78,18 @@ export function createReusableFrameCapture() {
|
|
|
78
78
|
drawFrame(video, workingCanvas);
|
|
79
79
|
return canvasToBlob(workingCanvas);
|
|
80
80
|
},
|
|
81
|
+
captureWorkingFrame(video) {
|
|
82
|
+
drawFrame(video, workingCanvas);
|
|
83
|
+
},
|
|
84
|
+
promoteWorkingToBest() {
|
|
85
|
+
if (!workingCanvas.width || !workingCanvas.height) {
|
|
86
|
+
throw new Error('No working frame to promote.');
|
|
87
|
+
}
|
|
88
|
+
bestFrameCanvas.width = workingCanvas.width;
|
|
89
|
+
bestFrameCanvas.height = workingCanvas.height;
|
|
90
|
+
getContext(bestFrameCanvas).drawImage(workingCanvas, 0, 0);
|
|
91
|
+
hasStoredBestFrame = true;
|
|
92
|
+
},
|
|
81
93
|
storeBestFrame(video) {
|
|
82
94
|
drawFrame(video, bestFrameCanvas);
|
|
83
95
|
hasStoredBestFrame = true;
|