id-scanner-lib 1.3.2 → 1.5.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.
- package/README.md +55 -460
- package/dist/id-scanner-lib.esm.js +4641 -0
- package/dist/id-scanner-lib.esm.js.map +1 -0
- package/dist/id-scanner-lib.js +14755 -0
- package/dist/id-scanner-lib.js.map +1 -0
- package/dist/types/core/base-module.d.ts +44 -0
- package/dist/types/core/camera-manager.d.ts +258 -0
- package/dist/types/core/config.d.ts +88 -0
- package/dist/types/core/errors.d.ts +111 -0
- package/dist/types/core/event-emitter.d.ts +55 -0
- package/dist/types/core/logger.d.ts +277 -0
- package/dist/types/core/module-manager.d.ts +78 -0
- package/dist/types/core/plugin-manager.d.ts +158 -0
- package/dist/types/core/resource-manager.d.ts +246 -0
- package/dist/types/core/result.d.ts +83 -0
- package/dist/types/core/scanner-factory.d.ts +93 -0
- package/dist/types/index.bundle.d.ts +1303 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/interfaces/external-types.d.ts +174 -0
- package/dist/types/interfaces/face-detection.d.ts +293 -0
- package/dist/types/interfaces/scanner-module.d.ts +280 -0
- package/dist/types/modules/face/face-detector.d.ts +170 -0
- package/dist/types/modules/face/index.d.ts +56 -0
- package/dist/types/modules/face/liveness-detector.d.ts +177 -0
- package/dist/types/modules/face/types.d.ts +136 -0
- package/dist/types/modules/id-card/anti-fake-detector.d.ts +170 -0
- package/dist/types/modules/id-card/id-card-detector.d.ts +131 -0
- package/dist/types/modules/id-card/index.d.ts +89 -0
- package/dist/types/modules/id-card/ocr-processor.d.ts +110 -0
- package/dist/types/modules/id-card/ocr-worker.d.ts +31 -0
- package/dist/types/modules/id-card/types.d.ts +181 -0
- package/dist/types/modules/qrcode/index.d.ts +51 -0
- package/dist/types/modules/qrcode/qr-code-scanner.d.ts +64 -0
- package/dist/types/modules/qrcode/types.d.ts +67 -0
- package/dist/types/utils/camera.d.ts +81 -0
- package/dist/types/utils/image-processing.d.ts +176 -0
- package/dist/types/utils/index.d.ts +175 -0
- package/dist/types/utils/performance.d.ts +81 -0
- package/dist/types/utils/resource-manager.d.ts +53 -0
- package/dist/types/utils/types.d.ts +166 -0
- package/dist/types/utils/worker.d.ts +52 -0
- package/dist/types/version.d.ts +7 -0
- package/package.json +76 -77
- package/src/core/base-module.ts +78 -0
- package/src/core/camera-manager.ts +798 -0
- package/src/core/config.ts +268 -0
- package/src/core/errors.ts +174 -0
- package/src/core/event-emitter.ts +110 -0
- package/src/core/logger.ts +549 -0
- package/src/core/module-manager.ts +165 -0
- package/src/core/plugin-manager.ts +429 -0
- package/src/core/resource-manager.ts +762 -0
- package/src/core/result.ts +163 -0
- package/src/core/scanner-factory.ts +237 -0
- package/src/index.ts +113 -936
- package/src/interfaces/external-types.ts +200 -0
- package/src/interfaces/face-detection.ts +309 -0
- package/src/interfaces/scanner-module.ts +384 -0
- package/src/modules/face/face-detector.ts +931 -0
- package/src/modules/face/index.ts +208 -0
- package/src/modules/face/liveness-detector.ts +908 -0
- package/src/modules/face/types.ts +133 -0
- package/src/modules/id-card/anti-fake-detector.ts +732 -0
- package/src/modules/id-card/id-card-detector.ts +474 -0
- package/src/modules/id-card/index.ts +425 -0
- package/src/modules/id-card/ocr-processor.ts +538 -0
- package/src/modules/id-card/ocr-worker.ts +259 -0
- package/src/modules/id-card/types.ts +178 -0
- package/src/modules/qrcode/index.ts +175 -0
- package/src/modules/qrcode/qr-code-scanner.ts +230 -0
- package/src/modules/qrcode/types.ts +65 -0
- package/src/types/browser-image-compression.d.ts +19 -0
- package/src/types/tesseract.d.ts +280 -0
- package/src/utils/image-processing.ts +432 -49
- package/src/utils/index.ts +426 -0
- package/src/utils/performance.ts +168 -131
- package/src/utils/resource-manager.ts +65 -146
- package/src/utils/types.ts +90 -2
- package/src/utils/worker.ts +123 -84
- package/src/version.ts +11 -0
- package/tools/scaffold.js +543 -0
- package/dist/id-scanner-core.esm.js +0 -11076
- package/dist/id-scanner-core.esm.js.map +0 -1
- package/dist/id-scanner-core.js +0 -11088
- package/dist/id-scanner-core.js.map +0 -1
- package/dist/id-scanner-core.min.js +0 -1
- package/dist/id-scanner-core.min.js.map +0 -1
- package/dist/id-scanner-ocr.esm.js +0 -1802
- package/dist/id-scanner-ocr.esm.js.map +0 -1
- package/dist/id-scanner-ocr.js +0 -1811
- package/dist/id-scanner-ocr.js.map +0 -1
- package/dist/id-scanner-ocr.min.js +0 -1
- package/dist/id-scanner-ocr.min.js.map +0 -1
- package/dist/id-scanner-qr.esm.js +0 -1023
- package/dist/id-scanner-qr.esm.js.map +0 -1
- package/dist/id-scanner-qr.js +0 -1032
- package/dist/id-scanner-qr.js.map +0 -1
- package/dist/id-scanner-qr.min.js +0 -1
- package/dist/id-scanner-qr.min.js.map +0 -1
- package/dist/id-scanner.js +0 -3740
- package/dist/id-scanner.js.map +0 -1
- package/dist/id-scanner.min.js +0 -1
- package/dist/id-scanner.min.js.map +0 -1
- package/src/core.ts +0 -138
- package/src/demo/demo.ts +0 -204
- package/src/id-recognition/anti-fake-detector.ts +0 -317
- package/src/id-recognition/data-extractor.ts +0 -262
- package/src/id-recognition/id-detector.ts +0 -363
- package/src/id-recognition/ocr-processor.ts +0 -334
- package/src/id-recognition/ocr-worker.ts +0 -156
- package/src/index-umd.ts +0 -477
- package/src/ocr-module.ts +0 -187
- package/src/qr-module.ts +0 -179
- package/src/scanner/barcode-scanner.ts +0 -251
- package/src/scanner/qr-scanner.ts +0 -167
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 扫描器模块接口
|
|
3
|
+
* @description 定义所有扫描模块共享的核心接口
|
|
4
|
+
* @module interfaces/scanner-module
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from '../core/event-emitter';
|
|
7
|
+
import { Result } from '../core/result';
|
|
8
|
+
import { ModuleConfig } from '../core/config';
|
|
9
|
+
import { Module } from '../core/module-manager';
|
|
10
|
+
/**
|
|
11
|
+
* 模块状态枚举
|
|
12
|
+
*/
|
|
13
|
+
export declare enum ModuleStatus {
|
|
14
|
+
/** 未初始化 */
|
|
15
|
+
NOT_INITIALIZED = "not_initialized",
|
|
16
|
+
/** 初始化中 */
|
|
17
|
+
INITIALIZING = "initializing",
|
|
18
|
+
/** 就绪 */
|
|
19
|
+
READY = "ready",
|
|
20
|
+
/** 处理中 */
|
|
21
|
+
PROCESSING = "processing",
|
|
22
|
+
/** 暂停 */
|
|
23
|
+
PAUSED = "paused",
|
|
24
|
+
/** 错误 */
|
|
25
|
+
ERROR = "error"
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 模块类型枚举
|
|
29
|
+
*/
|
|
30
|
+
export declare enum ModuleType {
|
|
31
|
+
/** 人脸识别模块 */
|
|
32
|
+
FACE = "face",
|
|
33
|
+
/** 二维码扫描模块 */
|
|
34
|
+
QR = "qr",
|
|
35
|
+
/** 身份证识别模块 */
|
|
36
|
+
IDCARD = "idcard",
|
|
37
|
+
/** OCR识别模块 */
|
|
38
|
+
OCR = "ocr"
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 模块能力接口
|
|
42
|
+
* 描述模块支持的功能
|
|
43
|
+
*/
|
|
44
|
+
export interface ModuleCapabilities {
|
|
45
|
+
/** 是否支持视频处理 */
|
|
46
|
+
supportsVideo: boolean;
|
|
47
|
+
/** 是否支持图片处理 */
|
|
48
|
+
supportsImage: boolean;
|
|
49
|
+
/** 是否支持批量处理 */
|
|
50
|
+
supportsBatch: boolean;
|
|
51
|
+
/** 是否支持实时处理 */
|
|
52
|
+
supportsRealtime: boolean;
|
|
53
|
+
/** 是否支持Web Worker处理 */
|
|
54
|
+
supportsWebWorker: boolean;
|
|
55
|
+
/** 支持的媒体类型 */
|
|
56
|
+
supportedMediaTypes: string[];
|
|
57
|
+
/** 其他能力 */
|
|
58
|
+
[key: string]: any;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 模块事件
|
|
62
|
+
*/
|
|
63
|
+
export declare enum ModuleEvent {
|
|
64
|
+
/** 初始化开始 */
|
|
65
|
+
INIT_START = "module:init:start",
|
|
66
|
+
/** 初始化完成 */
|
|
67
|
+
INIT_COMPLETE = "module:init:complete",
|
|
68
|
+
/** 初始化失败 */
|
|
69
|
+
INIT_ERROR = "module:init:error",
|
|
70
|
+
/** 处理开始 */
|
|
71
|
+
PROCESS_START = "module:process:start",
|
|
72
|
+
/** 处理完成 */
|
|
73
|
+
PROCESS_COMPLETE = "module:process:complete",
|
|
74
|
+
/** 处理失败 */
|
|
75
|
+
PROCESS_ERROR = "module:process:error",
|
|
76
|
+
/** 处理进度 */
|
|
77
|
+
PROCESS_PROGRESS = "module:process:progress",
|
|
78
|
+
/** 实时结果 */
|
|
79
|
+
REALTIME_RESULT = "module:realtime:result",
|
|
80
|
+
/** 状态变更 */
|
|
81
|
+
STATUS_CHANGE = "module:status:change"
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 模块初始化选项
|
|
85
|
+
*/
|
|
86
|
+
export interface ModuleInitOptions {
|
|
87
|
+
/** 模块配置 */
|
|
88
|
+
config?: ModuleConfig;
|
|
89
|
+
/** 使用Web Worker */
|
|
90
|
+
useWorker?: boolean;
|
|
91
|
+
/** Web Worker脚本路径 */
|
|
92
|
+
workerPath?: string;
|
|
93
|
+
/** 是否启用调试 */
|
|
94
|
+
debug?: boolean;
|
|
95
|
+
/** 是否绑定摄像头 */
|
|
96
|
+
bindCamera?: boolean;
|
|
97
|
+
/** 目标DOM元素 */
|
|
98
|
+
targetElement?: HTMLElement;
|
|
99
|
+
/** 模型路径 */
|
|
100
|
+
modelPath?: string;
|
|
101
|
+
/** 其他选项 */
|
|
102
|
+
[key: string]: any;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 扫描器模块接口
|
|
106
|
+
* 定义所有扫描模块必须实现的基础接口
|
|
107
|
+
*/
|
|
108
|
+
export interface IScannerModule extends EventEmitter, Module {
|
|
109
|
+
/** 模块类型 */
|
|
110
|
+
readonly type: ModuleType;
|
|
111
|
+
/** 模块当前状态 */
|
|
112
|
+
readonly status: ModuleStatus;
|
|
113
|
+
/** 模块能力 */
|
|
114
|
+
readonly capabilities: ModuleCapabilities;
|
|
115
|
+
/**
|
|
116
|
+
* 处理图片
|
|
117
|
+
* @param image 图片源(URL、HTMLImageElement或其他支持的格式)
|
|
118
|
+
* @param options 处理选项
|
|
119
|
+
*/
|
|
120
|
+
processImage(image: string | HTMLImageElement | HTMLCanvasElement | ImageData, options?: Record<string, any>): Promise<Result<any>>;
|
|
121
|
+
/**
|
|
122
|
+
* 开始实时处理
|
|
123
|
+
* @param videoElement 视频元素,不提供时将使用绑定的摄像头
|
|
124
|
+
* @param options 处理选项
|
|
125
|
+
*/
|
|
126
|
+
startRealtime(videoElement?: HTMLVideoElement, options?: Record<string, any>): Promise<Result<boolean>>;
|
|
127
|
+
/**
|
|
128
|
+
* 停止实时处理
|
|
129
|
+
*/
|
|
130
|
+
stopRealtime(): void;
|
|
131
|
+
/**
|
|
132
|
+
* 暂停处理
|
|
133
|
+
*/
|
|
134
|
+
pause(): void;
|
|
135
|
+
/**
|
|
136
|
+
* 恢复处理
|
|
137
|
+
*/
|
|
138
|
+
resume(): Promise<boolean>;
|
|
139
|
+
/**
|
|
140
|
+
* 重置模块状态
|
|
141
|
+
*/
|
|
142
|
+
reset(): void;
|
|
143
|
+
/**
|
|
144
|
+
* 获取模块版本
|
|
145
|
+
*/
|
|
146
|
+
getVersion(): string;
|
|
147
|
+
/**
|
|
148
|
+
* 获取模块状态
|
|
149
|
+
*/
|
|
150
|
+
getStatus(): ModuleStatus;
|
|
151
|
+
/**
|
|
152
|
+
* 获取模块配置
|
|
153
|
+
*/
|
|
154
|
+
getConfig(): ModuleConfig;
|
|
155
|
+
/**
|
|
156
|
+
* 更新模块配置
|
|
157
|
+
* @param config 新配置
|
|
158
|
+
*/
|
|
159
|
+
updateConfig(config: Partial<ModuleConfig>): void;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 基础扫描器结果接口
|
|
163
|
+
*/
|
|
164
|
+
export interface BaseScannerResult {
|
|
165
|
+
/** 结果ID */
|
|
166
|
+
id: string;
|
|
167
|
+
/** 结果类型 */
|
|
168
|
+
type: string;
|
|
169
|
+
/** 处理时间(毫秒) */
|
|
170
|
+
processingTime: number;
|
|
171
|
+
/** 时间戳 */
|
|
172
|
+
timestamp: number;
|
|
173
|
+
/** 置信度(0-1) */
|
|
174
|
+
confidence: number;
|
|
175
|
+
/** 原始数据 */
|
|
176
|
+
rawData?: any;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 基础扫描器模块抽象类
|
|
180
|
+
* 提供通用的模块功能实现
|
|
181
|
+
*/
|
|
182
|
+
export declare abstract class BaseScannerModule extends EventEmitter implements IScannerModule {
|
|
183
|
+
/** 模块类型 */
|
|
184
|
+
abstract readonly type: ModuleType;
|
|
185
|
+
/** 模块当前状态 */
|
|
186
|
+
protected _status: ModuleStatus;
|
|
187
|
+
/** 模块配置 */
|
|
188
|
+
protected config: ModuleConfig;
|
|
189
|
+
/** 模块版本 */
|
|
190
|
+
readonly version: string;
|
|
191
|
+
/** 是否为调试模式 */
|
|
192
|
+
protected debug: boolean;
|
|
193
|
+
/**
|
|
194
|
+
* 构造函数
|
|
195
|
+
* @param config 初始配置
|
|
196
|
+
*/
|
|
197
|
+
constructor(config?: ModuleConfig);
|
|
198
|
+
/**
|
|
199
|
+
* 获取模块状态
|
|
200
|
+
*/
|
|
201
|
+
get status(): ModuleStatus;
|
|
202
|
+
/**
|
|
203
|
+
* 设置模块状态
|
|
204
|
+
*/
|
|
205
|
+
protected setStatus(status: ModuleStatus): void;
|
|
206
|
+
/**
|
|
207
|
+
* 获取模块能力
|
|
208
|
+
*/
|
|
209
|
+
abstract get capabilities(): ModuleCapabilities;
|
|
210
|
+
/**
|
|
211
|
+
* 初始化模块
|
|
212
|
+
* @param options 初始化选项
|
|
213
|
+
*/
|
|
214
|
+
abstract initialize(options?: ModuleInitOptions): Promise<void>;
|
|
215
|
+
/**
|
|
216
|
+
* 处理图片
|
|
217
|
+
* @param image 图片源(URL、HTMLImageElement或其他支持的格式)
|
|
218
|
+
* @param options 处理选项
|
|
219
|
+
*/
|
|
220
|
+
abstract processImage(image: string | HTMLImageElement | HTMLCanvasElement | ImageData, options?: Record<string, any>): Promise<Result<any>>;
|
|
221
|
+
/**
|
|
222
|
+
* 开始实时处理
|
|
223
|
+
* @param videoElement 视频元素,不提供时将使用绑定的摄像头
|
|
224
|
+
* @param options 处理选项
|
|
225
|
+
*/
|
|
226
|
+
abstract startRealtime(videoElement?: HTMLVideoElement, options?: Record<string, any>): Promise<Result<boolean>>;
|
|
227
|
+
/**
|
|
228
|
+
* 停止实时处理
|
|
229
|
+
*/
|
|
230
|
+
abstract stopRealtime(): void;
|
|
231
|
+
/**
|
|
232
|
+
* 暂停处理
|
|
233
|
+
*/
|
|
234
|
+
pause(): void;
|
|
235
|
+
/**
|
|
236
|
+
* 恢复处理
|
|
237
|
+
*/
|
|
238
|
+
resume(): Promise<boolean>;
|
|
239
|
+
/**
|
|
240
|
+
* 释放模块资源
|
|
241
|
+
*/
|
|
242
|
+
abstract dispose(): Promise<void>;
|
|
243
|
+
/**
|
|
244
|
+
* 重置模块状态
|
|
245
|
+
*/
|
|
246
|
+
reset(): void;
|
|
247
|
+
/**
|
|
248
|
+
* 获取模块版本
|
|
249
|
+
*/
|
|
250
|
+
getVersion(): string;
|
|
251
|
+
/**
|
|
252
|
+
* 获取模块状态
|
|
253
|
+
*/
|
|
254
|
+
getStatus(): ModuleStatus;
|
|
255
|
+
/**
|
|
256
|
+
* 获取模块配置
|
|
257
|
+
*/
|
|
258
|
+
getConfig(): ModuleConfig;
|
|
259
|
+
/**
|
|
260
|
+
* 更新模块配置
|
|
261
|
+
* @param config 新配置
|
|
262
|
+
*/
|
|
263
|
+
updateConfig(config: Partial<ModuleConfig>): void;
|
|
264
|
+
/**
|
|
265
|
+
* 检查模块是否已初始化
|
|
266
|
+
*/
|
|
267
|
+
protected checkInitialized(): void;
|
|
268
|
+
/**
|
|
269
|
+
* 检查模块是否就绪
|
|
270
|
+
*/
|
|
271
|
+
protected checkReady(): void;
|
|
272
|
+
/**
|
|
273
|
+
* 获取模块名称
|
|
274
|
+
*/
|
|
275
|
+
get name(): string;
|
|
276
|
+
/**
|
|
277
|
+
* 获取模块是否已初始化
|
|
278
|
+
*/
|
|
279
|
+
get isInitialized(): boolean;
|
|
280
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 人脸检测模块
|
|
3
|
+
* @description 提供人脸检测、跟踪和分析功能
|
|
4
|
+
* @module modules/face/face-detector
|
|
5
|
+
*/
|
|
6
|
+
import { BaseScannerModule, ModuleCapabilities, ModuleInitOptions, ModuleType } from '../../interfaces/scanner-module';
|
|
7
|
+
import { FaceDetectionOptions, FaceDetectionResult, LivenessDetectionType } from '../../interfaces/face-detection';
|
|
8
|
+
import { Result } from '../../core/result';
|
|
9
|
+
/**
|
|
10
|
+
* 人脸检测模型类型
|
|
11
|
+
*/
|
|
12
|
+
export declare enum FaceModelType {
|
|
13
|
+
/** SSD MobileNet V1 模型 */
|
|
14
|
+
SSD_MOBILENET = "ssd_mobilenetv1",
|
|
15
|
+
/** Tiny Face 模型 */
|
|
16
|
+
TINY_FACE = "tiny_face",
|
|
17
|
+
/** MTCNN 模型 */
|
|
18
|
+
MTCNN = "mtcnn",
|
|
19
|
+
/** BlazeFace 模型 */
|
|
20
|
+
BLAZE_FACE = "blazeface"
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 人脸检测模块配置
|
|
24
|
+
*/
|
|
25
|
+
export interface FaceDetectorConfig {
|
|
26
|
+
/** 是否启用 */
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
/** 检测模型类型 */
|
|
29
|
+
detectionModel: FaceModelType;
|
|
30
|
+
/** 置信度阈值 */
|
|
31
|
+
minConfidence: number;
|
|
32
|
+
/** 最大检测人脸数 */
|
|
33
|
+
maxFaces: number;
|
|
34
|
+
/** 是否检测关键点 */
|
|
35
|
+
detectLandmarks: boolean;
|
|
36
|
+
/** 关键点模型类型 */
|
|
37
|
+
landmarksModel: 'tiny' | '68_points';
|
|
38
|
+
/** 是否检测表情 */
|
|
39
|
+
detectExpressions: boolean;
|
|
40
|
+
/** 是否检测年龄和性别 */
|
|
41
|
+
detectAgeGender: boolean;
|
|
42
|
+
/** 是否提取人脸特征向量 */
|
|
43
|
+
extractEmbeddings: boolean;
|
|
44
|
+
/** 人脸匹配阈值(0-1) */
|
|
45
|
+
matchThreshold: number;
|
|
46
|
+
/** 是否启用跟踪 */
|
|
47
|
+
enableTracking: boolean;
|
|
48
|
+
/** 活体检测类型 */
|
|
49
|
+
livenessDetection: LivenessDetectionType | 'none';
|
|
50
|
+
/** 模型路径 */
|
|
51
|
+
modelPath: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 人脸检测模块
|
|
55
|
+
*/
|
|
56
|
+
export declare class FaceDetector extends BaseScannerModule {
|
|
57
|
+
/** 模块类型 */
|
|
58
|
+
readonly type: ModuleType;
|
|
59
|
+
/** 模块配置 */
|
|
60
|
+
protected config: FaceDetectorConfig;
|
|
61
|
+
/** 默认配置 */
|
|
62
|
+
private static readonly DEFAULT_CONFIG;
|
|
63
|
+
/** 模型加载状态 */
|
|
64
|
+
private modelsLoaded;
|
|
65
|
+
/** 处理计时器ID */
|
|
66
|
+
private processingTimerId;
|
|
67
|
+
/** 处理间隔(ms) */
|
|
68
|
+
private processingInterval;
|
|
69
|
+
/** 摄像头管理器 */
|
|
70
|
+
private cameraManager;
|
|
71
|
+
/** 配置管理器 */
|
|
72
|
+
private configManager;
|
|
73
|
+
/** 资源管理器 */
|
|
74
|
+
private resourceManager;
|
|
75
|
+
/** 日志记录器 */
|
|
76
|
+
private logger;
|
|
77
|
+
/** 画布元素,用于处理帧 */
|
|
78
|
+
private canvas;
|
|
79
|
+
/** 画布渲染上下文 */
|
|
80
|
+
private canvasCtx;
|
|
81
|
+
/** 最后一次检测结果 */
|
|
82
|
+
private lastDetectionResult;
|
|
83
|
+
/** 人脸跟踪状态 */
|
|
84
|
+
private faceTrackers;
|
|
85
|
+
/**
|
|
86
|
+
* 构造函数
|
|
87
|
+
* @param config 初始配置
|
|
88
|
+
*/
|
|
89
|
+
constructor(config?: Partial<FaceDetectorConfig>);
|
|
90
|
+
/**
|
|
91
|
+
* 获取模块能力
|
|
92
|
+
*/
|
|
93
|
+
get capabilities(): ModuleCapabilities;
|
|
94
|
+
/**
|
|
95
|
+
* 初始化模块
|
|
96
|
+
* @param options 初始化选项
|
|
97
|
+
*/
|
|
98
|
+
initialize(options?: ModuleInitOptions): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* 加载人脸检测模型
|
|
101
|
+
* @param modelPath 模型路径
|
|
102
|
+
*/
|
|
103
|
+
private loadModels;
|
|
104
|
+
/**
|
|
105
|
+
* 处理图片
|
|
106
|
+
* @param image 图片源
|
|
107
|
+
* @param options 处理选项
|
|
108
|
+
*/
|
|
109
|
+
processImage(image: string | HTMLImageElement | HTMLCanvasElement | ImageData, options?: FaceDetectionOptions): Promise<Result<FaceDetectionResult[]>>;
|
|
110
|
+
/**
|
|
111
|
+
* 开始实时处理
|
|
112
|
+
* @param videoElement 视频元素
|
|
113
|
+
* @param options 处理选项
|
|
114
|
+
*/
|
|
115
|
+
startRealtime(videoElement?: HTMLVideoElement, options?: FaceDetectionOptions): Promise<Result<boolean>>;
|
|
116
|
+
/**
|
|
117
|
+
* 停止实时处理
|
|
118
|
+
*/
|
|
119
|
+
stopRealtime(): void;
|
|
120
|
+
/**
|
|
121
|
+
* 释放资源
|
|
122
|
+
*/
|
|
123
|
+
dispose(): Promise<void>;
|
|
124
|
+
/**
|
|
125
|
+
* 加载图片
|
|
126
|
+
* @param src 图片URL
|
|
127
|
+
*/
|
|
128
|
+
private loadImage;
|
|
129
|
+
/**
|
|
130
|
+
* 处理视频帧
|
|
131
|
+
* @param video 视频元素
|
|
132
|
+
* @param options 处理选项
|
|
133
|
+
*/
|
|
134
|
+
private processVideoFrame;
|
|
135
|
+
/**
|
|
136
|
+
* 处理摄像头帧
|
|
137
|
+
*/
|
|
138
|
+
private handleCameraFrame;
|
|
139
|
+
/**
|
|
140
|
+
* 执行人脸检测
|
|
141
|
+
* @param input 输入图像
|
|
142
|
+
* @param options 检测选项
|
|
143
|
+
*/
|
|
144
|
+
private detectFaces;
|
|
145
|
+
/**
|
|
146
|
+
* 跟踪人脸
|
|
147
|
+
* @param detection 人脸检测结果
|
|
148
|
+
*/
|
|
149
|
+
private trackFace;
|
|
150
|
+
/**
|
|
151
|
+
* 比对两个人脸
|
|
152
|
+
* @param source 源人脸
|
|
153
|
+
* @param target 目标人脸
|
|
154
|
+
*/
|
|
155
|
+
compareFaces(source: string | HTMLImageElement | FaceDetectionResult, target: string | HTMLImageElement | FaceDetectionResult): Promise<Result<{
|
|
156
|
+
similarity: number;
|
|
157
|
+
isMatch: boolean;
|
|
158
|
+
threshold: number;
|
|
159
|
+
}>>;
|
|
160
|
+
/**
|
|
161
|
+
* 计算两个特征向量的余弦相似度
|
|
162
|
+
* @param v1 特征向量1
|
|
163
|
+
* @param v2 特征向量2
|
|
164
|
+
*/
|
|
165
|
+
private calculateSimilarity;
|
|
166
|
+
/**
|
|
167
|
+
* 获取最近的检测结果
|
|
168
|
+
*/
|
|
169
|
+
getLatestResults(): FaceDetectionResult[];
|
|
170
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 人脸模块入口
|
|
3
|
+
* @description 提供人脸检测、活体检测和人脸比对功能的模块入口
|
|
4
|
+
* @module modules/face
|
|
5
|
+
*/
|
|
6
|
+
import { BaseModule } from '../../core/base-module';
|
|
7
|
+
import { FaceDetectionResult, FaceComparisonResult, FaceModuleOptions } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* 人脸模块
|
|
10
|
+
* 提供人脸检测、活体检测和人脸比对功能
|
|
11
|
+
*/
|
|
12
|
+
export declare class FaceModule extends BaseModule {
|
|
13
|
+
/** 模块名称 */
|
|
14
|
+
readonly name: string;
|
|
15
|
+
/** 模块配置 */
|
|
16
|
+
private options;
|
|
17
|
+
/** 最后一次检测结果 */
|
|
18
|
+
private lastDetectionResult?;
|
|
19
|
+
/**
|
|
20
|
+
* 构造函数
|
|
21
|
+
* @param options 模块配置选项
|
|
22
|
+
*/
|
|
23
|
+
constructor(options?: FaceModuleOptions);
|
|
24
|
+
/**
|
|
25
|
+
* 初始化模块
|
|
26
|
+
*/
|
|
27
|
+
initialize(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* 检测图像中的人脸
|
|
30
|
+
* @param image 图像源
|
|
31
|
+
* @returns 人脸检测结果
|
|
32
|
+
*/
|
|
33
|
+
detectFace(image: ImageData | HTMLImageElement | HTMLCanvasElement): Promise<FaceDetectionResult | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* 进行活体检测
|
|
36
|
+
* @param image 图像源
|
|
37
|
+
* @returns 活体检测结果
|
|
38
|
+
*/
|
|
39
|
+
detectLiveness(image: ImageData | HTMLImageElement | HTMLCanvasElement): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* 比对两个人脸
|
|
42
|
+
* @param face1 第一个人脸图像
|
|
43
|
+
* @param face2 第二个人脸图像
|
|
44
|
+
* @returns 人脸比对结果
|
|
45
|
+
*/
|
|
46
|
+
compareFaces(face1: ImageData | HTMLImageElement | HTMLCanvasElement, face2: ImageData | HTMLImageElement | HTMLCanvasElement): Promise<FaceComparisonResult>;
|
|
47
|
+
/**
|
|
48
|
+
* 获取最后一次检测结果
|
|
49
|
+
*/
|
|
50
|
+
getLastDetectionResult(): FaceDetectionResult | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* 释放模块资源
|
|
53
|
+
*/
|
|
54
|
+
dispose(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export * from './types';
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 活体检测模块
|
|
3
|
+
* @description 提供人脸活体检测功能
|
|
4
|
+
* @module modules/face/liveness-detector
|
|
5
|
+
*/
|
|
6
|
+
import { BaseScannerModule, ModuleCapabilities, ModuleInitOptions, ModuleType } from '../../interfaces/scanner-module';
|
|
7
|
+
import { LivenessAction, LivenessDetectionResult, LivenessDetectionType, LivenessSession } from '../../interfaces/face-detection';
|
|
8
|
+
import { Result } from '../../core/result';
|
|
9
|
+
import { FaceDetector } from './face-detector';
|
|
10
|
+
/**
|
|
11
|
+
* 眨眼检测阈值配置
|
|
12
|
+
*/
|
|
13
|
+
interface BlinkThresholds {
|
|
14
|
+
/** 眼睛闭合阈值 */
|
|
15
|
+
eyeClosedThreshold: number;
|
|
16
|
+
/** 眼睛张开阈值 */
|
|
17
|
+
eyeOpenThreshold: number;
|
|
18
|
+
/** 检测阈值 */
|
|
19
|
+
detectionThreshold: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 活体检测器配置
|
|
23
|
+
*/
|
|
24
|
+
export interface LivenessDetectorConfig {
|
|
25
|
+
/** 是否启用 */
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
/** 检测类型 */
|
|
28
|
+
detectionType: LivenessDetectionType;
|
|
29
|
+
/** 检测置信度阈值 */
|
|
30
|
+
confidenceThreshold: number;
|
|
31
|
+
/** 眨眼检测阈值 */
|
|
32
|
+
blinkThresholds: BlinkThresholds;
|
|
33
|
+
/** 活体挑战超时(毫秒) */
|
|
34
|
+
challengeTimeout: number;
|
|
35
|
+
/** 活体挑战动作 */
|
|
36
|
+
challengeActions: LivenessAction[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 活体检测模块
|
|
40
|
+
* 提供人脸活体检测功能,支持被动式和主动式活体检测
|
|
41
|
+
*/
|
|
42
|
+
export declare class LivenessDetector extends BaseScannerModule {
|
|
43
|
+
/** 模块类型 */
|
|
44
|
+
readonly type: ModuleType;
|
|
45
|
+
/** 模块配置 */
|
|
46
|
+
protected config: LivenessDetectorConfig;
|
|
47
|
+
/** 默认配置 */
|
|
48
|
+
private static readonly DEFAULT_CONFIG;
|
|
49
|
+
/** 配置管理器 */
|
|
50
|
+
private configManager;
|
|
51
|
+
/** 日志记录器 */
|
|
52
|
+
private logger;
|
|
53
|
+
/** 资源管理器 */
|
|
54
|
+
private resourceManager;
|
|
55
|
+
/** 摄像头管理器 */
|
|
56
|
+
private cameraManager;
|
|
57
|
+
/** 人脸检测器 */
|
|
58
|
+
private faceDetector;
|
|
59
|
+
/** 当前活体会话 */
|
|
60
|
+
private currentSession;
|
|
61
|
+
/** 检测历史记录,用于分析眨眼等动作 */
|
|
62
|
+
private detectionHistory;
|
|
63
|
+
/** 最大历史记录长度 */
|
|
64
|
+
private readonly MAX_HISTORY_LENGTH;
|
|
65
|
+
/** 防抖处理函数 */
|
|
66
|
+
private debouncedProcessFrame;
|
|
67
|
+
/**
|
|
68
|
+
* 构造函数
|
|
69
|
+
* @param config 初始配置
|
|
70
|
+
* @param faceDetector 可选的人脸检测器实例
|
|
71
|
+
*/
|
|
72
|
+
constructor(config?: Partial<LivenessDetectorConfig>, faceDetector?: FaceDetector);
|
|
73
|
+
/**
|
|
74
|
+
* 获取模块能力
|
|
75
|
+
*/
|
|
76
|
+
get capabilities(): ModuleCapabilities;
|
|
77
|
+
/**
|
|
78
|
+
* 初始化模块
|
|
79
|
+
* @param options 初始化选项
|
|
80
|
+
*/
|
|
81
|
+
initialize(options?: ModuleInitOptions): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* 处理图片
|
|
84
|
+
* @param image 图片源
|
|
85
|
+
* @param options 处理选项
|
|
86
|
+
*/
|
|
87
|
+
processImage(image: string | HTMLImageElement | HTMLCanvasElement | ImageData, options?: Record<string, any>): Promise<Result<LivenessDetectionResult>>;
|
|
88
|
+
/**
|
|
89
|
+
* 开始活体检测会话
|
|
90
|
+
* @param type 活体检测类型
|
|
91
|
+
*/
|
|
92
|
+
startSession(type?: LivenessDetectionType): Result<LivenessSession>;
|
|
93
|
+
/**
|
|
94
|
+
* 停止当前会话
|
|
95
|
+
*/
|
|
96
|
+
stopSession(): void;
|
|
97
|
+
/**
|
|
98
|
+
* 获取当前活体检测会话
|
|
99
|
+
*/
|
|
100
|
+
getCurrentSession(): LivenessSession | null;
|
|
101
|
+
/**
|
|
102
|
+
* 开始实时处理
|
|
103
|
+
* @param videoElement 视频元素
|
|
104
|
+
* @param options 处理选项
|
|
105
|
+
*/
|
|
106
|
+
startRealtime(videoElement?: HTMLVideoElement, options?: Record<string, any>): Promise<Result<boolean>>;
|
|
107
|
+
/**
|
|
108
|
+
* 停止实时处理
|
|
109
|
+
*/
|
|
110
|
+
stopRealtime(): void;
|
|
111
|
+
/**
|
|
112
|
+
* 释放资源
|
|
113
|
+
*/
|
|
114
|
+
dispose(): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* 处理摄像头帧
|
|
117
|
+
*/
|
|
118
|
+
private handleCameraFrame;
|
|
119
|
+
/**
|
|
120
|
+
* 处理视频帧
|
|
121
|
+
*/
|
|
122
|
+
private processFrame;
|
|
123
|
+
/**
|
|
124
|
+
* 处理人脸检测结果
|
|
125
|
+
*/
|
|
126
|
+
private handleFaceDetectionResult;
|
|
127
|
+
/**
|
|
128
|
+
* 处理被动式活体检测
|
|
129
|
+
*/
|
|
130
|
+
private handlePassiveLivenessDetection;
|
|
131
|
+
/**
|
|
132
|
+
* 处理主动式活体检测
|
|
133
|
+
*/
|
|
134
|
+
private handleActiveLivenessDetection;
|
|
135
|
+
/**
|
|
136
|
+
* 处理混合式活体检测
|
|
137
|
+
*/
|
|
138
|
+
private handleHybridLivenessDetection;
|
|
139
|
+
/**
|
|
140
|
+
* 执行被动式活体检测
|
|
141
|
+
*/
|
|
142
|
+
private performPassiveLivenessDetection;
|
|
143
|
+
/**
|
|
144
|
+
* 添加检测结果到历史记录
|
|
145
|
+
*/
|
|
146
|
+
private addToHistory;
|
|
147
|
+
/**
|
|
148
|
+
* 计算眼睛纵横比(EAR)
|
|
149
|
+
* EAR是一种度量眼睛开合程度的指标
|
|
150
|
+
*/
|
|
151
|
+
private calculateEyeAspectRatio;
|
|
152
|
+
/**
|
|
153
|
+
* 计算两点之间的距离
|
|
154
|
+
*/
|
|
155
|
+
private distance;
|
|
156
|
+
/**
|
|
157
|
+
* 检测眨眼动作
|
|
158
|
+
*/
|
|
159
|
+
private detectBlink;
|
|
160
|
+
/**
|
|
161
|
+
* 检测点头动作
|
|
162
|
+
*/
|
|
163
|
+
private detectNod;
|
|
164
|
+
/**
|
|
165
|
+
* 检测摇头动作
|
|
166
|
+
*/
|
|
167
|
+
private detectHeadShake;
|
|
168
|
+
/**
|
|
169
|
+
* 检测微笑动作
|
|
170
|
+
*/
|
|
171
|
+
private detectSmile;
|
|
172
|
+
/**
|
|
173
|
+
* 检测张嘴动作
|
|
174
|
+
*/
|
|
175
|
+
private detectMouthOpen;
|
|
176
|
+
}
|
|
177
|
+
export {};
|