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.
Files changed (115) hide show
  1. package/README.md +55 -460
  2. package/dist/id-scanner-lib.esm.js +4641 -0
  3. package/dist/id-scanner-lib.esm.js.map +1 -0
  4. package/dist/id-scanner-lib.js +14755 -0
  5. package/dist/id-scanner-lib.js.map +1 -0
  6. package/dist/types/core/base-module.d.ts +44 -0
  7. package/dist/types/core/camera-manager.d.ts +258 -0
  8. package/dist/types/core/config.d.ts +88 -0
  9. package/dist/types/core/errors.d.ts +111 -0
  10. package/dist/types/core/event-emitter.d.ts +55 -0
  11. package/dist/types/core/logger.d.ts +277 -0
  12. package/dist/types/core/module-manager.d.ts +78 -0
  13. package/dist/types/core/plugin-manager.d.ts +158 -0
  14. package/dist/types/core/resource-manager.d.ts +246 -0
  15. package/dist/types/core/result.d.ts +83 -0
  16. package/dist/types/core/scanner-factory.d.ts +93 -0
  17. package/dist/types/index.bundle.d.ts +1303 -0
  18. package/dist/types/index.d.ts +86 -0
  19. package/dist/types/interfaces/external-types.d.ts +174 -0
  20. package/dist/types/interfaces/face-detection.d.ts +293 -0
  21. package/dist/types/interfaces/scanner-module.d.ts +280 -0
  22. package/dist/types/modules/face/face-detector.d.ts +170 -0
  23. package/dist/types/modules/face/index.d.ts +56 -0
  24. package/dist/types/modules/face/liveness-detector.d.ts +177 -0
  25. package/dist/types/modules/face/types.d.ts +136 -0
  26. package/dist/types/modules/id-card/anti-fake-detector.d.ts +170 -0
  27. package/dist/types/modules/id-card/id-card-detector.d.ts +131 -0
  28. package/dist/types/modules/id-card/index.d.ts +89 -0
  29. package/dist/types/modules/id-card/ocr-processor.d.ts +110 -0
  30. package/dist/types/modules/id-card/ocr-worker.d.ts +31 -0
  31. package/dist/types/modules/id-card/types.d.ts +181 -0
  32. package/dist/types/modules/qrcode/index.d.ts +51 -0
  33. package/dist/types/modules/qrcode/qr-code-scanner.d.ts +64 -0
  34. package/dist/types/modules/qrcode/types.d.ts +67 -0
  35. package/dist/types/utils/camera.d.ts +81 -0
  36. package/dist/types/utils/image-processing.d.ts +176 -0
  37. package/dist/types/utils/index.d.ts +175 -0
  38. package/dist/types/utils/performance.d.ts +81 -0
  39. package/dist/types/utils/resource-manager.d.ts +53 -0
  40. package/dist/types/utils/types.d.ts +166 -0
  41. package/dist/types/utils/worker.d.ts +52 -0
  42. package/dist/types/version.d.ts +7 -0
  43. package/package.json +76 -77
  44. package/src/core/base-module.ts +78 -0
  45. package/src/core/camera-manager.ts +798 -0
  46. package/src/core/config.ts +268 -0
  47. package/src/core/errors.ts +174 -0
  48. package/src/core/event-emitter.ts +110 -0
  49. package/src/core/logger.ts +549 -0
  50. package/src/core/module-manager.ts +165 -0
  51. package/src/core/plugin-manager.ts +429 -0
  52. package/src/core/resource-manager.ts +762 -0
  53. package/src/core/result.ts +163 -0
  54. package/src/core/scanner-factory.ts +237 -0
  55. package/src/index.ts +113 -936
  56. package/src/interfaces/external-types.ts +200 -0
  57. package/src/interfaces/face-detection.ts +309 -0
  58. package/src/interfaces/scanner-module.ts +384 -0
  59. package/src/modules/face/face-detector.ts +931 -0
  60. package/src/modules/face/index.ts +208 -0
  61. package/src/modules/face/liveness-detector.ts +908 -0
  62. package/src/modules/face/types.ts +133 -0
  63. package/src/modules/id-card/anti-fake-detector.ts +732 -0
  64. package/src/modules/id-card/id-card-detector.ts +474 -0
  65. package/src/modules/id-card/index.ts +425 -0
  66. package/src/modules/id-card/ocr-processor.ts +538 -0
  67. package/src/modules/id-card/ocr-worker.ts +259 -0
  68. package/src/modules/id-card/types.ts +178 -0
  69. package/src/modules/qrcode/index.ts +175 -0
  70. package/src/modules/qrcode/qr-code-scanner.ts +230 -0
  71. package/src/modules/qrcode/types.ts +65 -0
  72. package/src/types/browser-image-compression.d.ts +19 -0
  73. package/src/types/tesseract.d.ts +280 -0
  74. package/src/utils/image-processing.ts +432 -49
  75. package/src/utils/index.ts +426 -0
  76. package/src/utils/performance.ts +168 -131
  77. package/src/utils/resource-manager.ts +65 -146
  78. package/src/utils/types.ts +90 -2
  79. package/src/utils/worker.ts +123 -84
  80. package/src/version.ts +11 -0
  81. package/tools/scaffold.js +543 -0
  82. package/dist/id-scanner-core.esm.js +0 -11076
  83. package/dist/id-scanner-core.esm.js.map +0 -1
  84. package/dist/id-scanner-core.js +0 -11088
  85. package/dist/id-scanner-core.js.map +0 -1
  86. package/dist/id-scanner-core.min.js +0 -1
  87. package/dist/id-scanner-core.min.js.map +0 -1
  88. package/dist/id-scanner-ocr.esm.js +0 -1802
  89. package/dist/id-scanner-ocr.esm.js.map +0 -1
  90. package/dist/id-scanner-ocr.js +0 -1811
  91. package/dist/id-scanner-ocr.js.map +0 -1
  92. package/dist/id-scanner-ocr.min.js +0 -1
  93. package/dist/id-scanner-ocr.min.js.map +0 -1
  94. package/dist/id-scanner-qr.esm.js +0 -1023
  95. package/dist/id-scanner-qr.esm.js.map +0 -1
  96. package/dist/id-scanner-qr.js +0 -1032
  97. package/dist/id-scanner-qr.js.map +0 -1
  98. package/dist/id-scanner-qr.min.js +0 -1
  99. package/dist/id-scanner-qr.min.js.map +0 -1
  100. package/dist/id-scanner.js +0 -3740
  101. package/dist/id-scanner.js.map +0 -1
  102. package/dist/id-scanner.min.js +0 -1
  103. package/dist/id-scanner.min.js.map +0 -1
  104. package/src/core.ts +0 -138
  105. package/src/demo/demo.ts +0 -204
  106. package/src/id-recognition/anti-fake-detector.ts +0 -317
  107. package/src/id-recognition/data-extractor.ts +0 -262
  108. package/src/id-recognition/id-detector.ts +0 -363
  109. package/src/id-recognition/ocr-processor.ts +0 -334
  110. package/src/id-recognition/ocr-worker.ts +0 -156
  111. package/src/index-umd.ts +0 -477
  112. package/src/ocr-module.ts +0 -187
  113. package/src/qr-module.ts +0 -179
  114. package/src/scanner/barcode-scanner.ts +0 -251
  115. package/src/scanner/qr-scanner.ts +0 -167
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @file 外部库类型声明
3
+ * @description 为外部依赖库声明类型定义
4
+ */
5
+
6
+ /**
7
+ * TensorFlow.js 相关类型
8
+ */
9
+ declare module '@tensorflow/tfjs' {
10
+ export interface Tensor<R extends Rank = Rank> {
11
+ dataId: object;
12
+ id: number;
13
+ shape: number[];
14
+ dtype: string;
15
+ size: number;
16
+ rank: number;
17
+ dispose(): void;
18
+ // 其他方法...
19
+ }
20
+
21
+ export type Rank = 'R0' | 'R1' | 'R2' | 'R3' | 'R4' | 'R5' | 'R6';
22
+
23
+ export function ready(): Promise<void>;
24
+ export function dispose(): void;
25
+ // 更多方法...
26
+ }
27
+
28
+ /**
29
+ * face-api.js 相关类型
30
+ */
31
+ declare module '@vladmandic/face-api' {
32
+ export namespace tf {
33
+ export function dispose(): Promise<void>;
34
+ }
35
+
36
+ export namespace env {
37
+ export function monkeyPatch(env: any): void;
38
+ }
39
+
40
+ export type TNetInput = HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | ImageData | { toString(): string } | string;
41
+
42
+ export interface FaceDetectionWithLandmarks {
43
+ detection: FaceDetection;
44
+ landmarks: FaceLandmarks68 | FaceLandmarks68TinyNet;
45
+ getRefRect(): any;
46
+ forwardFaceDetection(): FaceDetection;
47
+ }
48
+
49
+ export interface WithFaceDescriptor<T> {
50
+ descriptor: Float32Array;
51
+ }
52
+
53
+ export interface WithAge {
54
+ age: number;
55
+ }
56
+
57
+ export interface WithGender {
58
+ gender: string;
59
+ genderProbability: number;
60
+ }
61
+
62
+ export interface FaceMatch {
63
+ label: string;
64
+ distance: number;
65
+ }
66
+
67
+ export interface WithFaceExpressions {
68
+ expressions: {
69
+ neutral: number;
70
+ happy: number;
71
+ sad: number;
72
+ angry: number;
73
+ fearful: number;
74
+ disgusted: number;
75
+ surprised: number;
76
+ };
77
+ }
78
+
79
+ export interface IFaceLandmarks {
80
+ positions: Point[];
81
+ shift(point: Point): IFaceLandmarks;
82
+ forSize<T extends IFaceLandmarks>(width: number, height: number): T;
83
+ }
84
+
85
+ export interface IRect {
86
+ x: number;
87
+ y: number;
88
+ width: number;
89
+ height: number;
90
+ }
91
+
92
+ export interface IBoundingBox extends IRect {
93
+ left: number;
94
+ top: number;
95
+ right: number;
96
+ bottom: number;
97
+ }
98
+
99
+ export interface IFaceDetection {
100
+ score: number;
101
+ box: IBoundingBox;
102
+ }
103
+
104
+ export class Point {
105
+ x: number;
106
+ y: number;
107
+ constructor(x: number, y: number);
108
+ }
109
+
110
+ export class FaceDetection implements IFaceDetection {
111
+ score: number;
112
+ box: IBoundingBox;
113
+ constructor(score: number, box: IBoundingBox);
114
+ }
115
+
116
+ export class FaceLandmarks68 implements IFaceLandmarks {
117
+ positions: Point[];
118
+ constructor(points: Point[]);
119
+ shift(point: Point): FaceLandmarks68;
120
+ forSize<T extends IFaceLandmarks>(width: number, height: number): T;
121
+ }
122
+
123
+ export class FaceLandmarks68TinyNet extends FaceLandmarks68 {
124
+ constructor(points: Point[]);
125
+ }
126
+
127
+ export class SsdMobilenetv1Options {
128
+ constructor(options?: { minConfidence?: number; maxResults?: number });
129
+ }
130
+
131
+ export class TinyFaceDetectorOptions {
132
+ constructor(options?: { inputSize?: number; scoreThreshold?: number });
133
+ }
134
+
135
+ export class MtcnnOptions {
136
+ constructor(options?: { minFaceSize?: number; scaleFactor?: number; minConfidence?: number });
137
+ }
138
+
139
+ export class FaceRecognitionNet {
140
+ constructor();
141
+ loadFromUri(uri: string): Promise<void>;
142
+ }
143
+
144
+ export class FaceExpressionNet {
145
+ constructor();
146
+ loadFromUri(uri: string): Promise<void>;
147
+ }
148
+
149
+ export class AgeGenderNet {
150
+ constructor();
151
+ loadFromUri(uri: string): Promise<void>;
152
+ }
153
+
154
+ export interface NeuralNetwork {
155
+ loadFromUri(uri: string): Promise<void>;
156
+ isLoaded: boolean;
157
+ dispose(): void;
158
+ }
159
+
160
+ // 命名空间中的网络
161
+ export const nets: {
162
+ ssdMobilenetv1: NeuralNetwork;
163
+ tinyFaceDetector: NeuralNetwork;
164
+ faceLandmark68Net: NeuralNetwork;
165
+ faceLandmark68TinyNet: NeuralNetwork;
166
+ faceRecognitionNet: NeuralNetwork;
167
+ faceExpressionNet: NeuralNetwork;
168
+ ageGenderNet: NeuralNetwork;
169
+ mtcnn: NeuralNetwork;
170
+ };
171
+
172
+ // 工具函数
173
+ export function createCanvasFromMedia(media: TNetInput): HTMLCanvasElement;
174
+ export function detectAllFaces(input: TNetInput, options?: SsdMobilenetv1Options | TinyFaceDetectorOptions | MtcnnOptions): DetectAllFacesTask;
175
+
176
+ export interface DetectAllFacesTask {
177
+ withFaceLandmarks(useTinyModel?: boolean): DetectAllFacesWithLandmarksTask;
178
+ run(): Promise<FaceDetection[]>;
179
+ }
180
+
181
+ export interface DetectAllFacesWithLandmarksTask {
182
+ withFaceExpressions(): DetectAllFacesWithFaceExpressionsTask;
183
+ withAgeAndGender(): DetectAllFacesWithAgeAndGenderTask;
184
+ run(): Promise<FaceDetectionWithLandmarks[]>;
185
+ }
186
+
187
+ export interface DetectAllFacesWithFaceExpressionsTask {
188
+ withAgeAndGender(): DetectAllFacesWithAgeAndGenderTask;
189
+ run(): Promise<Array<FaceDetectionWithLandmarks & WithFaceExpressions>>;
190
+ }
191
+
192
+ export interface DetectAllFacesWithAgeAndGenderTask {
193
+ withFaceDescriptors(): DetectAllFacesWithFaceDescriptorsTask;
194
+ run(): Promise<Array<FaceDetectionWithLandmarks & WithFaceExpressions & WithAge & WithGender>>;
195
+ }
196
+
197
+ export interface DetectAllFacesWithFaceDescriptorsTask {
198
+ run(): Promise<Array<FaceDetectionWithLandmarks & WithFaceExpressions & WithAge & WithGender & WithFaceDescriptor<any>>>;
199
+ }
200
+ }
@@ -0,0 +1,309 @@
1
+ /**
2
+ * @file 人脸检测接口
3
+ * @description 定义人脸检测相关的数据类型和接口
4
+ * @module interfaces/face-detection
5
+ */
6
+
7
+ import { BaseScannerResult } from './scanner-module';
8
+
9
+ /**
10
+ * 坐标点接口,表示2D坐标
11
+ */
12
+ export interface Point {
13
+ /** X坐标 */
14
+ x: number;
15
+ /** Y坐标 */
16
+ y: number;
17
+ }
18
+
19
+ /**
20
+ * 矩形接口,表示检测框
21
+ */
22
+ export interface Rect {
23
+ /** 左上角X坐标 */
24
+ x: number;
25
+ /** 左上角Y坐标 */
26
+ y: number;
27
+ /** 宽度 */
28
+ width: number;
29
+ /** 高度 */
30
+ height: number;
31
+ }
32
+
33
+ /**
34
+ * 人脸关键点
35
+ */
36
+ export interface FaceLandmarks {
37
+ /** 左眼位置 */
38
+ leftEye: Point;
39
+ /** 右眼位置 */
40
+ rightEye: Point;
41
+ /** 鼻尖位置 */
42
+ nose: Point;
43
+ /** 嘴巴中心位置 */
44
+ mouth: Point;
45
+ /** 左眼角位置 */
46
+ leftEyeOuterCorner?: Point;
47
+ /** 右眼角位置 */
48
+ rightEyeOuterCorner?: Point;
49
+ /** 左耳位置 */
50
+ leftEar?: Point;
51
+ /** 右耳位置 */
52
+ rightEar?: Point;
53
+ /** 所有关键点(有些实现可能提供更多点) */
54
+ points?: Point[];
55
+ }
56
+
57
+ /**
58
+ * 人脸角度
59
+ */
60
+ export interface FaceAngle {
61
+ /** 俯仰角(上下) */
62
+ pitch: number;
63
+ /** 偏航角(左右) */
64
+ yaw: number;
65
+ /** 滚动角(倾斜) */
66
+ roll: number;
67
+ }
68
+
69
+ /**
70
+ * 人脸质量评估指标
71
+ */
72
+ export interface FaceQualityMetrics {
73
+ /** 亮度评分(0-1) */
74
+ brightness: number;
75
+ /** 清晰度评分(0-1) */
76
+ sharpness: number;
77
+ /** 姿态合规程度(0-1) */
78
+ pose: number;
79
+ /** 人脸完整度(0-1) */
80
+ integrity: number;
81
+ /** 整体质量分数(0-1) */
82
+ overall: number;
83
+ }
84
+
85
+ /**
86
+ * 人脸属性
87
+ */
88
+ export interface FaceAttributes {
89
+ /** 年龄估计(岁) */
90
+ age?: number;
91
+ /** 性别置信度(0-1,越大越倾向于男性) */
92
+ gender?: number;
93
+ /** 是否戴眼镜置信度 */
94
+ glasses?: number;
95
+ /** 是否戴口罩置信度 */
96
+ mask?: number;
97
+ /** 微笑程度置信度 */
98
+ smile?: number;
99
+ /** 人脸表情分类 */
100
+ emotion?: {
101
+ /** 生气程度 */
102
+ angry?: number;
103
+ /** 恐惧程度 */
104
+ fear?: number;
105
+ /** 厌恶程度 */
106
+ disgust?: number;
107
+ /** 高兴程度 */
108
+ happy?: number;
109
+ /** 平静程度 */
110
+ neutral?: number;
111
+ /** 伤心程度 */
112
+ sad?: number;
113
+ /** 惊讶程度 */
114
+ surprise?: number;
115
+ };
116
+ /** 人种类别置信度 */
117
+ ethnicity?: {
118
+ /** 亚洲人程度 */
119
+ asian?: number;
120
+ /** 黑人程度 */
121
+ black?: number;
122
+ /** 白人程度 */
123
+ caucasian?: number;
124
+ /** 其他人种程度 */
125
+ other?: number;
126
+ };
127
+ /** 其他自定义属性 */
128
+ [key: string]: any;
129
+ }
130
+
131
+ /**
132
+ * 人脸特征向量(人脸嵌入)
133
+ */
134
+ export interface FaceEmbedding {
135
+ /** 特征向量数据 */
136
+ vector: number[];
137
+ /** 特征维度 */
138
+ dimension: number;
139
+ /** 模型版本 */
140
+ modelVersion?: string;
141
+ }
142
+
143
+ /**
144
+ * 人脸检测结果
145
+ */
146
+ export interface FaceDetectionResult extends BaseScannerResult {
147
+ /** 人脸区域 */
148
+ boundingBox: Rect;
149
+ /** 人脸关键点 */
150
+ landmarks?: FaceLandmarks;
151
+ /** 人脸角度 */
152
+ angle?: FaceAngle;
153
+ /** 检测质量 */
154
+ quality?: FaceQualityMetrics;
155
+ /** 人脸属性 */
156
+ attributes?: FaceAttributes;
157
+ /** 人脸特征向量 */
158
+ embedding?: FaceEmbedding;
159
+ /** 相似度分数(用于比对场景) */
160
+ similarityScore?: number;
161
+ /** 是否有活体检测结果 */
162
+ isLive?: boolean;
163
+ /** 活体检测分数(0-1) */
164
+ livenessScore?: number;
165
+ /** 标识符(可用于跟踪) */
166
+ trackId?: string;
167
+ /** 人脸图像数据(裁剪后) */
168
+ faceImageData?: string;
169
+ }
170
+
171
+ /**
172
+ * 人脸比对结果
173
+ */
174
+ export interface FaceComparisonResult {
175
+ /** 相似度分数(0-1) */
176
+ similarity: number;
177
+ /** 是否匹配(基于阈值判断) */
178
+ isMatch: boolean;
179
+ /** 使用的阈值 */
180
+ threshold: number;
181
+ /** 源人脸 */
182
+ sourceFace?: FaceDetectionResult;
183
+ /** 目标人脸 */
184
+ targetFace?: FaceDetectionResult;
185
+ /** 处理时间(毫秒) */
186
+ processingTime: number;
187
+ }
188
+
189
+ /**
190
+ * 活体检测类型
191
+ */
192
+ export enum LivenessDetectionType {
193
+ /** 被动活体检测(单图分析) */
194
+ PASSIVE = 'passive',
195
+ /** 主动活体检测(动作挑战) */
196
+ ACTIVE = 'active',
197
+ /** 混合活体检测(结合多种方法) */
198
+ HYBRID = 'hybrid'
199
+ }
200
+
201
+ /**
202
+ * 活体检测动作类型
203
+ */
204
+ export enum LivenessAction {
205
+ /** 眨眼 */
206
+ BLINK = 'blink',
207
+ /** 点头 */
208
+ NOD = 'nod',
209
+ /** 摇头 */
210
+ SHAKE = 'shake',
211
+ /** 微笑 */
212
+ SMILE = 'smile',
213
+ /** 张嘴 */
214
+ MOUTH_OPEN = 'mouth_open',
215
+ /** 注视点 */
216
+ GAZE = 'gaze'
217
+ }
218
+
219
+ /**
220
+ * 活体检测结果
221
+ */
222
+ export interface LivenessDetectionResult {
223
+ /** 是否为真人 */
224
+ isLive: boolean;
225
+ /** 活体分数(0-1) */
226
+ score: number;
227
+ /** 使用的活体检测类型 */
228
+ type: LivenessDetectionType;
229
+ /** 活体检测动作(如果使用了主动活体检测) */
230
+ actions?: LivenessAction[];
231
+ /** 检测时间(毫秒) */
232
+ processingTime: number;
233
+ /** 检测结果图片 */
234
+ imageData?: string;
235
+ }
236
+
237
+ /**
238
+ * 活体检测会话
239
+ */
240
+ export interface LivenessSession {
241
+ /** 会话ID */
242
+ id: string;
243
+ /** 活体检测类型 */
244
+ type: LivenessDetectionType;
245
+ /** 需要完成的动作 */
246
+ requiredActions?: LivenessAction[];
247
+ /** 当前动作索引 */
248
+ currentActionIndex?: number;
249
+ /** 会话开始时间 */
250
+ startTime: number;
251
+ /** 会话超时时间(毫秒) */
252
+ timeout: number;
253
+ /** 会话状态 */
254
+ status: 'active' | 'completed' | 'failed' | 'timeout';
255
+ /** 完成的动作 */
256
+ completedActions?: LivenessAction[];
257
+ /** 活体检测结果 */
258
+ result?: LivenessDetectionResult;
259
+ }
260
+
261
+ /**
262
+ * 人脸跟踪结果
263
+ */
264
+ export interface FaceTrackingResult {
265
+ /** 跟踪ID */
266
+ trackId: string;
267
+ /** 当前检测结果 */
268
+ detection: FaceDetectionResult;
269
+ /** 首次检测时间 */
270
+ firstDetectedAt: number;
271
+ /** 上次检测时间 */
272
+ lastDetectedAt: number;
273
+ /** 跟踪状态 */
274
+ status: 'tracked' | 'lost' | 'removed';
275
+ /** 连续跟踪帧数 */
276
+ consecutiveFrames: number;
277
+ /** 历史位置(最近几帧) */
278
+ history?: Rect[];
279
+ }
280
+
281
+ /**
282
+ * 人脸检测选项
283
+ */
284
+ export interface FaceDetectionOptions {
285
+ /** 最低人脸置信度 */
286
+ minConfidence?: number;
287
+ /** 最大检测人脸数 */
288
+ maxFaces?: number;
289
+ /** 是否检测关键点 */
290
+ withLandmarks?: boolean;
291
+ /** 是否检测属性 */
292
+ withAttributes?: boolean;
293
+ /** 是否进行人脸对齐 */
294
+ doAlignment?: boolean;
295
+ /** 是否提取人脸特征 */
296
+ withEmbedding?: boolean;
297
+ /** 是否启用跟踪 */
298
+ enableTracking?: boolean;
299
+ /** 是否执行活体检测 */
300
+ withLiveness?: boolean;
301
+ /** 活体检测类型 */
302
+ livenessType?: LivenessDetectionType;
303
+ /** 返回人脸图像 */
304
+ returnFaceImage?: boolean;
305
+ /** 活体检测选项 */
306
+ livenessOptions?: Record<string, any>;
307
+ /** 其他选项 */
308
+ [key: string]: any;
309
+ }