@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
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 运动和活体检测 - 防止照片攻击
|
|
3
|
+
* 检测微妙的面部运动和运动模式,以区分真实面孔和高质量照片
|
|
4
|
+
*/
|
|
5
|
+
import type { FaceResult } from '@vladmandic/human';
|
|
6
|
+
import type { Box } from '@vladmandic/human';
|
|
7
|
+
/**
|
|
8
|
+
* 运动检测结果
|
|
9
|
+
*/
|
|
10
|
+
export declare class MotionDetectionResult {
|
|
11
|
+
motionScore: number;
|
|
12
|
+
opticalFlowMagnitude: number;
|
|
13
|
+
keypointVariance: number;
|
|
14
|
+
eyeMotionScore: number;
|
|
15
|
+
mouthMotionScore: number;
|
|
16
|
+
motionType: MotionType;
|
|
17
|
+
isLively: boolean;
|
|
18
|
+
details: {
|
|
19
|
+
frameCount: number;
|
|
20
|
+
avgKeypointDistance: number;
|
|
21
|
+
maxKeypointDistance: number;
|
|
22
|
+
faceAreaVariance: number;
|
|
23
|
+
eyeAspectRatioVariance: number;
|
|
24
|
+
mouthAspectRatioVariance: number;
|
|
25
|
+
};
|
|
26
|
+
constructor(motionScore: number, opticalFlowMagnitude: number, keypointVariance: number, eyeMotionScore: number, mouthMotionScore: number, motionType: MotionType, isLively: boolean, details: {
|
|
27
|
+
frameCount: number;
|
|
28
|
+
avgKeypointDistance: number;
|
|
29
|
+
maxKeypointDistance: number;
|
|
30
|
+
faceAreaVariance: number;
|
|
31
|
+
eyeAspectRatioVariance: number;
|
|
32
|
+
mouthAspectRatioVariance: number;
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* 获取活体检测结果信息
|
|
36
|
+
* 如果活跃,返回空字符串,否则返回非活体检测的原因
|
|
37
|
+
*/
|
|
38
|
+
getMessage(minMotionScore: number, minKeypointVariance: number): string;
|
|
39
|
+
}
|
|
40
|
+
export type MotionType = 'none' | 'rotation' | 'translation' | 'breathing' | 'micro_expression';
|
|
41
|
+
/**
|
|
42
|
+
* 运动活体检测选项
|
|
43
|
+
*/
|
|
44
|
+
export interface MotionLivenessDetectorOptions {
|
|
45
|
+
minMotionThreshold?: number;
|
|
46
|
+
minKeypointVariance?: number;
|
|
47
|
+
frameBufferSize?: number;
|
|
48
|
+
eyeAspectRatioThreshold?: number;
|
|
49
|
+
motionConsistencyThreshold?: number;
|
|
50
|
+
minOpticalFlowThreshold?: number;
|
|
51
|
+
strictPhotoDetection?: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 运动活体检测器
|
|
55
|
+
* 使用光流、关键点跟踪和面部特征分析
|
|
56
|
+
*/
|
|
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;
|
|
65
|
+
private frameBuffer;
|
|
66
|
+
private keypointHistory;
|
|
67
|
+
private faceAreaHistory;
|
|
68
|
+
private eyeAspectRatioHistory;
|
|
69
|
+
private mouthAspectRatioHistory;
|
|
70
|
+
private opticalFlowHistory;
|
|
71
|
+
private pupilSizeHistory;
|
|
72
|
+
private cv;
|
|
73
|
+
constructor(options?: Partial<MotionLivenessDetectorOptions>);
|
|
74
|
+
setCVInstance(cvInstance: any): void;
|
|
75
|
+
isReady(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* 重置运动检测状态
|
|
78
|
+
*/
|
|
79
|
+
reset(): void;
|
|
80
|
+
/**
|
|
81
|
+
* 从当前帧和历史记录分析运动和活体性
|
|
82
|
+
*/
|
|
83
|
+
analyzeMotion(grayMat: any, faceResult: FaceResult, faceBox: Box): MotionDetectionResult;
|
|
84
|
+
/**
|
|
85
|
+
* 将帧添加到循环缓冲区
|
|
86
|
+
*/
|
|
87
|
+
private addFrameToBuffer;
|
|
88
|
+
/**
|
|
89
|
+
* 验证运动一致性 - 防止照片微动攻击
|
|
90
|
+
* 真实面部运动:光流和关键点方差应该一致且相关
|
|
91
|
+
* 照片微动:只有光流或只有噪声,二者不匹配
|
|
92
|
+
*/
|
|
93
|
+
private validateMotionConsistency;
|
|
94
|
+
/**
|
|
95
|
+
* 检测瞳孔反应 - 活体的关键特征
|
|
96
|
+
* 照片的瞳孔无法反应光线变化
|
|
97
|
+
*/
|
|
98
|
+
private detectPupilResponse;
|
|
99
|
+
/**
|
|
100
|
+
* 计算眼睛大小(用于瞳孔反应检测)
|
|
101
|
+
*/
|
|
102
|
+
private calculateEyeSize;
|
|
103
|
+
/**
|
|
104
|
+
* 从 Human.js 面部检测结果中提取面部关键点
|
|
105
|
+
* 使用网格标志点(来自 MediaPipe Face Mesh 模型的 468 个点)
|
|
106
|
+
*/
|
|
107
|
+
private extractKeypoints;
|
|
108
|
+
/**
|
|
109
|
+
* 计算光流幅度(需要 OpenCV)
|
|
110
|
+
* 检测帧之间的像素运动
|
|
111
|
+
*/
|
|
112
|
+
private analyzeOpticalFlow;
|
|
113
|
+
/**
|
|
114
|
+
* 将 canvas 转换为 OpenCV Mat,支持可选的灰度转换
|
|
115
|
+
*/
|
|
116
|
+
private canvasToMat;
|
|
117
|
+
/**
|
|
118
|
+
* 计算光流的平均幅度
|
|
119
|
+
*/
|
|
120
|
+
private calculateFlowMagnitude;
|
|
121
|
+
/**
|
|
122
|
+
* 计算关键点位置在帧间的方差
|
|
123
|
+
* 高方差 = 自然运动(活跃)
|
|
124
|
+
* 低方差 = 静止如照片
|
|
125
|
+
*/
|
|
126
|
+
private calculateKeypointVariance;
|
|
127
|
+
/**
|
|
128
|
+
* 计算两帧中对应标志点之间的平均距离
|
|
129
|
+
*/
|
|
130
|
+
private calculateLandmarkDistance;
|
|
131
|
+
/**
|
|
132
|
+
* 计算所有帧中的平均关键点距离
|
|
133
|
+
*/
|
|
134
|
+
private calculateAvgKeypointDistance;
|
|
135
|
+
/**
|
|
136
|
+
* 计算帧间的最大关键点距离
|
|
137
|
+
*/
|
|
138
|
+
private calculateMaxKeypointDistance;
|
|
139
|
+
/**
|
|
140
|
+
* 计算眼睛宽高比 (EAR)
|
|
141
|
+
* 用于检测眨眼和眼睛开度变化
|
|
142
|
+
*/
|
|
143
|
+
private calculateEyeAspectRatio;
|
|
144
|
+
/**
|
|
145
|
+
* 计算嘴巴宽高比 (MAR)
|
|
146
|
+
* 用于检测嘴巴张开的变化
|
|
147
|
+
*/
|
|
148
|
+
private calculateMouthAspectRatio;
|
|
149
|
+
/**
|
|
150
|
+
* 计算两个点之间的距离
|
|
151
|
+
*/
|
|
152
|
+
private pointDistance;
|
|
153
|
+
/**
|
|
154
|
+
* 基于眼睛宽高比变化计算眼睛运动评分
|
|
155
|
+
*/
|
|
156
|
+
private calculateEyeMotionScore;
|
|
157
|
+
/**
|
|
158
|
+
* 基于嘴巴宽高比变化计算嘴巴运动评分
|
|
159
|
+
*/
|
|
160
|
+
private calculateMouthMotionScore;
|
|
161
|
+
/**
|
|
162
|
+
* 计算人脸区域方差
|
|
163
|
+
*/
|
|
164
|
+
private calculateFaceAreaVariance;
|
|
165
|
+
/**
|
|
166
|
+
* 计算数字数组的方差
|
|
167
|
+
*/
|
|
168
|
+
private calculateVariance;
|
|
169
|
+
/**
|
|
170
|
+
* 基于分析检测运动类型
|
|
171
|
+
*/
|
|
172
|
+
private detectMotionType;
|
|
173
|
+
/**
|
|
174
|
+
* 从多个来源计算总体运动评分
|
|
175
|
+
* 针对照片攻击进行优化:提高光流和关键点方差的权重
|
|
176
|
+
*/
|
|
177
|
+
private calculateOverallMotionScore;
|
|
178
|
+
/**
|
|
179
|
+
* 根据运动分析确定面部是否活跃
|
|
180
|
+
* 增强照片防护:加入光流最小阈值和运动一致性检查
|
|
181
|
+
*/
|
|
182
|
+
private determineLiveness;
|
|
183
|
+
/**
|
|
184
|
+
* 分析失败时创建空结果
|
|
185
|
+
*/
|
|
186
|
+
private createEmptyResult;
|
|
187
|
+
/**
|
|
188
|
+
* 验证运动的物理约束
|
|
189
|
+
* 照片微动的运动往往会违反物理约束(如速度跳跃)
|
|
190
|
+
* 真实面部运动应该表现出光滑的加速度和速度变化
|
|
191
|
+
*/
|
|
192
|
+
private validatePhysicalConstraints;
|
|
193
|
+
/**
|
|
194
|
+
* 获取运动检测结果(用于调试)
|
|
195
|
+
*/
|
|
196
|
+
getStatistics(): any;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=motion-liveness-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 优化版屏幕采集检测器 - 快速检测策略
|
|
3
|
+
*
|
|
4
|
+
* 核心思想:级联检测 (Cascade Detection)
|
|
5
|
+
* - 按检测速度从快到慢排序:RGB发光 → 色彩特征 → 莫尔纹
|
|
6
|
+
* - 尽早排除,减少不必要的计算
|
|
7
|
+
* - 平衡精准度和速度
|
|
8
|
+
*/
|
|
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
|
+
/**
|
|
43
|
+
* 详细的级联检测过程日志
|
|
44
|
+
*/
|
|
45
|
+
export interface CascadeDetectionDebugInfo {
|
|
46
|
+
strategy: DetectionStrategy;
|
|
47
|
+
startTime: number;
|
|
48
|
+
endTime: number;
|
|
49
|
+
totalTimeMs: number;
|
|
50
|
+
stages: Array<{
|
|
51
|
+
method: string;
|
|
52
|
+
completed: boolean;
|
|
53
|
+
timeMs: number;
|
|
54
|
+
result: {
|
|
55
|
+
isScreenCapture: boolean;
|
|
56
|
+
confidence: number;
|
|
57
|
+
} | null;
|
|
58
|
+
reason?: string;
|
|
59
|
+
}>;
|
|
60
|
+
finalDecision: {
|
|
61
|
+
isScreenCapture: boolean;
|
|
62
|
+
confidenceScore: number;
|
|
63
|
+
decisiveMethod?: string;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 优化版屏幕采集检测结果
|
|
68
|
+
*/
|
|
69
|
+
export declare class ScreenCaptureDetectionResult {
|
|
70
|
+
isScreenCapture: boolean;
|
|
71
|
+
confidenceScore: number;
|
|
72
|
+
executedMethods: Array<{
|
|
73
|
+
method: string;
|
|
74
|
+
isScreenCapture: boolean;
|
|
75
|
+
confidence: number;
|
|
76
|
+
details?: any;
|
|
77
|
+
}>;
|
|
78
|
+
skippedMethods?: string[];
|
|
79
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
80
|
+
processingTimeMs: number;
|
|
81
|
+
strategy: DetectionStrategy;
|
|
82
|
+
debug?: CascadeDetectionDebugInfo;
|
|
83
|
+
constructor(isScreenCapture: boolean, confidenceScore: number, executedMethods: Array<{
|
|
84
|
+
method: string;
|
|
85
|
+
isScreenCapture: boolean;
|
|
86
|
+
confidence: number;
|
|
87
|
+
details?: any;
|
|
88
|
+
}>, riskLevel: 'low' | 'medium' | 'high', processingTimeMs: number, strategy: DetectionStrategy, skippedMethods?: string[], debug?: CascadeDetectionDebugInfo);
|
|
89
|
+
getMessage(): string;
|
|
90
|
+
}
|
|
91
|
+
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;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 优化版屏幕采集检测引擎
|
|
112
|
+
*
|
|
113
|
+
* 使用级联检测策略,支持多种模式以平衡速度和精准度
|
|
114
|
+
*/
|
|
115
|
+
export declare class ScreenCaptureDetector {
|
|
116
|
+
private cv;
|
|
117
|
+
private confidenceThreshold;
|
|
118
|
+
private detectionStrategy;
|
|
119
|
+
private moirePatternConfig;
|
|
120
|
+
private screenColorConfig;
|
|
121
|
+
private rgbEmissionConfig;
|
|
122
|
+
constructor(options?: Partial<ScreenCaptureDetectorOptions>);
|
|
123
|
+
setCVInstance(cvInstance: any): void;
|
|
124
|
+
/**
|
|
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%
|
|
137
|
+
*
|
|
138
|
+
* @param bgrMat - BGR格式图像
|
|
139
|
+
* @returns 检测结果
|
|
140
|
+
*/
|
|
141
|
+
detectFast(bgrMat: any): ScreenCaptureDetectionResult;
|
|
142
|
+
/**
|
|
143
|
+
* 精准检测:使用所有三种方法
|
|
144
|
+
* RGB发光 + 色彩特征 + 莫尔纹检测 (~100-150ms)
|
|
145
|
+
* 精准度: 95%+
|
|
146
|
+
*
|
|
147
|
+
* @param bgrMat - BGR格式图像
|
|
148
|
+
* @param grayMat - 灰度图像(莫尔纹检测需要)
|
|
149
|
+
* @returns 检测结果
|
|
150
|
+
*/
|
|
151
|
+
detectAccurate(bgrMat: any, grayMat: any): ScreenCaptureDetectionResult;
|
|
152
|
+
/**
|
|
153
|
+
* 自适应检测:根据前几个检测结果自动调整
|
|
154
|
+
*
|
|
155
|
+
* 策略:
|
|
156
|
+
* - 先执行RGB发光检测 (~10ms)
|
|
157
|
+
* - 结果明确时直接返回
|
|
158
|
+
* - 结果模糊时继续执行色彩检测 (~20ms)
|
|
159
|
+
* - 仍模糊则执行莫尔纹检测以获得最终确定 (~80ms)
|
|
160
|
+
*
|
|
161
|
+
* 处理时间: 10-130ms (取决于结果确定性)
|
|
162
|
+
* 精准度: 95%+ (自动选择最优方法组合)
|
|
163
|
+
*
|
|
164
|
+
* @param bgrMat - BGR格式图像
|
|
165
|
+
* @param grayMat - 灰度图像
|
|
166
|
+
* @returns 检测结果
|
|
167
|
+
*/
|
|
168
|
+
detectAdaptive(bgrMat: any, grayMat: any): ScreenCaptureDetectionResult;
|
|
169
|
+
detectAuto(bgrMat: any, grayMat: any): ScreenCaptureDetectionResult;
|
|
170
|
+
/**
|
|
171
|
+
* 核心检测方法:支持多种策略的级联检测
|
|
172
|
+
*/
|
|
173
|
+
private detectScreenCaptureWithStrategy;
|
|
174
|
+
/**
|
|
175
|
+
* 判断结果是否足够明确,无需进一步检测
|
|
176
|
+
*
|
|
177
|
+
* @param isScreenCapture 检测结果
|
|
178
|
+
* @param confidence 置信度(0-1)
|
|
179
|
+
* @returns true 如果结果足够明确
|
|
180
|
+
*/
|
|
181
|
+
private isConfidentResult;
|
|
182
|
+
/**
|
|
183
|
+
* 构建检测结果对象
|
|
184
|
+
*/
|
|
185
|
+
private buildResult;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=screen-capture-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-capture-detector.d.ts","sourceRoot":"","sources":["../../src/screen-capture-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 屏幕色彩特征检测模块
|
|
3
|
+
*
|
|
4
|
+
* 根据屏幕特有的色彩特征检测图像是否从屏幕上拍摄:
|
|
5
|
+
* 1. 色彩饱和度分析 - 屏幕图像饱和度分布特殊
|
|
6
|
+
* 2. RGB通道统计 - 屏幕各通道相关性强
|
|
7
|
+
* 3. 像素值分布 - 屏幕像素分布更规则
|
|
8
|
+
* 4. 色彩梯度平滑性 - 屏幕渐变更均匀
|
|
9
|
+
* 5. 高频纹理分析 - 屏幕莫尔纹等伪影
|
|
10
|
+
*
|
|
11
|
+
* 相比自然光照环境,屏幕拍摄图像有明显的色彩特征差异
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* 单个色彩特征检测结果
|
|
15
|
+
*/
|
|
16
|
+
export interface ColorFeatureMetric {
|
|
17
|
+
name: string;
|
|
18
|
+
value: number;
|
|
19
|
+
threshold: number;
|
|
20
|
+
isScreenLike: boolean;
|
|
21
|
+
score: number;
|
|
22
|
+
description: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 屏幕色彩检测配置
|
|
26
|
+
*/
|
|
27
|
+
export interface ScreenColorDetectionConfig {
|
|
28
|
+
saturation_threshold?: number;
|
|
29
|
+
rgb_correlation_threshold?: number;
|
|
30
|
+
pixel_entropy_threshold?: number;
|
|
31
|
+
confidence_threshold?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 屏幕色彩特征检测完整结果
|
|
35
|
+
*/
|
|
36
|
+
export interface ScreenColorDetectionResult {
|
|
37
|
+
isScreenCapture: boolean;
|
|
38
|
+
confidence: number;
|
|
39
|
+
metrics: {
|
|
40
|
+
saturation: ColorFeatureMetric;
|
|
41
|
+
rgbCorrelation: ColorFeatureMetric;
|
|
42
|
+
pixelEntropy: ColorFeatureMetric;
|
|
43
|
+
};
|
|
44
|
+
reasons?: string[];
|
|
45
|
+
debug?: Record<string, any>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 检测cv.Mat图像是否从屏幕拍摄
|
|
49
|
+
*
|
|
50
|
+
* 综合分析图像的色彩特征:
|
|
51
|
+
* - 饱和度分布(屏幕图像饱和度低且均匀)
|
|
52
|
+
* - RGB通道相关性(屏幕各通道高度相关)
|
|
53
|
+
* - 像素值熵(屏幕像素分布规则性强)
|
|
54
|
+
* - 梯度平滑性(屏幕色彩渐变均匀)
|
|
55
|
+
* - 色彩梯度均匀性(屏幕缺乏自然纹理变化)
|
|
56
|
+
*
|
|
57
|
+
* @param cv - OpenCV 对象
|
|
58
|
+
* @param bgrMat - OpenCV Mat 对象(应为BGR格式)
|
|
59
|
+
* @param face - 人脸检测结果(可选,用于ROI提取)
|
|
60
|
+
* @param config - 检测配置
|
|
61
|
+
* @returns 屏幕色彩特征检测结果
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* const result = detectScreenColorProfile(
|
|
65
|
+
* cv,
|
|
66
|
+
* matImage,
|
|
67
|
+
* 1920,
|
|
68
|
+
* 1080,
|
|
69
|
+
* faceResult,
|
|
70
|
+
* { saturation_threshold: 40 }
|
|
71
|
+
* )
|
|
72
|
+
* if (result.isScreenCapture) {
|
|
73
|
+
* console.log('检测到屏幕拍摄,置信度:', result.confidence)
|
|
74
|
+
* }
|
|
75
|
+
*/
|
|
76
|
+
export declare function detectScreenColorProfile(cv: any, bgrMat: any, config?: Partial<ScreenColorDetectionConfig>): ScreenColorDetectionResult;
|
|
77
|
+
//# sourceMappingURL=screen-color-profile-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-color-profile-detect.d.ts","sourceRoot":"","sources":["../../src/screen-color-profile-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,OAAO,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAEzC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAElC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAEhC,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAEzC,eAAe,EAAE,OAAO,CAAA;IAExB,UAAU,EAAE,MAAM,CAAA;IAElB,OAAO,EAAE;QACP,UAAU,EAAE,kBAAkB,CAAA;QAC9B,cAAc,EAAE,kBAAkB,CAAA;QAClC,YAAY,EAAE,kBAAkB,CAAA;KACjC,CAAA;IAED,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAElB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC5B;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,GAAG,EACP,MAAM,EAAE,GAAG,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,0BAA0B,CAuD5B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 莫尔纹检测结果
|
|
3
|
+
*/
|
|
4
|
+
export interface MoirePatternDetectionResult {
|
|
5
|
+
isScreenCapture: boolean;
|
|
6
|
+
confidence: number;
|
|
7
|
+
moireStrength: number;
|
|
8
|
+
dominantFrequencies: number[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 莫尔纹检测配置
|
|
12
|
+
*/
|
|
13
|
+
export interface MoirePatternDetectionConfig {
|
|
14
|
+
moire_threshold?: number;
|
|
15
|
+
enable_dct?: boolean;
|
|
16
|
+
enable_edge_detection?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 检测莫尔纹图案 - 最可靠的屏幕检测方法
|
|
20
|
+
*
|
|
21
|
+
* 物理原理:
|
|
22
|
+
* 当摄像机拍摄屏幕时,摄像机的像素传感器与屏幕的像素网格产生空间干涉
|
|
23
|
+
* 根据采样定理,两个周期信号的干涉会产生莫尔纹(Moire pattern)
|
|
24
|
+
* 莫尔纹是低频干涉条纹,其频率为:f_moire = |f_screen - f_camera|
|
|
25
|
+
*
|
|
26
|
+
* 特征对比:
|
|
27
|
+
* 真实人脸:
|
|
28
|
+
* - 没有规则的周期性结构
|
|
29
|
+
* - 频谱分布随机均匀
|
|
30
|
+
* - 边缘方向多样化
|
|
31
|
+
* - 自然的肌肤纹理
|
|
32
|
+
*
|
|
33
|
+
* 屏幕采集:
|
|
34
|
+
* - 明显的周期性莫尔纹条纹
|
|
35
|
+
* - 频谱中有明确的峰值
|
|
36
|
+
* - 边缘方向集中(水平/竖直/斜向)
|
|
37
|
+
* - 高度规则的网格结构
|
|
38
|
+
*
|
|
39
|
+
* 检测算法(混合方案):
|
|
40
|
+
*
|
|
41
|
+
* 方法1:基于 DCT 的频域分析(主要方案,权重 60%)
|
|
42
|
+
* ├─ 步骤1:图像预处理
|
|
43
|
+
* │ ├─ 缩小大图像(>256×256)以提高性能
|
|
44
|
+
* │ └─ 应用高通滤波器(形态学梯度)强调高频细节
|
|
45
|
+
* ├─ 步骤2:频域变换
|
|
46
|
+
* │ ├─ 应用汉宁窗口减少 DCT 边界效应
|
|
47
|
+
* │ └─ 执行离散余弦变换(DCT)获取频域系数
|
|
48
|
+
* ├─ 步骤3:频谱分析
|
|
49
|
+
* │ ├─ 计算 AC 分量的能量分布
|
|
50
|
+
* │ ├─ 检测能量峰值(莫尔纹对应的频率)
|
|
51
|
+
* │ └─ 统计峰值数量和强度
|
|
52
|
+
* └─ 步骤4:周期性评分
|
|
53
|
+
* ├─ 周期性得分 = 峰值数量 / 20
|
|
54
|
+
* └─ 莫尔纹强度 = 周期性 × 60% + 方向性 × 40%
|
|
55
|
+
*
|
|
56
|
+
* 方法2:Canny 边缘检测方案(辅助方案,权重 40%)
|
|
57
|
+
* ├─ 步骤1:边缘提取
|
|
58
|
+
* │ └─ 应用 Canny 算子检测图像边缘
|
|
59
|
+
* ├─ 步骤2:周期性分析
|
|
60
|
+
* │ ├─ 计算每行/每列的自相关
|
|
61
|
+
* │ └─ 检测周期性重复模式
|
|
62
|
+
* └─ 步骤3:方向性分析
|
|
63
|
+
* ├─ 计算 Sobel 梯度获取边缘方向
|
|
64
|
+
* └─ 低方向方差 = 高一致性 = 莫尔纹特征
|
|
65
|
+
*
|
|
66
|
+
* 最终判定:
|
|
67
|
+
* moireStrength = DCT结果 × 0.6 + (周期性 + 方向性) × 0.5 × 0.4
|
|
68
|
+
* isScreenCapture = moireStrength > threshold (默认 0.65)
|
|
69
|
+
*
|
|
70
|
+
* 性能特性:
|
|
71
|
+
* - 时间复杂度:O(n log n) 用于 DCT,O(n) 用于边缘检测
|
|
72
|
+
* - 空间复杂度:O(n) 用于中间矩阵存储
|
|
73
|
+
* - 帧处理时间:约 50-100ms @ 256×256
|
|
74
|
+
*
|
|
75
|
+
* 优势:
|
|
76
|
+
* ✓ 精准度高(>95% 针对典型屏幕)
|
|
77
|
+
* ✓ 对各种屏幕类型有效(LCD, OLED, 投影仪)
|
|
78
|
+
* ✓ 对光照变化鲁棒
|
|
79
|
+
* ✓ 混合方案提高可靠性
|
|
80
|
+
*
|
|
81
|
+
* 限制:
|
|
82
|
+
* ✗ 计算成本相对较高
|
|
83
|
+
* ✗ 某些特殊纹理可能产生假阳性
|
|
84
|
+
* ✗ 低分辨率图像效果欠佳
|
|
85
|
+
*
|
|
86
|
+
* @param cv - OpenCV 对象
|
|
87
|
+
* @param gray - 灰度图像(8-bit 单通道)
|
|
88
|
+
* @param config - 检测配置
|
|
89
|
+
* @returns 莫尔纹检测结果
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* const result = detectMoirePattern(
|
|
93
|
+
* cv,
|
|
94
|
+
* grayImage,
|
|
95
|
+
* { moire_threshold: 0.65 }
|
|
96
|
+
* )
|
|
97
|
+
* if (result.isScreenCapture) {
|
|
98
|
+
* console.log('检测到屏幕采集,莫尔纹强度:', result.moireStrength)
|
|
99
|
+
* }
|
|
100
|
+
*/
|
|
101
|
+
export declare function detectMoirePattern(cv: any, gray: any, config?: Partial<MoirePatternDetectionConfig>): MoirePatternDetectionResult;
|
|
102
|
+
//# sourceMappingURL=screen-moire-pattern-detect.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface RgbEmissionDetectionConfig {
|
|
2
|
+
/** 低频段开始位置(相对于频谱长度的百分比) */
|
|
3
|
+
low_freq_start_percent?: number;
|
|
4
|
+
/** 低频段结束位置(相对于频谱长度的百分比) */
|
|
5
|
+
low_freq_end_percent?: number;
|
|
6
|
+
/** 能量比归一化因子 */
|
|
7
|
+
energy_ratio_normalization_factor?: number;
|
|
8
|
+
/** 通道均值差异的归一化因子 */
|
|
9
|
+
channel_difference_normalization_factor?: number;
|
|
10
|
+
/** RGB 周期性能量权重 */
|
|
11
|
+
energy_score_weight?: number;
|
|
12
|
+
/** RGB 通道不同步程度权重 */
|
|
13
|
+
asymmetry_score_weight?: number;
|
|
14
|
+
/** 通道均值差异权重 */
|
|
15
|
+
difference_factor_weight?: number;
|
|
16
|
+
/** 屏幕拍摄的置信度阈值 */
|
|
17
|
+
confidence_threshold?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface RgbEmissionDetectionResult {
|
|
20
|
+
isScreenCapture: boolean;
|
|
21
|
+
confidence: number;
|
|
22
|
+
details: {
|
|
23
|
+
rChannelEnergy: number;
|
|
24
|
+
gChannelEnergy: number;
|
|
25
|
+
bChannelEnergy: number;
|
|
26
|
+
rgbAsymmetry: number;
|
|
27
|
+
maxChannelDifference: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 检测屏幕 RGB 子像素发光模式
|
|
32
|
+
* 原理:屏幕由 RGB 三个子像素组成,各自独立发光
|
|
33
|
+
* 这在频域中表现为 RGB 三个通道的"不同步"特征
|
|
34
|
+
* 人脸皮肤没有这种特性
|
|
35
|
+
*
|
|
36
|
+
* @param cv - OpenCV 实例
|
|
37
|
+
* @param bgrMat - BGR 格式的图像 Mat 对象
|
|
38
|
+
* @param config - 检测配置(可选)
|
|
39
|
+
* @returns RGB 发光模式检测结果
|
|
40
|
+
*/
|
|
41
|
+
export declare function detectRGBEmissionPattern(cv: any, bgrMat: any, config?: Partial<RgbEmissionDetectionConfig>): RgbEmissionDetectionResult;
|
|
42
|
+
//# sourceMappingURL=screen-rgb-emission-detect.d.ts.map
|
|
@@ -0,0 +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"}
|