@sssxyd/face-liveness-detector 0.3.5 → 0.4.0-alpha.2
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/README.md +61 -45
- package/README.zh-Hans.md +695 -0
- package/dist/index.esm.js +4096 -1368
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +4098 -1367
- package/dist/index.js.map +1 -1
- package/dist/types/__tests__/motion-liveness-detector.test.d.ts +6 -0
- package/dist/types/__tests__/motion-liveness-detector.test.d.ts.map +1 -0
- package/dist/types/browser_utils.d.ts +18 -0
- package/dist/types/browser_utils.d.ts.map +1 -0
- package/dist/types/config.d.ts +3 -6
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/enums.d.ts +7 -1
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/face-detection-engine.d.ts +132 -0
- package/dist/types/face-detection-engine.d.ts.map +1 -0
- package/dist/types/face-detection-state.d.ts +35 -0
- package/dist/types/face-detection-state.d.ts.map +1 -0
- package/dist/types/face-frontal-calculator.d.ts +130 -0
- package/dist/types/face-frontal-calculator.d.ts.map +1 -0
- package/dist/types/image-quality-calculator.d.ts +66 -0
- package/dist/types/image-quality-calculator.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -191
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/library-loader.d.ts.map +1 -1
- package/dist/types/motion-liveness-detector.d.ts +198 -0
- package/dist/types/motion-liveness-detector.d.ts.map +1 -0
- package/dist/types/screen-capture-detector.d.ts +187 -0
- package/dist/types/screen-capture-detector.d.ts.map +1 -0
- package/dist/types/screen-color-profile-detect.d.ts +77 -0
- package/dist/types/screen-color-profile-detect.d.ts.map +1 -0
- package/dist/types/screen-moire-pattern-detect.d.ts +102 -0
- package/dist/types/screen-moire-pattern-detect.d.ts.map +1 -0
- package/dist/types/screen-rgb-emission-detect.d.ts +42 -0
- package/dist/types/screen-rgb-emission-detect.d.ts.map +1 -0
- package/dist/types/types.d.ts +67 -62
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/uniapp-resource-manager.d.ts +57 -0
- package/dist/types/uniapp-resource-manager.d.ts.map +1 -0
- package/dist/types/uniapp-sdk.d.ts +89 -0
- package/dist/types/uniapp-sdk.d.ts.map +1 -0
- package/package.json +14 -4
- package/dist/types/__tests__/config.test.d.ts +0 -5
- package/dist/types/__tests__/config.test.d.ts.map +0 -1
- package/dist/types/__tests__/enums.test.d.ts +0 -5
- package/dist/types/__tests__/enums.test.d.ts.map +0 -1
- package/dist/types/__tests__/event-emitter.test.d.ts +0 -5
- package/dist/types/__tests__/event-emitter.test.d.ts.map +0 -1
- package/dist/types/__tests__/face-detection-engine.test.d.ts +0 -7
- package/dist/types/__tests__/face-detection-engine.test.d.ts.map +0 -1
- package/dist/types/exports.d.ts +0 -11
- package/dist/types/exports.d.ts.map +0 -1
package/dist/types/config.d.ts
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Face Detection Engine - Configuration
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
/**
|
|
6
|
-
* Default configuration for FaceDetectionEngine
|
|
7
|
-
*/
|
|
8
|
-
export declare const DEFAULT_CONFIG: FaceDetectionEngineConfig;
|
|
4
|
+
import type { ResolvedEngineOptions, FaceDetectionEngineOptions } from './types';
|
|
9
5
|
/**
|
|
10
6
|
* Merge user configuration with defaults
|
|
7
|
+
* Nested objects (face_frontal_features, image_quality_features) are deeply merged
|
|
11
8
|
* @param userConfig - User provided configuration (partial, optional)
|
|
12
9
|
* @returns Complete resolved configuration with all required fields
|
|
13
10
|
*/
|
|
14
|
-
export declare function
|
|
11
|
+
export declare function mergeOptions(userConfig?: Partial<FaceDetectionEngineOptions>): ResolvedEngineOptions;
|
|
15
12
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AA8EhF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC/C,qBAAqB,CAwBvB"}
|
package/dist/types/enums.d.ts
CHANGED
|
@@ -40,6 +40,12 @@ export declare enum ErrorCode {
|
|
|
40
40
|
DETECTOR_NOT_INITIALIZED = "DETECTOR_NOT_INITIALIZED",
|
|
41
41
|
CAMERA_ACCESS_DENIED = "CAMERA_ACCESS_DENIED",
|
|
42
42
|
STREAM_ACQUISITION_FAILED = "STREAM_ACQUISITION_FAILED",
|
|
43
|
-
|
|
43
|
+
INTERNAL_ERROR = "INTERNAL_ERROR"
|
|
44
|
+
}
|
|
45
|
+
export declare enum EngineState {
|
|
46
|
+
IDLE = "idle",// 初始状态
|
|
47
|
+
INITIALIZING = "initializing",// 正在初始化
|
|
48
|
+
READY = "ready",// 初始化完成,就绪
|
|
49
|
+
DETECTING = "detecting"
|
|
44
50
|
}
|
|
45
51
|
//# sourceMappingURL=enums.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../src/enums.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,cAAc;IAExB,KAAK,UAAU;IAEf,UAAU,eAAe;IAEzB,GAAG,QAAQ;CACZ;AAED;;GAEG;AACH,oBAAY,oBAAoB;IAC9B,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,OAAO,YAAY;CACpB;AAED,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;CACpC;AAED;;GAEG;AACH,oBAAY,SAAS;IAEnB,wBAAwB,6BAA6B;IAErD,oBAAoB,yBAAyB;IAE7C,yBAAyB,8BAA8B;IAEvD,
|
|
1
|
+
{"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../src/enums.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,cAAc;IAExB,KAAK,UAAU;IAEf,UAAU,eAAe;IAEzB,GAAG,QAAQ;CACZ;AAED;;GAEG;AACH,oBAAY,oBAAoB;IAC9B,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,OAAO,YAAY;CACpB;AAED,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;CACpC;AAED;;GAEG;AACH,oBAAY,SAAS;IAEnB,wBAAwB,6BAA6B;IAErD,oBAAoB,yBAAyB;IAE7C,yBAAyB,8BAA8B;IAEvD,cAAc,mBAAmB;CAClC;AAED,oBAAY,WAAW;IACrB,IAAI,SAAS,CAAqB,OAAO;IACzC,YAAY,iBAAiB,CAAK,QAAQ;IAC1C,KAAK,UAAU,CAAmB,WAAW;IAC7C,SAAS,cAAc;CACxB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Face Detection Engine - Core Detection Engine
|
|
3
|
+
* Framework-agnostic face liveness detection engine
|
|
4
|
+
*/
|
|
5
|
+
import type { FaceDetectionEngineOptions } from './types';
|
|
6
|
+
import { EngineState } from './enums';
|
|
7
|
+
import { SimpleEventEmitter } from './event-emitter';
|
|
8
|
+
/**
|
|
9
|
+
* Framework-agnostic face liveness detection engine
|
|
10
|
+
* Provides core detection logic without UI dependencies
|
|
11
|
+
*/
|
|
12
|
+
export declare class FaceDetectionEngine extends SimpleEventEmitter {
|
|
13
|
+
private options;
|
|
14
|
+
private cv;
|
|
15
|
+
private human;
|
|
16
|
+
private engineState;
|
|
17
|
+
private videoElement;
|
|
18
|
+
private stream;
|
|
19
|
+
private frameCanvasElement;
|
|
20
|
+
private frameCanvasContext;
|
|
21
|
+
private faceCanvasElement;
|
|
22
|
+
private faceCanvasContext;
|
|
23
|
+
private detectionFrameId;
|
|
24
|
+
private actualVideoWidth;
|
|
25
|
+
private actualVideoHeight;
|
|
26
|
+
private detectionState;
|
|
27
|
+
/**
|
|
28
|
+
* Constructor
|
|
29
|
+
* @param config - Configuration object
|
|
30
|
+
*/
|
|
31
|
+
constructor(options?: Partial<FaceDetectionEngineOptions>);
|
|
32
|
+
updateOptions(options?: Partial<FaceDetectionEngineOptions>): void;
|
|
33
|
+
getEngineState(): EngineState;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the detection engine
|
|
36
|
+
* Loads Human.js and OpenCV.js libraries
|
|
37
|
+
*
|
|
38
|
+
* @returns Promise that resolves when initialization is complete
|
|
39
|
+
* @throws Error if initialization fails
|
|
40
|
+
*/
|
|
41
|
+
initialize(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Start face detection
|
|
44
|
+
* Requires initialize() to be called first and a video element to be provided
|
|
45
|
+
*
|
|
46
|
+
* @param videoElement - HTMLVideoElement to capture from
|
|
47
|
+
* @returns Promise that resolves when detection starts
|
|
48
|
+
* @throws Error if not initialized or video setup fails
|
|
49
|
+
*/
|
|
50
|
+
startDetection(videoElement: HTMLVideoElement): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Stop face detection
|
|
53
|
+
* @param success - Whether to display the best collected image
|
|
54
|
+
*/
|
|
55
|
+
stopDetection(success: boolean): void;
|
|
56
|
+
/**
|
|
57
|
+
* Get current configuration
|
|
58
|
+
* @returns Current configuration
|
|
59
|
+
*/
|
|
60
|
+
getOptions(): FaceDetectionEngineOptions;
|
|
61
|
+
/**
|
|
62
|
+
* Reset detection state
|
|
63
|
+
*/
|
|
64
|
+
private resetDetectionState;
|
|
65
|
+
/**
|
|
66
|
+
* Schedule next detection frame
|
|
67
|
+
*/
|
|
68
|
+
private scheduleNextDetection;
|
|
69
|
+
/**
|
|
70
|
+
* Cancel pending detection frame
|
|
71
|
+
*/
|
|
72
|
+
private cancelPendingDetection;
|
|
73
|
+
/**
|
|
74
|
+
* Main detection loop
|
|
75
|
+
*/
|
|
76
|
+
private detect;
|
|
77
|
+
private getPerformActionCount;
|
|
78
|
+
/**
|
|
79
|
+
* Handle single face detection
|
|
80
|
+
*/
|
|
81
|
+
private handleSingleFace;
|
|
82
|
+
/**
|
|
83
|
+
* Handle detect phase
|
|
84
|
+
*/
|
|
85
|
+
private handleDetectPhase;
|
|
86
|
+
/**
|
|
87
|
+
* Handle collect phase
|
|
88
|
+
*/
|
|
89
|
+
private handleCollectPhase;
|
|
90
|
+
/**
|
|
91
|
+
* Handle verify phase
|
|
92
|
+
*/
|
|
93
|
+
private handleVerifyPhase;
|
|
94
|
+
/**
|
|
95
|
+
* Handle multiple or no faces
|
|
96
|
+
*/
|
|
97
|
+
private handleMultipleFaces;
|
|
98
|
+
private collectHighQualityImage;
|
|
99
|
+
private emitDetectorInfo;
|
|
100
|
+
/**
|
|
101
|
+
* Select next action
|
|
102
|
+
*/
|
|
103
|
+
private selectNextAction;
|
|
104
|
+
/**
|
|
105
|
+
* Detect specific action
|
|
106
|
+
*/
|
|
107
|
+
private detectAction;
|
|
108
|
+
/**
|
|
109
|
+
* Emit debug event
|
|
110
|
+
*/
|
|
111
|
+
private emitDebug;
|
|
112
|
+
/**
|
|
113
|
+
* Draw video frame to canvas (internal use, not converted to Base64)
|
|
114
|
+
* @returns {HTMLCanvasElement | null} Canvas after drawing, returns null if failed
|
|
115
|
+
*/
|
|
116
|
+
private drawVideoToCanvas;
|
|
117
|
+
private clearFrameCanvas;
|
|
118
|
+
private clearFaceCanvas;
|
|
119
|
+
/**
|
|
120
|
+
* 将 canvas 转换为 Base64 JPEG 图片数据
|
|
121
|
+
* @param {HTMLCanvasElement} canvas - 输入的 canvas
|
|
122
|
+
* @returns {string | null} Base64 格式的 JPEG 图片数据
|
|
123
|
+
*/
|
|
124
|
+
private canvasToBase64;
|
|
125
|
+
/**
|
|
126
|
+
* Capture current video frame (returns Base64)
|
|
127
|
+
* @param {Box} box - Face box
|
|
128
|
+
* @returns {string | null} Base64 encoded JPEG image data
|
|
129
|
+
*/
|
|
130
|
+
private captureFrame;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=face-detection-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-detection-engine.d.ts","sourceRoot":"","sources":["../../src/face-detection-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,0BAA0B,EAQ3B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAmF,WAAW,EAAE,MAAM,SAAS,CAAA;AAEtH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAwBpD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB;IACzD,OAAO,CAAC,OAAO,CAAuB;IAEtC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,KAAK,CAAqB;IAElC,OAAO,CAAC,WAAW,CAAgC;IAGnD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,kBAAkB,CAAwC;IAClE,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,iBAAiB,CAAwC;IAEjE,OAAO,CAAC,gBAAgB,CAAsB;IAE9C,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAY;IAErC,OAAO,CAAC,cAAc,CAAgB;IAEtC;;;OAGG;gBACS,OAAO,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAMzD,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,IAAI;IAQlE,cAAc,IAAI,WAAW;IAI7B;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+KjC;;;;;;;OAOG;IACG,cAAc,CAAC,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0InE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA8BrC;;;OAGG;IACH,UAAU,IAAI,0BAA0B;IAMxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;YACW,MAAM;IAwDpB,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiNxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,uBAAuB;IA6B/B,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwDzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,eAAe;IAWvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CA+BrB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DetectionPeriod, LivenessAction } from "./enums";
|
|
2
|
+
import { MotionLivenessDetector } from "./motion-liveness-detector";
|
|
3
|
+
import { ScreenCaptureDetector } from './screen-capture-detector';
|
|
4
|
+
import { ResolvedEngineOptions } from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* Internal detection state interface
|
|
7
|
+
*/
|
|
8
|
+
export declare class DetectionState {
|
|
9
|
+
period: DetectionPeriod;
|
|
10
|
+
startTime: number;
|
|
11
|
+
collectCount: number;
|
|
12
|
+
suspectedFraudsCount: number;
|
|
13
|
+
bestQualityScore: number;
|
|
14
|
+
bestFrameImage: string | null;
|
|
15
|
+
bestFaceImage: string | null;
|
|
16
|
+
completedActions: Set<LivenessAction>;
|
|
17
|
+
currentAction: LivenessAction | null;
|
|
18
|
+
actionVerifyTimeout: ReturnType<typeof setTimeout> | null;
|
|
19
|
+
lastFrontalScore: number;
|
|
20
|
+
motionDetector: MotionLivenessDetector | null;
|
|
21
|
+
liveness: boolean;
|
|
22
|
+
screenDetector: ScreenCaptureDetector | null;
|
|
23
|
+
constructor(options: Partial<DetectionState>);
|
|
24
|
+
reset(): void;
|
|
25
|
+
needFrontalFace(): boolean;
|
|
26
|
+
isReadyToVerify(minCollectCount: number): boolean;
|
|
27
|
+
onActionStarted(nextAction: LivenessAction, timeoutMills: number, timeoutCallback: () => void): void;
|
|
28
|
+
onActionCompleted(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Clear action verify timeout
|
|
31
|
+
*/
|
|
32
|
+
private clearActionVerifyTimeout;
|
|
33
|
+
}
|
|
34
|
+
export declare function createDetectionState(options: ResolvedEngineOptions): DetectionState;
|
|
35
|
+
//# sourceMappingURL=face-detection-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-detection-state.d.ts","sourceRoot":"","sources":["../../src/face-detection-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAA;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAA6B,MAAM,2BAA2B,CAAA;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE/C;;GAEG;AACH,qBAAa,cAAc;IACvB,MAAM,EAAE,eAAe,CAAyB;IAChD,SAAS,EAAE,MAAM,CAAoB;IACrC,YAAY,EAAE,MAAM,CAAI;IACxB,oBAAoB,EAAE,MAAM,CAAI;IAChC,gBAAgB,EAAE,MAAM,CAAI;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAO;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IACnC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAY;IACjD,aAAa,EAAE,cAAc,GAAG,IAAI,CAAO;IAC3C,mBAAmB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAO;IAChE,gBAAgB,EAAE,MAAM,CAAI;IAC5B,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAO;IACpD,QAAQ,EAAE,OAAO,CAAQ;IACzB,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAO;gBAEvC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;IAI5C,KAAK,IAAI,IAAI;IAeb,eAAe,IAAI,OAAO;IAK1B,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAUjD,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,IAAI,GAAG,IAAI;IASpG,iBAAiB,IAAI,IAAI;IASzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAMnC;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CA4BnF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 人脸正对度检测模块 - 混合多尺度算法版本
|
|
3
|
+
*
|
|
4
|
+
* 使用四层混合检测策略:
|
|
5
|
+
* 1. 特征点对称性检测 (40%) - 眼睛水平线、鼻子中心、嘴角对称性
|
|
6
|
+
* 2. 轮廓对称性检测 (35%) - Sobel 边缘检测的轮廓对称性
|
|
7
|
+
* 3. 角度融合分析 (25%) - Yaw/Pitch/Roll 角度综合评分
|
|
8
|
+
* 4. 手势识别验证 - 作为额外验证
|
|
9
|
+
*
|
|
10
|
+
* 相比单一方法,混合算法提升准确度 30-40%
|
|
11
|
+
*/
|
|
12
|
+
import { FaceResult, GestureResult } from '@vladmandic/human';
|
|
13
|
+
import { FaceFrontalFeatures } from './types';
|
|
14
|
+
/**
|
|
15
|
+
* 角度分析结果接口
|
|
16
|
+
*/
|
|
17
|
+
export interface AngleAnalysisResult {
|
|
18
|
+
yaw: number;
|
|
19
|
+
pitch: number;
|
|
20
|
+
roll: number;
|
|
21
|
+
score: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 检查人脸是否正对摄像头 - 主函数(混合多尺度版本)
|
|
25
|
+
*
|
|
26
|
+
* 使用四层混合检测策略:
|
|
27
|
+
* 1. 特征点对称性检测 (40%) - 最准确
|
|
28
|
+
* 2. 轮廓对称性检测 (35%) - 快速且鲁棒
|
|
29
|
+
* 3. 角度融合分析 (25%) - 补充验证
|
|
30
|
+
* 4. 手势识别验证 - 额外验证(如果提供手势数据)
|
|
31
|
+
*
|
|
32
|
+
* @param {any} cv - OpenCV 实例(用于轮廓对称性检测)
|
|
33
|
+
* @param {FaceResult} face - 人脸检测结果(包含 rotation 和 annotations 信息)
|
|
34
|
+
* @param {Array<GestureResult>} gestures - 检测到的手势/表情数组(可选)
|
|
35
|
+
* @param {any} matImage - OpenCV Mat 对象(图像数据,用于轮廓检测)
|
|
36
|
+
* @param {FaceFrontalFeatures} config - 正对度配置参数(包含角度阈值)
|
|
37
|
+
* @returns {number} 正对度评分 (0-1),1 表示完全正对
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* const mat = drawVideoToMat()
|
|
41
|
+
* const score = calcFaceFrontal(cv, face, gestures, mat, config)
|
|
42
|
+
* if (score > 0.9) {
|
|
43
|
+
* console.log('人脸足够正对')
|
|
44
|
+
* }
|
|
45
|
+
* mat.delete()
|
|
46
|
+
*/
|
|
47
|
+
export declare function calcFaceFrontal(cv: any, face: FaceResult, gestures: Array<GestureResult>, matImage: any, config: FaceFrontalFeatures): number;
|
|
48
|
+
/**
|
|
49
|
+
* 使用手势识别方法检查人脸正对度
|
|
50
|
+
*
|
|
51
|
+
* 从 Human.js 返回的手势中查找 "facing center" 标志
|
|
52
|
+
*
|
|
53
|
+
* @param {Array<GestureResult>} gestures - Human.js 检测到的手势数组
|
|
54
|
+
* @returns {number} 评分 (0-1),0 表示未检测到相关手势
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* const score = checkFaceFrontalWithGestures(result.gesture)
|
|
58
|
+
*/
|
|
59
|
+
export declare function checkFaceFrontalWithGestures(gestures: Array<GestureResult>): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* 使用角度分析方法检查人脸正对度
|
|
62
|
+
*
|
|
63
|
+
* 分析人脸的 yaw、pitch、roll 三个角度
|
|
64
|
+
* 使用加权评分:yaw (60%) + pitch (25%) + roll (15%)
|
|
65
|
+
* 直接使用 CONFIG.FACE_FRONTAL 中的参数
|
|
66
|
+
*
|
|
67
|
+
* @param {FaceResult} face - 人脸检测结果
|
|
68
|
+
* @param {FaceFrontalFeatures} config - 正对度配置参数
|
|
69
|
+
* @returns {number} 正对度评分 (0-1)
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* const score = checkFaceFrontalWithAngles(face, config)
|
|
73
|
+
*/
|
|
74
|
+
export declare function checkFaceFrontalWithAngles(face: FaceResult, config: FaceFrontalFeatures): number;
|
|
75
|
+
/**
|
|
76
|
+
* 从人脸检测结果中提取三维旋转角度
|
|
77
|
+
*
|
|
78
|
+
* 返回标准化的 yaw、pitch、roll 角度值(单位:度)
|
|
79
|
+
*
|
|
80
|
+
* @param {FaceResult} face - Human.js 人脸检测结果
|
|
81
|
+
* @returns {AngleAnalysisResult} 包含角度和评分的结果对象
|
|
82
|
+
*/
|
|
83
|
+
export declare function extractFaceAngles(face: FaceResult): AngleAnalysisResult;
|
|
84
|
+
/**
|
|
85
|
+
* 获取角度分析的详细信息
|
|
86
|
+
*
|
|
87
|
+
* 返回每个角度维度的详细评分和状态
|
|
88
|
+
* 直接使用 CONFIG.FACE_FRONTAL 中的参数
|
|
89
|
+
*
|
|
90
|
+
* @param {FaceResult} face - 人脸检测结果
|
|
91
|
+
* @param {FaceFrontalFeatures} config - 正对度配置参数
|
|
92
|
+
* @returns {object} 包含各维度评分的详细对象
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* const details = getAngleAnalysisDetails(face, config)
|
|
96
|
+
* console.log(details.yawScore) // 0.85
|
|
97
|
+
* console.log(details.issues) // ['Yaw 角度超过阈值']
|
|
98
|
+
*/
|
|
99
|
+
export declare function getAngleAnalysisDetails(face: FaceResult, config: FaceFrontalFeatures): Record<string, any>;
|
|
100
|
+
/**
|
|
101
|
+
* 获取人脸正对度的描述文本
|
|
102
|
+
*
|
|
103
|
+
* 将评分转换为用户友好的描述
|
|
104
|
+
*
|
|
105
|
+
* @param {number} score - 正对度评分 (0-1)
|
|
106
|
+
* @returns {string} 描述文本
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* console.log(getFrontalDescription(0.95)) // "非常正对"
|
|
110
|
+
* console.log(getFrontalDescription(0.6)) // "请调整角度"
|
|
111
|
+
*/
|
|
112
|
+
export declare function getFrontalDescription(score: number): string;
|
|
113
|
+
/**
|
|
114
|
+
* 根据人脸角度给出具体的调整建议
|
|
115
|
+
*
|
|
116
|
+
* 直接使用 CONFIG.FACE_FRONTAL 中的参数
|
|
117
|
+
*
|
|
118
|
+
* @param {FaceResult} face - 人脸检测结果
|
|
119
|
+
* @param {FaceFrontalFeatures} config - 正对度配置参数
|
|
120
|
+
* @returns {string[]} 调整建议列表
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* const suggestions = getAdjustmentSuggestions(face, config)
|
|
124
|
+
* suggestions.forEach(s => console.log(s))
|
|
125
|
+
* // 输出:
|
|
126
|
+
* // "请向左转动头部"
|
|
127
|
+
* // "请抬起头部"
|
|
128
|
+
*/
|
|
129
|
+
export declare function getAdjustmentSuggestions(face: FaceResult, config: FaceFrontalFeatures): string[];
|
|
130
|
+
//# sourceMappingURL=face-frontal-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-frontal-calculator.d.ts","sourceRoot":"","sources":["../../src/face-frontal-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAG7C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,EAC9B,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAgCR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO,CAUpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,CA8BhG;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAUvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAiD1G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAwChG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 人脸图像质量检测模块 (统一版)
|
|
3
|
+
*
|
|
4
|
+
* 综合检测人脸图像的:
|
|
5
|
+
* 1. 完整度检测 - 人脸是否完整在框内
|
|
6
|
+
* 2. 模糊度检测 - 图像是否清晰
|
|
7
|
+
* 3. 轮廓清晰度 - 轮廓的连通性和完整度
|
|
8
|
+
*
|
|
9
|
+
* 使用混合检测策略,结合 Human.js 和 OpenCV.js 优势
|
|
10
|
+
*/
|
|
11
|
+
import { FaceResult } from '@vladmandic/human';
|
|
12
|
+
import { ImageQualityFeatures } from './types';
|
|
13
|
+
/**
|
|
14
|
+
* 单个检测指标的结果
|
|
15
|
+
*/
|
|
16
|
+
export interface QualityMetricResult {
|
|
17
|
+
name: string;
|
|
18
|
+
value: number;
|
|
19
|
+
threshold: number;
|
|
20
|
+
passed: boolean;
|
|
21
|
+
description: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 图像质量检测的综合结果
|
|
25
|
+
*/
|
|
26
|
+
export interface ImageQualityResult {
|
|
27
|
+
passed: boolean;
|
|
28
|
+
score: number;
|
|
29
|
+
completenessReasons: string[];
|
|
30
|
+
blurReasons: string[];
|
|
31
|
+
metrics: {
|
|
32
|
+
completeness: QualityMetricResult;
|
|
33
|
+
laplacianVariance: QualityMetricResult;
|
|
34
|
+
gradientSharpness: QualityMetricResult;
|
|
35
|
+
overallQuality: QualityMetricResult;
|
|
36
|
+
};
|
|
37
|
+
suggestions?: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 计算图像质量(完整度 + 清晰度)
|
|
41
|
+
*
|
|
42
|
+
* 综合检测:
|
|
43
|
+
* - 人脸完整度(Human.js边界 + OpenCV轮廓)
|
|
44
|
+
* - 图像清晰度(拉普拉斯方差 + Sobel梯度)
|
|
45
|
+
*
|
|
46
|
+
* @param cv - OpenCV.js 对象,用于执行图像处理操作
|
|
47
|
+
* @param matImage - OpenCV Mat 对象,包含灰度图像数据
|
|
48
|
+
* @param face - 人脸检测结果,包含人脸框位置和其他检测信息
|
|
49
|
+
* @param imageWidth - 图片宽度(像素),用于边界检查和完整度计算
|
|
50
|
+
* @param imageHeight - 图片高度(像素),用于边界检查和完整度计算
|
|
51
|
+
* @param config - 检测配置对象,包含:
|
|
52
|
+
* - require_full_face_in_bounds: 是否要求人脸完全在边界内
|
|
53
|
+
* - use_opencv_enhancement: 是否使用 OpenCV 增强检测
|
|
54
|
+
* - min_laplacian_variance: 拉普拉斯方差最小阈值
|
|
55
|
+
* - min_gradient_sharpness: 梯度清晰度最小阈值
|
|
56
|
+
* @param threshold - 综合质量评分阈值 (0-1),大于等于此值判定为通过
|
|
57
|
+
* @returns 综合质量检测结果,包含:
|
|
58
|
+
* - passed: 是否通过质量检测
|
|
59
|
+
* - score: 综合质量评分 (0-1)
|
|
60
|
+
* - completenessReasons: 完整度不通过原因列表
|
|
61
|
+
* - blurReasons: 清晰度不通过原因列表
|
|
62
|
+
* - metrics: 各维度详细指标(完整度、拉普拉斯方差、梯度清晰度、综合质量)
|
|
63
|
+
* - suggestions: 改进建议列表
|
|
64
|
+
*/
|
|
65
|
+
export declare function calcImageQuality(cv: any, matImage: any, face: FaceResult, imageWidth: number, imageHeight: number, config: ImageQualityFeatures, threshold: number): ImageQualityResult;
|
|
66
|
+
//# sourceMappingURL=image-quality-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-quality-calculator.d.ts","sourceRoot":"","sources":["../../src/image-quality-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAI9C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAEjC,MAAM,EAAE,OAAO,CAAA;IAEf,KAAK,EAAE,MAAM,CAAA;IAEb,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAA;IAErB,OAAO,EAAE;QACP,YAAY,EAAE,mBAAmB,CAAA;QACjC,iBAAiB,EAAE,mBAAmB,CAAA;QACtC,iBAAiB,EAAE,mBAAmB,CAAA;QACtC,cAAc,EAAE,mBAAmB,CAAA;KACpC,CAAA;IAED,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,GAAG,EACP,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAoEpB"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -2,198 +2,12 @@
|
|
|
2
2
|
* Face Detection Engine - Core Detection Engine
|
|
3
3
|
* Framework-agnostic face liveness detection engine
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Framework-agnostic face liveness detection engine
|
|
9
|
-
* Provides core detection logic without UI dependencies
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const engine = new FaceDetectionEngine({
|
|
14
|
-
* min_face_ratio: 0.5,
|
|
15
|
-
* max_face_ratio: 0.9,
|
|
16
|
-
* liveness_action_count: 1
|
|
17
|
-
* })
|
|
18
|
-
*
|
|
19
|
-
* engine.on('detector-loaded', () => {
|
|
20
|
-
* console.log('Engine ready')
|
|
21
|
-
* engine.startDetection(videoElement, canvasElement)
|
|
22
|
-
* })
|
|
23
|
-
*
|
|
24
|
-
* engine.on('detector-finish', (data) => {
|
|
25
|
-
* console.log('Liveness detection completed:', data)
|
|
26
|
-
* })
|
|
27
|
-
*
|
|
28
|
-
* engine.on('detector-error', (error) => {
|
|
29
|
-
* console.error('Detection error:', error)
|
|
30
|
-
* })
|
|
31
|
-
*
|
|
32
|
-
* await engine.initialize()
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export declare class FaceDetectionEngine extends SimpleEventEmitter {
|
|
36
|
-
private config;
|
|
37
|
-
private human;
|
|
38
|
-
private stream;
|
|
39
|
-
private isDetecting;
|
|
40
|
-
private isReady;
|
|
41
|
-
private isInitializing;
|
|
42
|
-
private videoElement;
|
|
43
|
-
private frameCanvasElement;
|
|
44
|
-
private frameCanvasContext;
|
|
45
|
-
private faceCanvasElement;
|
|
46
|
-
private faceCanvasContext;
|
|
47
|
-
private detectionFrameId;
|
|
48
|
-
private actualVideoWidth;
|
|
49
|
-
private actualVideoHeight;
|
|
50
|
-
private detectionState;
|
|
51
|
-
/**
|
|
52
|
-
* Constructor
|
|
53
|
-
* @param config - Configuration object
|
|
54
|
-
*/
|
|
55
|
-
constructor(config?: Partial<FaceDetectionEngineConfig>);
|
|
56
|
-
/**
|
|
57
|
-
* Initialize the detection engine
|
|
58
|
-
* Loads Human.js and OpenCV.js libraries
|
|
59
|
-
*
|
|
60
|
-
* @returns Promise that resolves when initialization is complete
|
|
61
|
-
* @throws Error if initialization fails
|
|
62
|
-
*/
|
|
63
|
-
initialize(): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Start face detection
|
|
66
|
-
* Requires initialize() to be called first and a video element to be provided
|
|
67
|
-
*
|
|
68
|
-
* @param videoElement - HTMLVideoElement to capture from
|
|
69
|
-
* @returns Promise that resolves when detection starts
|
|
70
|
-
* @throws Error if not initialized or video setup fails
|
|
71
|
-
*/
|
|
72
|
-
startDetection(videoElement: HTMLVideoElement): Promise<void>;
|
|
73
|
-
/**
|
|
74
|
-
* Stop face detection
|
|
75
|
-
* @param success - Whether to display the best collected image
|
|
76
|
-
*/
|
|
77
|
-
stopDetection(success: boolean): void;
|
|
78
|
-
/**
|
|
79
|
-
* Update configuration
|
|
80
|
-
* Note: Some settings may not take effect if called during detection
|
|
81
|
-
*
|
|
82
|
-
* @param config - Configuration overrides
|
|
83
|
-
*/
|
|
84
|
-
updateConfig(config: Partial<FaceDetectionEngineConfig>): void;
|
|
85
|
-
/**
|
|
86
|
-
* Get current configuration
|
|
87
|
-
* @returns Current configuration
|
|
88
|
-
*/
|
|
89
|
-
getConfig(): FaceDetectionEngineConfig;
|
|
90
|
-
/**
|
|
91
|
-
* Get detection status
|
|
92
|
-
* @returns Object with status information
|
|
93
|
-
*/
|
|
94
|
-
getStatus(): {
|
|
95
|
-
isReady: boolean;
|
|
96
|
-
isDetecting: boolean;
|
|
97
|
-
isInitializing: boolean;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* Reset detection state
|
|
101
|
-
*/
|
|
102
|
-
private resetDetectionState;
|
|
103
|
-
/**
|
|
104
|
-
* Schedule next detection frame
|
|
105
|
-
*/
|
|
106
|
-
private scheduleNextDetection;
|
|
107
|
-
/**
|
|
108
|
-
* Cancel pending detection frame
|
|
109
|
-
*/
|
|
110
|
-
private cancelPendingDetection;
|
|
111
|
-
/**
|
|
112
|
-
* Main detection loop
|
|
113
|
-
*/
|
|
114
|
-
private detect;
|
|
115
|
-
private getPerformActionCount;
|
|
116
|
-
/**
|
|
117
|
-
* Handle single face detection
|
|
118
|
-
*/
|
|
119
|
-
private handleSingleFace;
|
|
120
|
-
/**
|
|
121
|
-
* Validate face box existence
|
|
122
|
-
*/
|
|
123
|
-
private validateFaceBox;
|
|
124
|
-
/**
|
|
125
|
-
* Validate face size ratio
|
|
126
|
-
*/
|
|
127
|
-
private validateFaceSize;
|
|
128
|
-
/**
|
|
129
|
-
* Validate face frontal angle
|
|
130
|
-
*/
|
|
131
|
-
private validateFaceFrontal;
|
|
132
|
-
/**
|
|
133
|
-
* Validate image quality
|
|
134
|
-
*/
|
|
135
|
-
private validateImageQuality;
|
|
136
|
-
/**
|
|
137
|
-
* Validate silent liveness scores
|
|
138
|
-
*/
|
|
139
|
-
private validateSilentLiveness;
|
|
140
|
-
/**
|
|
141
|
-
* Handle detect phase
|
|
142
|
-
*/
|
|
143
|
-
private handleDetectPhase;
|
|
144
|
-
/**
|
|
145
|
-
* Handle collect phase
|
|
146
|
-
*/
|
|
147
|
-
private handleCollectPhase;
|
|
148
|
-
/**
|
|
149
|
-
* Handle verify phase
|
|
150
|
-
*/
|
|
151
|
-
private handleVerifyPhase;
|
|
152
|
-
/**
|
|
153
|
-
* Handle multiple or no faces
|
|
154
|
-
*/
|
|
155
|
-
private handleMultipleFaces;
|
|
156
|
-
private collectHighQualityImage;
|
|
157
|
-
private emitDetectorInfo;
|
|
158
|
-
/**
|
|
159
|
-
* Select next action
|
|
160
|
-
*/
|
|
161
|
-
private selectNextAction;
|
|
162
|
-
/**
|
|
163
|
-
* Clear action verify timeout
|
|
164
|
-
*/
|
|
165
|
-
private clearActionVerifyTimeout;
|
|
166
|
-
/**
|
|
167
|
-
* Detect specific action
|
|
168
|
-
*/
|
|
169
|
-
private detectAction;
|
|
170
|
-
/**
|
|
171
|
-
* Emit debug event
|
|
172
|
-
*/
|
|
173
|
-
private emitDebug;
|
|
174
|
-
/**
|
|
175
|
-
* Draw video frame to canvas (internal use, not converted to Base64)
|
|
176
|
-
* @returns {HTMLCanvasElement | null} Canvas after drawing, returns null if failed
|
|
177
|
-
*/
|
|
178
|
-
private drawVideoToCanvas;
|
|
179
|
-
private clearFrameCanvas;
|
|
180
|
-
private clearFaceCanvas;
|
|
181
|
-
/**
|
|
182
|
-
* 将 canvas 转换为 Base64 JPEG 图片数据
|
|
183
|
-
* @param {HTMLCanvasElement} canvas - 输入的 canvas
|
|
184
|
-
* @returns {string | null} Base64 格式的 JPEG 图片数据
|
|
185
|
-
*/
|
|
186
|
-
private canvasToBase64;
|
|
187
|
-
/**
|
|
188
|
-
* Capture current video frame (returns Base64)
|
|
189
|
-
* @param {Box} box - Face box
|
|
190
|
-
* @returns {string | null} Base64 encoded JPEG image data
|
|
191
|
-
*/
|
|
192
|
-
private captureFrame;
|
|
193
|
-
}
|
|
194
|
-
export type { FaceDetectionEngineConfig, FaceFrontalFeatures, ImageQualityFeatures, DetectorInfoEventData, DetectorFinishEventData, DetectorErrorEventData, DetectorDebugEventData, DetectorActionEventData, DetectorLoadedEventData, EventMap, EventEmitter, EventListener, ResolvedEngineConfig } from './types';
|
|
195
|
-
export { LivenessAction, ErrorCode, DetectionCode, LivenessActionStatus, DetectionPeriod } from './enums';
|
|
5
|
+
import { FaceDetectionEngine } from './face-detection-engine';
|
|
6
|
+
export type { FaceDetectionEngineOptions, FaceFrontalFeatures, ImageQualityFeatures, DetectorInfoEventData, DetectorFinishEventData, DetectorErrorEventData, DetectorDebugEventData, DetectorActionEventData, DetectorLoadedEventData, EventMap, EventEmitter, EventListener, } from './types';
|
|
7
|
+
export { LivenessAction, ErrorCode, DetectionCode, LivenessActionStatus, DetectionPeriod, EngineState } from './enums';
|
|
196
8
|
export { preloadOpenCV, getCvSync, getOpenCVVersion, detectBrowserEngine } from './library-loader';
|
|
197
9
|
export { SimpleEventEmitter } from './event-emitter';
|
|
10
|
+
export { UniAppFaceDetectionEngine, createSDK, checkEnvironmentSupport } from './uniapp-sdk';
|
|
11
|
+
export { FaceDetectionEngine };
|
|
198
12
|
export default FaceDetectionEngine;
|
|
199
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAG7D,YAAY,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,QAAQ,EACR,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAEtH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAElG,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAE5F,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,eAAe,mBAAmB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library-loader.d.ts","sourceRoot":"","sources":["../../src/library-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,mBAAmB,CAAA;AA6BrC,KAAK,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAE9D,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CA2BpE;AAiGD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AA2GD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,GAAG,CAAA;CAAE,CAAC,CAmD9E;AAED;;;GAGG;AACH,wBAAgB,SAAS,QAYxB;
|
|
1
|
+
{"version":3,"file":"library-loader.d.ts","sourceRoot":"","sources":["../../src/library-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,mBAAmB,CAAA;AA6BrC,KAAK,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAE9D,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CA2BpE;AAiGD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AA2GD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,GAAG,CAAA;CAAE,CAAC,CAmD9E;AAED;;;GAGG;AACH,wBAAgB,SAAS,QAYxB;AAsLD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAiEnI;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,QAwB/B"}
|