@sssxyd/face-liveness-detector 0.4.0-alpha.9 → 0.4.0

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.
Files changed (38) hide show
  1. package/README.en.md +118 -144
  2. package/README.md +23 -49
  3. package/dist/index.esm.js +3170 -2330
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +3170 -2330
  6. package/dist/index.js.map +1 -1
  7. package/dist/types/browser_utils.d.ts +3 -3
  8. package/dist/types/browser_utils.d.ts.map +1 -1
  9. package/dist/types/config.d.ts.map +1 -1
  10. package/dist/types/dlp-color-wheel-detector.d.ts +76 -0
  11. package/dist/types/dlp-color-wheel-detector.d.ts.map +1 -0
  12. package/dist/types/face-detection-engine.d.ts +113 -16
  13. package/dist/types/face-detection-engine.d.ts.map +1 -1
  14. package/dist/types/face-detection-state.d.ts +5 -2
  15. package/dist/types/face-detection-state.d.ts.map +1 -1
  16. package/dist/types/face-frontal-calculator.d.ts +3 -3
  17. package/dist/types/face-frontal-calculator.d.ts.map +1 -1
  18. package/dist/types/image-quality-calculator.d.ts +10 -23
  19. package/dist/types/image-quality-calculator.d.ts.map +1 -1
  20. package/dist/types/motion-liveness-detector.d.ts +34 -19
  21. package/dist/types/motion-liveness-detector.d.ts.map +1 -1
  22. package/dist/types/optical-distortion-detector.d.ts +116 -0
  23. package/dist/types/optical-distortion-detector.d.ts.map +1 -0
  24. package/dist/types/screen-capture-detector.d.ts +74 -115
  25. package/dist/types/screen-capture-detector.d.ts.map +1 -1
  26. package/dist/types/screen-corners-contour-detector.d.ts +78 -0
  27. package/dist/types/screen-corners-contour-detector.d.ts.map +1 -0
  28. package/dist/types/screen-flicker-detector.d.ts +103 -0
  29. package/dist/types/screen-flicker-detector.d.ts.map +1 -0
  30. package/dist/types/screen-moire-pattern-detect.d.ts.map +1 -1
  31. package/dist/types/screen-response-time-detector.d.ts +70 -0
  32. package/dist/types/screen-response-time-detector.d.ts.map +1 -0
  33. package/dist/types/screen-rgb-emission-detect.d.ts.map +1 -1
  34. package/dist/types/types.d.ts +9 -51
  35. package/dist/types/types.d.ts.map +1 -1
  36. package/dist/types/video-frame-collector.d.ts +111 -0
  37. package/dist/types/video-frame-collector.d.ts.map +1 -0
  38. package/package.json +2 -1
@@ -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,49 +1,11 @@
1
1
  /**
2
- * 优化版屏幕采集检测器 - 快速检测策略
2
+ * 第三版屏幕采集检测器
3
3
  *
4
- * 核心思想:级联检测 (Cascade Detection)
5
- * - 按检测速度从快到慢排序:RGB发光 → 色彩特征 → 莫尔纹
6
- * - 尽早排除,减少不必要的计算
7
- * - 平衡精准度和速度
8
4
  */
9
- /**
10
- * 检测策略枚举
11
- */
12
- export declare enum DetectionStrategy {
13
- /** 最快模式:仅使用RGB发光检测 (~10ms) */
14
- FASTEST = "fastest",
15
- /** 快速模式:RGB发光 + 色彩特征 (~30-40ms) */
16
- FAST = "fast",
17
- /** 精准模式:全部三种方法 (~100-150ms) */
18
- ACCURATE = "accurate",
19
- /** 自适应模式:根据第一轮结果动态调整 */
20
- ADAPTIVE = "adaptive"
21
- }
22
- /**
23
- * 将字符串转换为 DetectionStrategy 枚举值
24
- *
25
- * @param value - 字符串值
26
- * @param defaultValue - 默认值(可选)
27
- * @returns DetectionStrategy 枚举值
28
- * @throws Error 如果字符串不是有效的检测策略
29
- *
30
- * @example
31
- * const strategy = stringToDetectionStrategy('fastest') // DetectionStrategy.FASTEST
32
- * const strategy2 = stringToDetectionStrategy('invalid', DetectionStrategy.ADAPTIVE) // DetectionStrategy.ADAPTIVE
33
- */
34
- export declare function stringToDetectionStrategy(value: string, defaultValue?: DetectionStrategy): DetectionStrategy;
35
- /**
36
- * 判断字符串是否是有效的检测策略
37
- *
38
- * @param value - 字符串值
39
- * @returns true 如果是有效的检测策略
40
- */
41
- export declare function isValidDetectionStrategy(value: string): boolean;
42
5
  /**
43
6
  * 详细的级联检测过程日志
44
7
  */
45
8
  export interface CascadeDetectionDebugInfo {
46
- strategy: DetectionStrategy;
47
9
  startTime: number;
48
10
  endTime: number;
49
11
  totalTimeMs: number;
@@ -75,37 +37,52 @@ export declare class ScreenCaptureDetectionResult {
75
37
  confidence: number;
76
38
  details?: any;
77
39
  }>;
78
- skippedMethods?: string[];
79
40
  riskLevel: 'low' | 'medium' | 'high';
80
41
  processingTimeMs: number;
81
- strategy: DetectionStrategy;
82
42
  debug?: CascadeDetectionDebugInfo;
83
43
  constructor(isScreenCapture: boolean, confidenceScore: number, executedMethods: Array<{
84
44
  method: string;
85
45
  isScreenCapture: boolean;
86
46
  confidence: number;
87
47
  details?: any;
88
- }>, riskLevel: 'low' | 'medium' | 'high', processingTimeMs: number, strategy: DetectionStrategy, skippedMethods?: string[], debug?: CascadeDetectionDebugInfo);
48
+ }>, riskLevel: 'low' | 'medium' | 'high', processingTimeMs: number, debug?: CascadeDetectionDebugInfo);
89
49
  getMessage(): string;
90
50
  }
91
51
  export interface ScreenCaptureDetectorOptions {
92
- confidenceThreshold?: number;
93
- detectionStrategy?: DetectionStrategy;
94
- moireThreshold?: number;
95
- moireEnableDCT?: boolean;
96
- moireEnableEdgeDetection?: boolean;
97
- colorSaturationThreshold?: number;
98
- colorRgbCorrelationThreshold?: number;
99
- colorPixelEntropyThreshold?: number;
100
- colorConfidenceThreshold?: number;
101
- rgbLowFreqStartPercent?: number;
102
- rgbLowFreqEndPercent?: number;
103
- rgbEnergyRatioNormalizationFactor?: number;
104
- rgbChannelDifferenceNormalizationFactor?: number;
105
- rgbEnergyScoreWeight?: number;
106
- rgbAsymmetryScoreWeight?: number;
107
- rgbDifferenceFactorWeight?: number;
108
- 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;
109
86
  }
110
87
  /**
111
88
  * 优化版屏幕采集检测引擎
@@ -114,74 +91,56 @@ export interface ScreenCaptureDetectorOptions {
114
91
  */
115
92
  export declare class ScreenCaptureDetector {
116
93
  private cv;
117
- private confidenceThreshold;
118
- private detectionStrategy;
119
- private moirePatternConfig;
120
- private screenColorConfig;
121
- private rgbEmissionConfig;
122
- 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);
123
103
  setCVInstance(cvInstance: any): void;
104
+ getFPS(): number;
124
105
  /**
125
- * 最快检测:适用于实时性要求高的场景
126
- * 仅使用RGB发光检测 (~10ms)
127
- * 精准度: 70-80%
128
- *
129
- * @param bgrMat - BGR格式图像
130
- * @returns 检测结果
131
- */
132
- detectFastest(bgrMat: any): ScreenCaptureDetectionResult;
133
- /**
134
- * 快速检测:平衡速度和精准度
135
- * RGB发光检测 + 色彩特征检测 (~30-40ms)
136
- * 精准度: 85-90%
106
+ * 向视频检测器添加一帧(用于实时视频处理)
107
+ * 建议每收到一帧就调用此方法
137
108
  *
138
- * @param bgrMat - BGR格式图像
139
- * @returns 检测结果
109
+ * @param grayMat 灰度图像矩阵
110
+ * @param bgrMat 彩色图像矩阵
111
+ * @returns 帧是否被接受(true表示被处理,false表示被随机丢弃)
140
112
  */
141
- detectFast(bgrMat: any): ScreenCaptureDetectionResult;
113
+ addVideoFrame(grayMat: any, bgrMat: any): boolean;
114
+ isReady(): boolean;
142
115
  /**
143
- * 精准检测:使用所有三种方法
144
- * RGB发光 + 色彩特征 + 莫尔纹检测 (~100-150ms)
145
- * 精准度: 95%+
146
- *
147
- * @param bgrMat - BGR格式图像
148
- * @param grayMat - 灰度图像(莫尔纹检测需要)
149
- * @returns 检测结果
116
+ * 获取丢帧统计信息
150
117
  */
151
- detectAccurate(bgrMat: any, grayMat: any): ScreenCaptureDetectionResult;
118
+ getFrameDropStats(): {
119
+ droppedFramesCount: number;
120
+ dropRate: number;
121
+ };
122
+ reset(): void;
152
123
  /**
153
- * 自适应检测:根据前几个检测结果自动调整
124
+ * 检测屏幕捕捉
125
+ * 使用三层判定逻辑:
126
+ * 1. 任意方法能明确判定为屏幕捕捉时,直接返回
127
+ * 2. 都不能明确判定时,计算加权置信度
128
+ * 3. 用加权置信度判定最终结果
154
129
  *
155
- * 策略:
156
- * - 先执行RGB发光检测 (~10ms)
157
- * - 结果明确时直接返回
158
- * - 结果模糊时继续执行色彩检测 (~20ms)
159
- * - 仍模糊则执行莫尔纹检测以获得最终确定 (~80ms)
160
- *
161
- * 处理时间: 10-130ms (取决于结果确定性)
162
- * 精准度: 95%+ (自动选择最优方法组合)
163
- *
164
- * @param bgrMat - BGR格式图像
165
- * @param grayMat - 灰度图像
130
+ * @param debugMode - 是否启用调试模式,返回详细日志
131
+ * @param useVideoAnalysis - 是否使用已积累的视频帧进行闪烁检测
166
132
  * @returns 检测结果
167
133
  */
168
- detectAdaptive(bgrMat: any, grayMat: any): ScreenCaptureDetectionResult;
169
- detectAuto(bgrMat: any, grayMat: any): ScreenCaptureDetectionResult;
170
- /**
171
- * 核心检测方法:支持多种策略的级联检测
172
- */
173
- private detectScreenCaptureWithStrategy;
134
+ detect(debugMode?: boolean, useVideoAnalysis?: boolean): ScreenCaptureDetectionResult;
174
135
  /**
175
- * 判断结果是否足够明确,无需进一步检测
136
+ * 核心检测方法:多屏幕类型级联检测
176
137
  *
177
- * @param isScreenCapture 检测结果
178
- * @param confidence 置信度(0-1)
179
- * @returns true 如果结果足够明确
180
- */
181
- private isConfidentResult;
182
- /**
183
- * 构建检测结果对象
138
+ * 检测顺序(按可靠性排序):
139
+ * 1. 视频闪烁(LCD/OLED)- 最可靠的物理特性
140
+ * 2. 响应时间(墨水屏)- 像素变化速度特征
141
+ * 3. DLP色轮(DLP投影)- 色轮干涉的独特特征
142
+ * 4. 光学畸变(其他投影)- 投影光学系统的失真
184
143
  */
185
- private buildResult;
144
+ private detectWithLogic;
186
145
  }
187
146
  //# sourceMappingURL=screen-capture-detector.d.ts.map
@@ -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":"AAAA;;;GAGG;AAQH;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IAGnB,MAAM,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,OAAO,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE;YACN,eAAe,EAAE,OAAO,CAAA;YACxB,UAAU,EAAE,MAAM,CAAA;SACnB,GAAG,IAAI,CAAA;QACR,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;IAGF,aAAa,EAAE;QACb,eAAe,EAAE,OAAO,CAAA;QACxB,eAAe,EAAE,MAAM,CAAA;QACvB,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,4BAA4B;IACvC,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IAGvB,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,OAAO,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,CAAC,CAAA;IAEF,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACpC,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,yBAAyB,CAAA;gBAG/B,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,OAAO,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,CAAC,EACF,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EACpC,gBAAgB,EAAE,MAAM,EACxB,KAAK,CAAC,EAAE,yBAAyB;IAUnC,UAAU,IAAI,MAAM;CAcrB;AAED,MAAM,WAAW,4BAA4B;IAE3C,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAG9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IAGnC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAG1B,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAG/B,aAAa,CAAC,EAAE,MAAM,CAAA;IAGtB,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,+BAA+B,CAAC,EAAE,MAAM,CAAA;IACxC,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,gCAAgC,CAAC,EAAE,MAAM,CAAA;IACzC,yCAAyC,CAAC,EAAE,MAAM,CAAA;IAClD,oCAAoC,CAAC,EAAE,MAAM,CAAA;IAC7C,sCAAsC,CAAC,EAAE,MAAM,CAAA;CAChD;AA+DD;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,MAAM,CAAwC;IAEtD,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,oBAAoB,CAA4B;IACxD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,yBAAyB,CAA2B;IAC5D,OAAO,CAAC,kBAAkB,CAAY;gBAE1B,GAAG,CAAC,EAAE,MAAM;IAqExB,aAAa,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI;IAIpC,MAAM,IAAI,MAAM;IAIhB;;;;;;;OAOG;IACH,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO;IAajD,OAAO,IAAI,OAAO;IAUlB;;OAEG;IACH,iBAAiB,IAAI;QACnB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,QAAQ,EAAE,MAAM,CAAA;KACjB;IAOD,KAAK,IAAI,IAAI;IASb;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,GAAE,OAAe,EAAE,gBAAgB,GAAE,OAAe,GAAG,4BAA4B;IAInG;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;CAoUxB"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * 屏幕边角、轮廓检测器
3
+ * 用于快速判定当前图片是否从屏幕拍摄
4
+ * 通过检测图片中的屏幕边界轮廓(矩形框)
5
+ */
6
+ /**
7
+ * 屏幕边角、轮廓检测器配置选项
8
+ */
9
+ export interface ScreenCornersContourDetectorOptions {
10
+ /** Canny 边缘检测下阈值(默认 35) */
11
+ edgeThreshold1?: number;
12
+ /** Canny 边缘检测上阈值(默认 110) */
13
+ edgeThreshold2?: number;
14
+ /** 最小轮廓面积(默认 800) */
15
+ minContourArea?: number;
16
+ /** 屏幕检测置信度阈值(默认 0.5) */
17
+ screenConfidenceThreshold?: number;
18
+ /** 屏幕边界占比阈值(默认 0.15) */
19
+ screenBoundaryRatioThreshold?: number;
20
+ }
21
+ /**
22
+ * 默认的屏幕边角、轮廓检测器配置
23
+ * 优化用于快速检测摄像头拍摄的手机/平板屏幕
24
+ * 严格模式:仅当非常确定时才判定为屏幕
25
+ */
26
+ export declare const DEFAULT_SCREEN_CORNERS_CONTOUR_DETECTOR_OPTIONS: Required<ScreenCornersContourDetectorOptions>;
27
+ export interface ScreenCornersContourDetectionResult {
28
+ /** 是否检测到屏幕 */
29
+ isScreenCapture: boolean;
30
+ /** 置信度(0-1) */
31
+ confidence: number;
32
+ /** 检测到的屏幕矩形轮廓数量 */
33
+ contourCount: number;
34
+ /** 屏幕边界占图片面积的比例 */
35
+ screenBoundaryRatio: number;
36
+ /** 处理耗时(毫秒) */
37
+ processingTimeMs: number;
38
+ }
39
+ /**
40
+ * 屏幕边角、轮廓检测器
41
+ * 用快速边缘和轮廓检测来识别屏幕采集
42
+ */
43
+ export declare class ScreenCornersContourDetector {
44
+ private cv;
45
+ private config;
46
+ /**
47
+ * 构造函数
48
+ * @param options - 检测器配置选项
49
+ */
50
+ constructor(options?: Partial<ScreenCornersContourDetectorOptions>);
51
+ /**
52
+ * 设置 OpenCV 实例
53
+ */
54
+ setCVInstance(cv: any): void;
55
+ /**
56
+ * 检测图片是否为屏幕采集
57
+ * @param grayFrame - 灰度图像 Mat
58
+ * @returns 检测结果
59
+ */
60
+ detect(grayFrame: any): ScreenCornersContourDetectionResult;
61
+ /**
62
+ * 轮廓检测 - 检测屏幕矩形边界
63
+ */
64
+ private detectContours;
65
+ /**
66
+ * 检查四边形是否接近矩形
67
+ */
68
+ private isRectangleShape;
69
+ /**
70
+ * 简化的屏幕检测置信度计算
71
+ */
72
+ private calculateScreenConfidence;
73
+ /**
74
+ * 获取检测器状态消息
75
+ */
76
+ getMessage(confidence: number): string;
77
+ }
78
+ //# sourceMappingURL=screen-corners-contour-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-corners-contour-detector.d.ts","sourceRoot":"","sources":["../../src/screen-corners-contour-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,mCAAmC;IAElD,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4BAA4B;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IAGvB,qBAAqB;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IAGvB,wBAAwB;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,wBAAwB;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC;AAED;;;;GAIG;AACH,eAAO,MAAM,+CAA+C,EAAE,QAAQ,CAAC,mCAAmC,CAazG,CAAA;AAED,MAAM,WAAW,mCAAmC;IAClD,cAAc;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB;IACnB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe;IACf,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,MAAM,CAA+C;IAE7D;;;OAGG;gBACS,OAAO,CAAC,EAAE,OAAO,CAAC,mCAAmC,CAAC;IAOlE;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI;IAI5B;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,GAAG,GAAG,mCAAmC;IAmC3D;;OAEG;IACH,OAAO,CAAC,cAAc;IA2DtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CASvC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * 屏幕闪烁检测器
3
+ *
4
+ * 核心思路:利用视频帧序列的时间特性
5
+ * - 屏幕显示内容时有屏幕刷新频率(60/120/144Hz),导致亮度周期性变化
6
+ * - 真实人脸没有这种周期性闪烁,变化是随机的
7
+ *
8
+ * 算法:
9
+ * 1. 收集N帧视频(15-30帧)
10
+ * 2. 对每个像素的时间序列计算自相关(autocorrelation)
11
+ * 3. 如果在某个周期lag发现强自相关 → 存在周期性 → 屏幕闪烁
12
+ * 4. 统计多少像素检测到周期性,若超过阈值则判定为屏幕
13
+ */
14
+ import { VideoFrameCollector } from "./video-frame-collector";
15
+ export interface ScreenFlickerDetectorConfig {
16
+ bufferSize: number;
17
+ minFlickerPeriodFrames: number;
18
+ maxFlickerPeriodFrames: number;
19
+ correlationThreshold: number;
20
+ passingPixelRatio: number;
21
+ samplingStride: number;
22
+ }
23
+ export interface ScreenFlickerDetectionResult {
24
+ isScreenCapture: boolean;
25
+ confidence: number;
26
+ dominantFlickerPeriod?: number;
27
+ estimatedScreenRefreshRate?: number;
28
+ passingPixelRatio: number;
29
+ averageFps?: number;
30
+ sampledPixelCount: number;
31
+ details?: {
32
+ correlationValues: number[];
33
+ pixelFlickerCounts: Map<number, number>;
34
+ };
35
+ }
36
+ export declare class ScreenFlickerDetector {
37
+ private config;
38
+ private frameCollector;
39
+ constructor(frameCollector: VideoFrameCollector, config: ScreenFlickerDetectorConfig);
40
+ /**
41
+ * 获取当前缓冲区中的帧数
42
+ */
43
+ getBufferedFrameCount(): number;
44
+ /**
45
+ * 执行闪烁检测分析
46
+ * 需要至少 maxFlickerPeriodFrames + 1 帧的数据
47
+ *
48
+ * 根据实际fps自动调整检测周期范围,以支持不同刷新率的屏幕
49
+ * 根据分辨率自动调整采样密度和通过率阈值
50
+ */
51
+ analyze(): ScreenFlickerDetectionResult;
52
+ /**
53
+ * 重置检测器
54
+ * 注意:帧缓冲由 FrameCollector 管理
55
+ */
56
+ reset(): void;
57
+ /**
58
+ * 获取当前平均fps
59
+ */
60
+ getAverageFps(): number;
61
+ /**
62
+ * 根据实测fps动态调整最大检测周期
63
+ *
64
+ * 高fps摄像头 + 高刷屏的周期较短
65
+ * 低fps摄像头 + 高刷屏的周期较长
66
+ *
67
+ * 例如:
68
+ * - 60fps摄像头:120Hz屏 → 2帧周期 → max=2
69
+ * - 30fps摄像头:120Hz屏 → 4帧周期 → max=4
70
+ * - 15fps摄像头:120Hz屏 → 8帧周期 → max=8
71
+ */
72
+ private getEffectiveMaxPeriod;
73
+ /**
74
+ * 根据分辨率动态调整采样参数
75
+ *
76
+ * 低分辨率时:
77
+ * - 增加采样密度(减小stride)以获得足够的样本
78
+ * - 降低通过率阈值以适应噪声影响
79
+ *
80
+ * 高分辨率时:
81
+ * - 可以使用较大的stride来加快处理
82
+ * - 提高通过率阈值以提高准确性
83
+ */
84
+ private getResolutionAdaptation;
85
+ /**
86
+ * 生成采样像素的索引
87
+ * @param stride 采样步长(默认使用配置中的值)
88
+ */
89
+ private generateSampledPixels;
90
+ /**
91
+ * 提取单个像素在所有帧中的亮度时间序列
92
+ */
93
+ private extractPixelTimeSeries;
94
+ /**
95
+ * 计算时间序列的自相关系数
96
+ * 返回在不同lag值下的相关系数(归一化到0-1)
97
+ *
98
+ * @param timeSeries 像素亮度时间序列
99
+ * @param maxLag 最大检查的lag值
100
+ */
101
+ private computeAutoCorrelation;
102
+ }
103
+ //# sourceMappingURL=screen-flicker-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-flicker-detector.d.ts","sourceRoot":"","sources":["../../src/screen-flicker-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,WAAW,2BAA2B;IAE1C,UAAU,EAAE,MAAM,CAAA;IASlB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAI9B,oBAAoB,EAAE,MAAM,CAAA;IAI5B,iBAAiB,EAAE,MAAM,CAAA;IAGzB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAGlB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAG9B,0BAA0B,CAAC,EAAE,MAAM,CAAA;IAGnC,iBAAiB,EAAE,MAAM,CAAA;IAGzB,UAAU,CAAC,EAAE,MAAM,CAAA;IAGnB,iBAAiB,EAAE,MAAM,CAAA;IAEzB,OAAO,CAAC,EAAE;QACR,iBAAiB,EAAE,MAAM,EAAE,CAAA;QAC3B,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACxC,CAAA;CACF;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,cAAc,CAAqB;gBAE/B,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,2BAA2B;IAOpF;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;;;;;OAMG;IACH,OAAO,IAAI,4BAA4B;IAoHvC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IA6C/B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;CA+C/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"screen-moire-pattern-detect.d.ts","sourceRoot":"","sources":["../../src/screen-moire-pattern-detect.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAE1C,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAYD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkFG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAC5C,2BAA2B,CA+C7B"}
1
+ {"version":3,"file":"screen-moire-pattern-detect.d.ts","sourceRoot":"","sources":["../../src/screen-moire-pattern-detect.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAE1C,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkFG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAC5C,2BAA2B,CA+D7B"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 屏幕响应时间检测器 - 区分墨水屏和LCD/OLED
3
+ *
4
+ * 核心原理:
5
+ * - LCD/OLED: 像素状态变化极快 (<5ms),直接从0跳到255
6
+ * - 墨水屏: 像素状态变化缓慢 (200-500ms),需要多帧逐渐过渡
7
+ *
8
+ * 检测方法:
9
+ * 1. 收集视频帧,跟踪像素值变化
10
+ * 2. 测量从初始值到最终值需要多少帧
11
+ * 3. 根据fps计算实际响应时间
12
+ * 4. 响应时间 > 100ms → 墨水屏
13
+ */
14
+ import { VideoFrameCollector } from "./video-frame-collector";
15
+ export interface ScreenResponseTimeDetectorConfig {
16
+ bufferSize: number;
17
+ minPixelDelta: number;
18
+ einkResponseTimeThreshold: number;
19
+ samplingStride: number;
20
+ passingPixelRatio: number;
21
+ }
22
+ export interface ScreenResponseTimeDetectionResult {
23
+ isScreenCapture: boolean;
24
+ confidence: number;
25
+ averageResponseTimeMs?: number;
26
+ maxResponseTimeMs?: number;
27
+ minResponseTimeMs?: number;
28
+ passingPixelRatio: number;
29
+ sampledPixelCount: number;
30
+ estimatedScreenType?: 'lcd' | 'oled' | 'eink' | 'unknown';
31
+ averageFps?: number;
32
+ details?: {
33
+ responseTimes: number[];
34
+ pixelResponsiveness: Map<number, number>;
35
+ };
36
+ }
37
+ export declare class ScreenResponseTimeDetector {
38
+ private config;
39
+ private frameCollector;
40
+ constructor(frameCollector: VideoFrameCollector, config: ScreenResponseTimeDetectorConfig);
41
+ /**
42
+ * 获取当前缓冲区中的帧数
43
+ */
44
+ getBufferedFrameCount(): number;
45
+ /**
46
+ * 执行响应时间检测分析
47
+ *
48
+ * 寻找像素值快速变化的情况,测量变化速度
49
+ * 缓慢变化 → 墨水屏
50
+ * 快速变化 → LCD/OLED
51
+ */
52
+ analyze(): ScreenResponseTimeDetectionResult;
53
+ /**
54
+ * 重置检测器
55
+ * 注意:帧缓冲由 FrameCollector 管理
56
+ */
57
+ reset(): void;
58
+ /**
59
+ * 测量单个像素的响应时间
60
+ *
61
+ * 跟踪该像素的值变化,找出最大的变化
62
+ * 计算这个变化需要多少帧(时间)完成
63
+ */
64
+ private measurePixelResponseTime;
65
+ /**
66
+ * 生成采样像素列表
67
+ */
68
+ private generateSampledPixels;
69
+ }
70
+ //# sourceMappingURL=screen-response-time-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-response-time-detector.d.ts","sourceRoot":"","sources":["../../src/screen-response-time-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,WAAW,gCAAgC;IAE/C,UAAU,EAAE,MAAM,CAAA;IAGlB,aAAa,EAAE,MAAM,CAAA;IAGrB,yBAAyB,EAAE,MAAM,CAAA;IAGjC,cAAc,EAAE,MAAM,CAAA;IAGtB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iCAAiC;IAChD,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAGlB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAG1B,iBAAiB,EAAE,MAAM,CAAA;IAGzB,iBAAiB,EAAE,MAAM,CAAA;IAGzB,mBAAmB,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAGzD,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,OAAO,CAAC,EAAE;QACR,aAAa,EAAE,MAAM,EAAE,CAAA;QACvB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACzC,CAAA;CACF;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAqB;gBAE/B,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,gCAAgC;IAKzF;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;;;;;OAMG;IACH,OAAO,IAAI,iCAAiC;IAgH5C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAgEhC;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAgB9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"screen-rgb-emission-detect.d.ts","sourceRoot":"","sources":["../../src/screen-rgb-emission-detect.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,0BAA0B;IAEzC,2BAA2B;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,2BAA2B;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,eAAe;IACf,iCAAiC,CAAC,EAAE,MAAM,CAAA;IAG1C,mBAAmB;IACnB,uCAAuC,CAAC,EAAE,MAAM,CAAA;IAGhD,kBAAkB;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,oBAAoB;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,eAAe;IACf,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAGjC,iBAAiB;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAA;QACtB,cAAc,EAAE,MAAM,CAAA;QACtB,cAAc,EAAE,MAAM,CAAA;QACtB,YAAY,EAAE,MAAM,CAAA;QACpB,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;CACF;AAuBD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,GAAG,EACP,MAAM,EAAE,GAAG,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,0BAA0B,CA+D5B"}
1
+ {"version":3,"file":"screen-rgb-emission-detect.d.ts","sourceRoot":"","sources":["../../src/screen-rgb-emission-detect.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,0BAA0B;IAEzC,2BAA2B;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,2BAA2B;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,eAAe;IACf,iCAAiC,CAAC,EAAE,MAAM,CAAA;IAG1C,mBAAmB;IACnB,uCAAuC,CAAC,EAAE,MAAM,CAAA;IAGhD,kBAAkB;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,oBAAoB;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,eAAe;IACf,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAGjC,iBAAiB;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAA;QACtB,cAAc,EAAE,MAAM,CAAA;QACtB,cAAc,EAAE,MAAM,CAAA;QACtB,YAAY,EAAE,MAAM,CAAA;QACpB,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;CACF;AA2BD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,GAAG,EACP,MAAM,EAAE,GAAG,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,0BAA0B,CA+D5B"}