@sssxyd/face-liveness-detector 0.4.0-alpha.11 → 0.4.0-alpha.12

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.
@@ -1 +1 @@
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;AAkFhF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC/C,qBAAqB,CAwBvB"}
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;AAmDhF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC/C,qBAAqB,CAwBvB"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * DLP色轮检测器 - 检测DLP投影仪的特有伪影
3
+ *
4
+ * 核心原理:
5
+ * - DLP投影仪使用单色DMD芯片 + RGB色轮
6
+ * - 色轮以高频率(120-144Hz)轮换RGB颜色
7
+ * - 摄像头如果不同步捕捉,会看到RGB分离现象
8
+ *
9
+ * 特征:
10
+ * 1. 高对比度边界处出现"彩虹纹"(R左/B右分离)
11
+ * 2. 快速移动物体边缘有明显的RGB分离
12
+ * 3. 静止物体通常正常(因为色轮平均后是白色)
13
+ *
14
+ * 检测方法:
15
+ * 1. 找高对比度边界区域
16
+ * 2. 分析边界处R、G、B通道的位置差异
17
+ * 3. 如果R领先,B延后 → DLP特征
18
+ */
19
+ import { VideoFrameCollector } from "./video-frame-collector";
20
+ export interface DLPColorWheelDetectorConfig {
21
+ bufferSize: number;
22
+ edgeThreshold: number;
23
+ minChannelSeparationPixels: number;
24
+ separationConfidenceThreshold: number;
25
+ samplingStride: number;
26
+ }
27
+ export interface DLPColorWheelDetectionResult {
28
+ isScreenCapture: boolean;
29
+ confidence: number;
30
+ hasColorSeparation: boolean;
31
+ colorSeparationPixels: number;
32
+ redLeadPixels?: number;
33
+ blueDelayPixels?: number;
34
+ sampledEdgePixelCount: number;
35
+ estimatedColorWheelFrequency?: number;
36
+ details?: {
37
+ edgeLocations: number[];
38
+ separationDistances: number[];
39
+ };
40
+ }
41
+ export declare class DLPColorWheelDetector {
42
+ private config;
43
+ private frameCollector;
44
+ constructor(frameCollector: VideoFrameCollector, config: DLPColorWheelDetectorConfig);
45
+ /**
46
+ * 获取当前缓冲区中的帧数
47
+ */
48
+ getBufferedFrameCount(): number;
49
+ /**
50
+ * 执行DLP色轮检测分析
51
+ */
52
+ analyze(): DLPColorWheelDetectionResult;
53
+ /**
54
+ * 重置检测器
55
+ * 注意:帧缓冲由 FrameCollector 管理
56
+ */
57
+ reset(): void;
58
+ /**
59
+ * 检测高对比度边界
60
+ * 返回边界的x坐标位置
61
+ */
62
+ private detectHighContrastEdges;
63
+ /**
64
+ * 分析单条边界的RGB分离
65
+ *
66
+ * DLP特征:
67
+ * - R通道的边界比G靠前(向左)
68
+ * - B通道的边界比G靠后(向右)
69
+ */
70
+ private analyzeRGBSeparation;
71
+ /**
72
+ * 找导数数组中的峰值位置
73
+ */
74
+ private findPeakPosition;
75
+ }
76
+ //# sourceMappingURL=dlp-color-wheel-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlp-color-wheel-detector.d.ts","sourceRoot":"","sources":["../../src/dlp-color-wheel-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,WAAW,2BAA2B;IAE1C,UAAU,EAAE,MAAM,CAAA;IAGlB,aAAa,EAAE,MAAM,CAAA;IAGrB,0BAA0B,EAAE,MAAM,CAAA;IAGlC,6BAA6B,EAAE,MAAM,CAAA;IAGrC,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAGlB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IAGxB,qBAAqB,EAAE,MAAM,CAAA;IAG7B,4BAA4B,CAAC,EAAE,MAAM,CAAA;IAErC,OAAO,CAAC,EAAE;QACR,aAAa,EAAE,MAAM,EAAE,CAAA;QACvB,mBAAmB,EAAE,MAAM,EAAE,CAAA;KAC9B,CAAA;CACF;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,cAAc,CAAqB;gBAE/B,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,2BAA2B;IAKpF;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACH,OAAO,IAAI,4BAA4B;IA8HvC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAyC/B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAgE5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAgBzB"}
@@ -14,15 +14,20 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
14
14
  private cv;
15
15
  private human;
16
16
  private engineState;
17
+ private videoFPS;
17
18
  private videoElement;
18
19
  private stream;
19
20
  private frameCanvasElement;
20
21
  private frameCanvasContext;
21
- private faceCanvasElement;
22
- private faceCanvasContext;
23
- private detectionFrameId;
22
+ private animationFrameId;
24
23
  private actualVideoWidth;
25
24
  private actualVideoHeight;
25
+ private isDetectingFrameActive;
26
+ private frameIndex;
27
+ private lastDetectionFrameIndex;
28
+ private lastScreenFeatureDetectionFrameIndex;
29
+ private matPool;
30
+ private shouldPreallocateMats;
26
31
  private detectionState;
27
32
  /**
28
33
  * Constructor
@@ -41,6 +46,37 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
41
46
  private getStackTrace;
42
47
  updateOptions(options?: Partial<FaceDetectionEngineOptions>): void;
43
48
  getEngineState(): EngineState;
49
+ /**
50
+ * Atomically transition engine state with validation
51
+ * Ensures state transitions follow the valid state machine
52
+ * @param newState - Target engine state
53
+ * @param context - Debug context for logging
54
+ * @returns true if transition succeeded, false otherwise
55
+ */
56
+ private transitionEngineState;
57
+ /**
58
+ * Check if state transition is valid according to state machine rules
59
+ * Valid transitions:
60
+ * - IDLE -> INITIALIZING, INITIALIZING -> READY, READY -> DETECTING, DETECTING -> READY
61
+ * - Any -> IDLE (error recovery)
62
+ */
63
+ private isValidStateTransition;
64
+ /**
65
+ * Transition detection period state
66
+ * @param newPeriod - Target detection period
67
+ * @returns true if transition succeeded
68
+ */
69
+ private transitionDetectionPeriod;
70
+ /**
71
+ * Partially reset detection state (keeps engine initialized)
72
+ * Used when detection fails but engine should remain ready
73
+ */
74
+ private partialResetDetectionState;
75
+ /**
76
+ * Fully reset detection state and resources
77
+ * Used when stopping detection or reinitializing
78
+ */
79
+ private fullResetDetectionState;
44
80
  /**
45
81
  * Initialize the detection engine
46
82
  * Loads Human.js and OpenCV.js libraries
@@ -68,23 +104,95 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
68
104
  * @returns Current configuration
69
105
  */
70
106
  getOptions(): FaceDetectionEngineOptions;
107
+ private updateVideoFPS;
71
108
  /**
72
- * Reset detection state
109
+ * Adjust detect_frame_delay to ensure main detection interval is at least 3 frames
110
+ * This is important for proper spacing of corner detection, feature detection, and main detection
73
111
  */
74
- private resetDetectionState;
112
+ private adjustDetectFrameDelay;
75
113
  /**
76
- * Schedule next detection frame
114
+ * Get the frame interval for main face detection based on videoFPS and detect_frame_delay
115
+ * @returns Number of frames between detections
77
116
  */
78
- private scheduleNextDetection;
117
+ private getDetectionFrameInterval;
118
+ /**
119
+ * Get the frame interval for screen detection
120
+ * Screen detection runs at 0.5x the main detection interval to interleave frames
121
+ * @returns Number of frames between screen detections
122
+ */
123
+ private getScreenDetectionFrameInterval;
124
+ /**
125
+ * Check if main face detection should be performed this frame
126
+ * @returns true if enough frames have passed since last detection
127
+ */
128
+ private shouldPerformMainDetection;
129
+ /**
130
+ * Check if screen corner detection should be performed this frame
131
+ * Executes once per main detection interval
132
+ * Logic:
133
+ * - If mainInterval <= 2: disabled (insufficient frames)
134
+ * - If mainInterval > 2: executes at calculated point, unless it's the last frame
135
+ * @returns true if conditions are met
136
+ */
137
+ private shouldPerformScreenCornersDetection;
138
+ /**
139
+ * Check if screen feature detection (multi-frame) should be performed this frame
140
+ * Logic:
141
+ * - Executes at calculated point in the cycle (40% position)
142
+ * - If missed, can execute at last frame of cycle (fallback)
143
+ * @returns true if conditions are met
144
+ */
145
+ private shouldPerformScreenFeatureDetection;
79
146
  /**
80
147
  * Cancel pending detection frame
81
148
  */
82
149
  private cancelPendingDetection;
150
+ /**
151
+ * 预分配Mat对象以提高性能
152
+ * 避免每帧都创建新的Mat对象,而是复用同一对象
153
+ */
154
+ private preallocateMats;
155
+ /**
156
+ * 清理Mat对象池
157
+ */
158
+ private cleanupMatPool;
83
159
  /**
84
160
  * Main detection loop
161
+ * Called every frame via requestAnimationFrame
162
+ * Orchestrates the detection pipeline with clear separation of concerns
85
163
  */
86
164
  private detect;
165
+ /**
166
+ * Check if current frame should be captured based on detection scheduling
167
+ */
168
+ private shouldCaptureFrame;
169
+ /**
170
+ * Capture video frame and convert to BGR and Grayscale Mat objects
171
+ * @returns {Object | null} Object with bgrFrame and grayFrame, or null if failed
172
+ */
173
+ private captureAndPrepareFrames;
174
+ /**
175
+ * Perform screen detection (corners and multi-frame features)
176
+ * @returns true if screen is detected, false otherwise
177
+ */
178
+ private performScreenDetection;
179
+ /**
180
+ * Perform main face detection and handle results
181
+ */
182
+ private performFaceDetection;
183
+ /**
184
+ * Clean up frame Mat objects
185
+ */
186
+ private cleanupFrames;
87
187
  private getPerformActionCount;
188
+ /**
189
+ * Detect screen by corners and contours analysis (fast detection)
190
+ */
191
+ private detectScreenCorners;
192
+ /**
193
+ * Detect screen by multi-frame feature analysis
194
+ */
195
+ private detectScreenFeatures;
88
196
  /**
89
197
  * Handle single face detection
90
198
  */
@@ -125,18 +233,5 @@ export declare class FaceDetectionEngine extends SimpleEventEmitter {
125
233
  */
126
234
  private drawVideoToCanvas;
127
235
  private clearFrameCanvas;
128
- private clearFaceCanvas;
129
- /**
130
- * 将 canvas 转换为 Base64 JPEG 图片数据
131
- * @param {HTMLCanvasElement} canvas - 输入的 canvas
132
- * @returns {string | null} Base64 格式的 JPEG 图片数据
133
- */
134
- private canvasToBase64;
135
- /**
136
- * Capture current video frame (returns Base64)
137
- * @param {Box} box - Face box
138
- * @returns {string | null} Base64 encoded JPEG image data
139
- */
140
- private captureFrame;
141
236
  }
142
237
  //# sourceMappingURL=face-detection-engine.d.ts.map
@@ -1 +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;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,IAAI;IASlE,cAAc,IAAI,WAAW;IAI7B;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkLjC;;;;;;;OAOG;IACG,cAAc,CAAC,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoJnE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA8BrC;;;OAGG;IACH,UAAU,IAAI,0BAA0B;IAMxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;YACW,MAAM;IA6DpB,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuOxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B,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;IAkBjB;;;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"}
1
+ {"version":3,"file":"face-detection-engine.d.ts","sourceRoot":"","sources":["../../src/face-detection-engine.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { DetectionPeriod, LivenessAction } from "./enums";
2
2
  import { MotionLivenessDetector } from "./motion-liveness-detector";
3
3
  import { ScreenCaptureDetector } from './screen-capture-detector';
4
- import { ResolvedEngineOptions } from "./types";
4
+ import { ScreenCornersContourDetector } from './screen-corners-contour-detector';
5
5
  /**
6
6
  * Internal detection state interface
7
7
  */
@@ -19,9 +19,12 @@ export declare class DetectionState {
19
19
  lastFrontalScore: number;
20
20
  motionDetector: MotionLivenessDetector | null;
21
21
  liveness: boolean;
22
+ realness: boolean;
22
23
  screenDetector: ScreenCaptureDetector | null;
24
+ cornersContourDetector: ScreenCornersContourDetector | null;
23
25
  constructor(options: Partial<DetectionState>);
24
26
  reset(): void;
27
+ updateVideoFPS(fps: number): void;
25
28
  needFrontalFace(): boolean;
26
29
  isReadyToVerify(minCollectCount: number): boolean;
27
30
  onActionStarted(nextAction: LivenessAction, timeoutMills: number, timeoutCallback: () => void): void;
@@ -32,5 +35,5 @@ export declare class DetectionState {
32
35
  */
33
36
  private clearActionVerifyTimeout;
34
37
  }
35
- export declare function createDetectionState(options: ResolvedEngineOptions): DetectionState;
38
+ export declare function createDetectionState(fps: number, strictPhotoDetection: boolean): DetectionState;
36
39
  //# sourceMappingURL=face-detection-state.d.ts.map
@@ -1 +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,EAAE,MAAM,2BAA2B,CAAA;AACjE,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,aAAa,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI;IAKpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAMnC;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CA2BnF"}
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,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAGhF;;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,QAAQ,EAAE,OAAO,CAAQ;IACzB,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAO;IACnD,sBAAsB,EAAE,4BAA4B,GAAG,IAAI,CAAO;gBAEtD,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;IAI5C,KAAK,IAAI,IAAI;IAgBb,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYjC,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,aAAa,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI;IAMpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAMnC;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAG,cAAc,CAM/F"}
@@ -55,14 +55,10 @@ export interface MotionLivenessDetectorOptions {
55
55
  * 使用光流、关键点跟踪和面部特征分析
56
56
  */
57
57
  export declare class MotionLivenessDetector {
58
- private readonly minMotionThreshold;
59
- private readonly minKeypointVariance;
60
- private readonly frameBufferSize;
61
- private readonly eyeAspectRatioThreshold;
62
- private readonly motionConsistencyThreshold;
63
- private readonly minOpticalFlowThreshold;
64
- private readonly strictPhotoDetection;
58
+ private config;
65
59
  private frameBuffer;
60
+ private frameWidth;
61
+ private frameHeight;
66
62
  private keypointHistory;
67
63
  private faceAreaHistory;
68
64
  private eyeAspectRatioHistory;
@@ -70,8 +66,9 @@ export declare class MotionLivenessDetector {
70
66
  private opticalFlowHistory;
71
67
  private pupilSizeHistory;
72
68
  private cv;
73
- constructor(options?: Partial<MotionLivenessDetectorOptions>);
69
+ constructor(strictPhotoDetection?: boolean);
74
70
  setCVInstance(cvInstance: any): void;
71
+ getOptions(): Required<MotionLivenessDetectorOptions>;
75
72
  isReady(): boolean;
76
73
  /**
77
74
  * 重置运动检测状态
@@ -183,6 +180,10 @@ export declare class MotionLivenessDetector {
183
180
  /**
184
181
  * 根据运动分析确定面部是否活跃
185
182
  * 修复:改进对真实面部运动的识别,减少误判
183
+ *
184
+ * 策略:
185
+ * - 数据不足(frameBuffer < bufferSize)时:采用保守策略,只有绝对确定是照片才判定为非活体
186
+ * - 数据充足(frameBuffer >= bufferSize)时:执行完整检查,较为严格
186
187
  */
187
188
  private determineLiveness;
188
189
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"motion-liveness-detector.d.ts","sourceRoot":"","sources":["../../src/motion-liveness-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"motion-liveness-detector.d.ts","sourceRoot":"","sources":["../../src/motion-liveness-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * 光学畸变检测器 - 检测投影仪和其他光学系统的特有伪影
3
+ *
4
+ * 核心原理:
5
+ * - 投影仪通过光学透镜将图像投射到屏幕上
6
+ * - 光学系统导致多种失真:梯形失真、桶形/枕形失真、模糊
7
+ * - 真实人脸直接摄像,无这些光学失真
8
+ *
9
+ * 检测特征:
10
+ * 1. 梯形失真(Keystone)- 图像上下边宽度不同
11
+ * 2. 桶形/枕形失真 - 直线边缘弯曲
12
+ * 3. 光学模糊 - 边界清晰度在视场中不均匀
13
+ * 4. 色差(Chromatic Aberration)- RGB通道空间分离
14
+ * 5. 暗角(Vignetting)- 四角暗化
15
+ */
16
+ import { VideoFrameCollector } from "./video-frame-collector";
17
+ export interface OpticalDistortionDetectorConfig {
18
+ bufferSize: number;
19
+ keystoneThreshold: number;
20
+ barrelDistortionThreshold: number;
21
+ chromaticAberrationThreshold: number;
22
+ vignetteThreshold: number;
23
+ samplingStride: number;
24
+ featureWeights: {
25
+ keystone: number;
26
+ barrelDistortion: number;
27
+ chromaticAberration: number;
28
+ vignette: number;
29
+ };
30
+ }
31
+ export interface OpticalDistortionDetectionResult {
32
+ isScreenCapture: boolean;
33
+ confidence: number;
34
+ distortionFeatures: {
35
+ keystoneDetected: boolean;
36
+ keystoneLevel: number;
37
+ barrelDistortionDetected: boolean;
38
+ barrelDistortionLevel: number;
39
+ chromaticAberrationDetected: boolean;
40
+ chromaticAberrationLevel: number;
41
+ vignetteDetected: boolean;
42
+ vignetteLevel: number;
43
+ };
44
+ overallOpticalDistortionScore: number;
45
+ estimatedProjectorType?: 'dlp' | 'lcd' | 'lcos' | 'unknown';
46
+ details?: any;
47
+ }
48
+ export declare class OpticalDistortionDetector {
49
+ private config;
50
+ private frameCollector;
51
+ constructor(frameCollector: VideoFrameCollector, config: OpticalDistortionDetectorConfig);
52
+ /**
53
+ * 获取当前缓冲区中的帧数
54
+ */
55
+ getBufferedFrameCount(): number;
56
+ /**
57
+ * 执行光学畸变检测分析
58
+ */
59
+ analyze(): OpticalDistortionDetectionResult;
60
+ /**
61
+ * 注意:重置由 FrameCollector 管理
62
+ * 此检测器不持有任何帧缓冲
63
+ */
64
+ reset(): void;
65
+ /**
66
+ * 检测梯形失真(Keystone)
67
+ *
68
+ * 原理:
69
+ * - 梯形失真导致图像上下边宽度不同
70
+ * - 计算上下边的宽度比
71
+ */
72
+ private detectKeystone;
73
+ /**
74
+ * 检测桶形/枕形失真
75
+ *
76
+ * 原理:
77
+ * - 提取图像边界
78
+ * - 拟合边界为曲线,计算曲率
79
+ * - 高曲率表示失真
80
+ */
81
+ private detectBarrelDistortion;
82
+ /**
83
+ * 检测色差(RGB通道分离)
84
+ */
85
+ private detectChromaticAberration;
86
+ /**
87
+ * 检测暗角(四角暗化)
88
+ *
89
+ * 原理:
90
+ * - 计算四个角区域的平均亮度
91
+ * - 与中心区域对比
92
+ * - 大幅下降表示暗角
93
+ */
94
+ private detectVignette;
95
+ /**
96
+ * 找水平边界的宽度
97
+ */
98
+ private findHorizontalEdgeWidth;
99
+ /**
100
+ * 测量边界的垂直直线度(曲率)
101
+ */
102
+ private measureBoundaryDeviation;
103
+ /**
104
+ * 找在特定y处的垂直边界
105
+ */
106
+ private findVerticalEdgeAtY;
107
+ /**
108
+ * 计算矩形区域的平均亮度
109
+ */
110
+ private getAverageBrightness;
111
+ /**
112
+ * 推断投影仪类型
113
+ */
114
+ private inferProjectorType;
115
+ }
116
+ //# sourceMappingURL=optical-distortion-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optical-distortion-detector.d.ts","sourceRoot":"","sources":["../../src/optical-distortion-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,WAAW,+BAA+B;IAE9C,UAAU,EAAE,MAAM,CAAA;IAGlB,iBAAiB,EAAE,MAAM,CAAA;IAGzB,yBAAyB,EAAE,MAAM,CAAA;IAGjC,4BAA4B,EAAE,MAAM,CAAA;IAGpC,iBAAiB,EAAE,MAAM,CAAA;IAGzB,cAAc,EAAE,MAAM,CAAA;IAGtB,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,gBAAgB,EAAE,MAAM,CAAA;QACxB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,gCAAgC;IAC/C,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAGlB,kBAAkB,EAAE;QAClB,gBAAgB,EAAE,OAAO,CAAA;QACzB,aAAa,EAAE,MAAM,CAAA;QAErB,wBAAwB,EAAE,OAAO,CAAA;QACjC,qBAAqB,EAAE,MAAM,CAAA;QAE7B,2BAA2B,EAAE,OAAO,CAAA;QACpC,wBAAwB,EAAE,MAAM,CAAA;QAEhC,gBAAgB,EAAE,OAAO,CAAA;QACzB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;IAGD,6BAA6B,EAAE,MAAM,CAAA;IAGrC,sBAAsB,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;IAE3D,OAAO,CAAC,EAAE,GAAG,CAAA;CACd;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,cAAc,CAAqB;gBAE/B,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,+BAA+B;IAUxF;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACH,OAAO,IAAI,gCAAgC;IA6F3C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IA8BtB;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IA0B9B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IA0DtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAwBhC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAgC3B"}
@@ -1,10 +1,6 @@
1
1
  /**
2
- * 优化版屏幕采集检测器 - 快速检测策略
2
+ * 第三版屏幕采集检测器
3
3
  *
4
- * 核心思想:级联检测 (Cascade Detection)
5
- * - 按检测速度从快到慢排序:RGB发光 → 色彩特征 → 莫尔纹
6
- * - 尽早排除,减少不必要的计算
7
- * - 平衡精准度和速度
8
4
  */
9
5
  /**
10
6
  * 详细的级联检测过程日志
@@ -41,7 +37,6 @@ export declare class ScreenCaptureDetectionResult {
41
37
  confidence: number;
42
38
  details?: any;
43
39
  }>;
44
- skippedMethods?: string[];
45
40
  riskLevel: 'low' | 'medium' | 'high';
46
41
  processingTimeMs: number;
47
42
  debug?: CascadeDetectionDebugInfo;
@@ -50,26 +45,44 @@ export declare class ScreenCaptureDetectionResult {
50
45
  isScreenCapture: boolean;
51
46
  confidence: number;
52
47
  details?: any;
53
- }>, riskLevel: 'low' | 'medium' | 'high', processingTimeMs: number, skippedMethods?: string[], debug?: CascadeDetectionDebugInfo);
48
+ }>, riskLevel: 'low' | 'medium' | 'high', processingTimeMs: number, debug?: CascadeDetectionDebugInfo);
54
49
  getMessage(): string;
55
50
  }
56
51
  export interface ScreenCaptureDetectorOptions {
57
- confidenceThreshold?: number;
58
- moireThreshold?: number;
59
- moireEnableDCT?: boolean;
60
- moireEnableEdgeDetection?: boolean;
61
- colorSaturationThreshold?: number;
62
- colorRgbCorrelationThreshold?: number;
63
- colorPixelEntropyThreshold?: number;
64
- colorConfidenceThreshold?: number;
65
- rgbLowFreqStartPercent?: number;
66
- rgbLowFreqEndPercent?: number;
67
- rgbEnergyRatioNormalizationFactor?: number;
68
- rgbChannelDifferenceNormalizationFactor?: number;
69
- rgbEnergyScoreWeight?: number;
70
- rgbAsymmetryScoreWeight?: number;
71
- rgbDifferenceFactorWeight?: number;
72
- rgbConfidenceThreshold?: number;
52
+ flickerBufferSize?: number;
53
+ flickerMinPeriod?: number;
54
+ flickerMaxPeriod?: number;
55
+ flickerCorrelationThreshold?: number;
56
+ flickerPassingPixelRatio?: number;
57
+ flickerSamplingStride?: number;
58
+ responseTimeBufferSize?: number;
59
+ responseTimeMinPixelDelta?: number;
60
+ responseTimeThreshold?: number;
61
+ responseTimePassingPixelRatio?: number;
62
+ responseTimeSamplingStride?: number;
63
+ dlpColorWheelBufferSize?: number;
64
+ dlpEdgeThreshold?: number;
65
+ dlpChannelSeparationThreshold?: number;
66
+ dlpConfidenceThreshold?: number;
67
+ dlpSamplingStride?: number;
68
+ opticalDistortionBufferSize?: number;
69
+ opticalKeystoneThreshold?: number;
70
+ opticalBarrelThreshold?: number;
71
+ opticalChromaticThreshold?: number;
72
+ opticalVignetteThreshold?: number;
73
+ opticalSamplingStride?: number;
74
+ opticalFeatureKeystone?: number;
75
+ opticalFeatureBarrel?: number;
76
+ opticalFeatureChromatic?: number;
77
+ opticalFeatureVignette?: number;
78
+ frameDropRate?: number;
79
+ flickerConfidenceThreshold?: number;
80
+ responseTimeConfidenceThreshold?: number;
81
+ dlpConfidenceThresholdResult?: number;
82
+ opticalConfidenceThresholdResult?: number;
83
+ compositeConfidenceThresholdScreenCapture?: number;
84
+ compositeConfidenceThresholdHighRisk?: number;
85
+ compositeConfidenceThresholdMediumRisk?: number;
73
86
  }
74
87
  /**
75
88
  * 优化版屏幕采集检测引擎
@@ -78,12 +91,35 @@ export interface ScreenCaptureDetectorOptions {
78
91
  */
79
92
  export declare class ScreenCaptureDetector {
80
93
  private cv;
81
- private confidenceThreshold;
82
- private moirePatternConfig;
83
- private screenColorConfig;
84
- private rgbEmissionConfig;
85
- constructor(options?: Partial<ScreenCaptureDetectorOptions>);
94
+ private fps;
95
+ private config;
96
+ private frameCollector;
97
+ private flickerDetector;
98
+ private responseTimeDetector;
99
+ private dlpColorWheelDetector;
100
+ private opticalDistortionDetector;
101
+ private droppedFramesCount;
102
+ constructor(fps?: number);
86
103
  setCVInstance(cvInstance: any): void;
104
+ getFPS(): number;
105
+ /**
106
+ * 向视频检测器添加一帧(用于实时视频处理)
107
+ * 建议每收到一帧就调用此方法
108
+ *
109
+ * @param grayMat 灰度图像矩阵
110
+ * @param bgrMat 彩色图像矩阵
111
+ * @returns 帧是否被接受(true表示被处理,false表示被随机丢弃)
112
+ */
113
+ addVideoFrame(grayMat: any, bgrMat: any): boolean;
114
+ isReady(): boolean;
115
+ /**
116
+ * 获取丢帧统计信息
117
+ */
118
+ getFrameDropStats(): {
119
+ droppedFramesCount: number;
120
+ dropRate: number;
121
+ };
122
+ reset(): void;
87
123
  /**
88
124
  * 检测屏幕捕捉
89
125
  * 使用三层判定逻辑:
@@ -91,19 +127,19 @@ export declare class ScreenCaptureDetector {
91
127
  * 2. 都不能明确判定时,计算加权置信度
92
128
  * 3. 用加权置信度判定最终结果
93
129
  *
94
- * @param bgrMat - BGR格式图像
95
- * @param grayMat - 灰度图像(用于莫尔纹检测)
96
130
  * @param debugMode - 是否启用调试模式,返回详细日志
131
+ * @param useVideoAnalysis - 是否使用已积累的视频帧进行闪烁检测
97
132
  * @returns 检测结果
98
133
  */
99
- detect(bgrMat: any, grayMat: any, debugMode?: boolean): ScreenCaptureDetectionResult;
134
+ detect(debugMode?: boolean, useVideoAnalysis?: boolean): ScreenCaptureDetectionResult;
100
135
  /**
101
- * 核心检测方法:三层判定逻辑
102
- * 1. 任意方法能明确判定为屏幕捕捉时,直接返回
103
- * 2. 都不能明确判定时,计算加权置信度
104
- * 3. 用加权置信度判定最终结果
136
+ * 核心检测方法:多屏幕类型级联检测
105
137
  *
106
- * 检测顺序:RGB 发光 → 颜色异常 → 莫尔纹
138
+ * 检测顺序(按可靠性排序):
139
+ * 1. 视频闪烁(LCD/OLED)- 最可靠的物理特性
140
+ * 2. 响应时间(墨水屏)- 像素变化速度特征
141
+ * 3. DLP色轮(DLP投影)- 色轮干涉的独特特征
142
+ * 4. 光学畸变(其他投影)- 投影光学系统的失真
107
143
  */
108
144
  private detectWithLogic;
109
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"screen-capture-detector.d.ts","sourceRoot":"","sources":["../../src/screen-capture-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screen-capture-detector.d.ts","sourceRoot":"","sources":["../../src/screen-capture-detector.ts"],"names":[],"mappings":"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"}