id-scanner-lib 1.3.3 → 1.6.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 +324 -410
- package/dist/id-scanner-lib.esm.js +4826 -0
- package/dist/id-scanner-lib.esm.js.map +1 -0
- package/dist/id-scanner-lib.js +4858 -0
- package/dist/id-scanner-lib.js.map +1 -0
- package/dist/types/browser-image-compression.d.ts +19 -0
- package/dist/types/tesseract.d.ts +280 -0
- package/package.json +89 -78
- package/src/core/base-module.ts +78 -0
- package/src/core/camera-manager.ts +813 -0
- package/src/core/config.ts +305 -0
- package/src/core/errors.ts +174 -0
- package/src/core/event-emitter.test.ts +42 -0
- package/src/core/event-emitter.ts +110 -0
- package/src/core/loading-state.test.ts +67 -0
- package/src/core/loading-state.ts +156 -0
- package/src/core/logger.test.ts +49 -0
- package/src/core/logger.ts +549 -0
- package/src/core/module-manager.ts +163 -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 +236 -0
- package/src/index.ts +117 -939
- 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 +988 -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/{id-recognition → modules/id-card}/anti-fake-detector.ts +274 -240
- package/src/modules/id-card/id-card-detector.ts +474 -0
- package/src/modules/id-card/index.ts +425 -0
- package/src/{id-recognition → modules/id-card}/ocr-processor.ts +149 -92
- 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 +231 -0
- package/src/modules/qrcode/types.ts +169 -0
- package/src/types/common.test.ts +99 -0
- package/src/types/common.ts +166 -0
- package/src/types/tesseract.d.ts +265 -22
- package/src/utils/camera.test.ts +30 -0
- package/src/utils/camera.ts +4 -1
- package/src/utils/error-handler.test.ts +137 -0
- package/src/utils/error-handler.ts +110 -0
- package/src/utils/image-processing.ts +68 -49
- package/src/utils/index.test.ts +186 -0
- package/src/utils/index.ts +429 -0
- package/src/utils/performance.ts +168 -131
- package/src/utils/resource-manager.ts +65 -146
- package/src/utils/retry.test.ts +142 -0
- package/src/utils/retry.ts +282 -0
- package/src/utils/types.ts +90 -2
- package/src/utils/utils.test.ts +171 -0
- 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 -11349
- package/dist/id-scanner-core.js +0 -11361
- package/dist/id-scanner-core.min.js +0 -1
- package/dist/id-scanner-ocr.esm.js +0 -2319
- package/dist/id-scanner-ocr.js +0 -2328
- package/dist/id-scanner-ocr.min.js +0 -1
- package/dist/id-scanner-qr.esm.js +0 -1296
- package/dist/id-scanner-qr.js +0 -1305
- package/dist/id-scanner-qr.min.js +0 -1
- package/dist/id-scanner.js +0 -4561
- package/dist/id-scanner.min.js +0 -1
- package/src/core.ts +0 -138
- package/src/demo/demo.ts +0 -204
- package/src/id-recognition/data-extractor.ts +0 -262
- package/src/id-recognition/id-detector.ts +0 -510
- 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
package/README.md
CHANGED
|
@@ -1,505 +1,419 @@
|
|
|
1
|
-
# ID
|
|
2
|
-
|
|
3
|
-
纯前端实现的TypeScript身份证与二维码识别库,无需后端支持,所有处理均在浏览器端完成。结合高性能图像处理与OCR技术,提供完整的识别解决方案。
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/id-scanner-lib)
|
|
6
|
-
[](https://github.com/agions/id-scanner-lib)
|
|
7
|
-
[](https://bundlephobia.com/package/id-scanner-lib)
|
|
8
|
-
[](https://github.com/agions/id-scanner-lib/blob/master/LICENSE)
|
|
9
|
-
|
|
10
|
-
## 技术特性
|
|
11
|
-
|
|
12
|
-
- **高性能识别引擎**:针对浏览器环境优化的识别算法,支持实时处理
|
|
13
|
-
- **二维码扫描**:基于jsQR实现高精度二维码识别与解码
|
|
14
|
-
- **条形码识别**:支持EAN-13、CODE-128等常见一维码格式
|
|
15
|
-
- **身份证OCR**:基于Tesseract.js的优化OCR引擎,精确提取身份证信息
|
|
16
|
-
- **身份证防伪检测**:检测多种防伪特征,有效识别伪造证件
|
|
17
|
-
- **图像处理优化**:内置多种图像预处理算法,提高识别率
|
|
18
|
-
- **支持多种数据源**:摄像头实时视频流、图片文件、URL、Base64等
|
|
19
|
-
- **高效缓存机制**:内置LRU缓存,避免重复识别,提升性能
|
|
20
|
-
- **Web Worker支持**:耗时操作可在后台线程执行,不阻塞UI
|
|
21
|
-
- **模块化设计**:支持按需加载,最小化应用体积
|
|
22
|
-
- **TypeScript支持**:完整类型定义,提供良好的开发体验
|
|
23
|
-
|
|
24
|
-
## 性能指标
|
|
25
|
-
|
|
26
|
-
| 功能 | 平均识别时间 | 识别率 | 备注 |
|
|
27
|
-
| ---------- | ------------ | ------ | ---------------- |
|
|
28
|
-
| 二维码识别 | 50-150ms | >98% | 取决于图像质量 |
|
|
29
|
-
| 条形码识别 | 70-200ms | >95% | 支持多种格式 |
|
|
30
|
-
| 身份证OCR | 300-800ms | >90% | 优化后的识别速度 |
|
|
31
|
-
| 防伪检测 | 100-200ms | >85% | 多特征综合分析 |
|
|
32
|
-
| 图像处理 | 20-100ms | - | 视处理操作而定 |
|
|
33
|
-
|
|
34
|
-
## 最新版本 (v1.3.2)
|
|
35
|
-
|
|
36
|
-
- **图像处理引擎升级**:
|
|
37
|
-
- 增强的图像锐化算法,提高低光照环境下的识别率
|
|
38
|
-
- 自适应阈值算法,优化二值化效果
|
|
39
|
-
- 基于OTSU算法的自动阈值选择
|
|
40
|
-
- **性能优化**:
|
|
41
|
-
- 代码压缩与Tree-shaking优化,减少30%以上的包体积
|
|
42
|
-
- 引入智能缓存机制,避免重复计算
|
|
43
|
-
- Web Worker支持,提高多核CPU利用率
|
|
44
|
-
- **新增功能**:
|
|
45
|
-
- 批量图像处理API
|
|
46
|
-
- 内置图像压缩功能
|
|
47
|
-
- 一体化演示组件
|
|
48
|
-
- **身份证防伪检测**:识别多种防伪特征,检测伪造证件
|
|
49
|
-
- 支持荧光油墨、微缩文字、光变图案等5种防伪特征检测
|
|
50
|
-
- 基于多特征综合评分,提供置信度评估
|
|
51
|
-
- 缓存机制提高重复检测性能
|
|
52
|
-
- **架构改进**:
|
|
53
|
-
- 资源自动释放机制
|
|
54
|
-
- 更精细的模块划分
|
|
55
|
-
- 增强的错误处理
|
|
56
|
-
|
|
57
|
-
## 版本路线图
|
|
58
|
-
|
|
59
|
-
### v1.4.0:人脸比对与活体检测
|
|
60
|
-
|
|
61
|
-
- **人脸比对模块**:
|
|
62
|
-
- 身份证照片与现场采集照片的比对功能
|
|
63
|
-
- 基于深度学习的人脸特征提取与分析
|
|
64
|
-
- 提供相似度评分与置信度
|
|
65
|
-
- **活体检测**:
|
|
66
|
-
- 眨眼、张嘴等动作检测防止照片欺骗
|
|
67
|
-
- 基于光线反射的3D检测技术
|
|
68
|
-
- 多帧分析提高检测准确率
|
|
69
|
-
- **安全增强**:
|
|
70
|
-
- 本地处理所有数据,保护隐私
|
|
71
|
-
- 结果加密存储选项
|
|
72
|
-
- 合规性验证工具
|
|
73
|
-
|
|
74
|
-
### v1.5.0:多证件类型支持
|
|
75
|
-
|
|
76
|
-
- **护照识别**:
|
|
77
|
-
- MRZ码(机读区)解析
|
|
78
|
-
- 多国护照模板适配
|
|
79
|
-
- 芯片信息读取(ePassport支持)
|
|
80
|
-
- **驾驶证识别**:
|
|
81
|
-
- 驾驶证OCR识别
|
|
82
|
-
- 驾驶资格与限制条件解析
|
|
83
|
-
- 国际驾照支持
|
|
84
|
-
- **营业执照识别**:
|
|
85
|
-
- 企业信息提取
|
|
86
|
-
- 统一社会信用代码验证
|
|
87
|
-
- 经营范围解析
|
|
88
|
-
- **银行卡识别**:
|
|
89
|
-
- 卡号、有效期识别
|
|
90
|
-
- 银行标识解析
|
|
91
|
-
- BIN码验证
|
|
92
|
-
|
|
93
|
-
### v1.6.0:UI/UX改进与组件库升级
|
|
94
|
-
|
|
95
|
-
- **现代化UI框架**:
|
|
96
|
-
- 基于Web Components的组件系统
|
|
97
|
-
- 自适应扫描界面
|
|
98
|
-
- 多主题支持(含暗色模式)
|
|
99
|
-
- **交互体验优化**:
|
|
100
|
-
- 实时扫描引导框
|
|
101
|
-
- 智能对焦与取景提示
|
|
102
|
-
- 证件边缘自动检测与校正
|
|
103
|
-
- **可访问性支持**:
|
|
104
|
-
- 屏幕阅读器兼容
|
|
105
|
-
- 键盘导航
|
|
106
|
-
- 多语言本地化
|
|
107
|
-
- **动效与反馈**:
|
|
108
|
-
- 平滑过渡动画
|
|
109
|
-
- 触觉反馈(移动设备)
|
|
110
|
-
- 声音反馈与语音提示
|
|
111
|
-
|
|
112
|
-
### v1.7.0:性能与架构优化
|
|
113
|
-
|
|
114
|
-
- **WebAssembly实现**:
|
|
115
|
-
- 核心图像处理算法WASM化
|
|
116
|
-
- 性能提升3-5倍
|
|
117
|
-
- 更低的CPU占用
|
|
118
|
-
- **离线支持**:
|
|
119
|
-
- 完整离线运行能力
|
|
120
|
-
- 基于IndexedDB的本地缓存
|
|
121
|
-
- Service Worker支持
|
|
122
|
-
- **微前端集成**:
|
|
123
|
-
- React/Vue/Angular专用组件
|
|
124
|
-
- 更简单的集成API
|
|
125
|
-
- TypeScript类型增强
|
|
126
|
-
- **渐进式加载**:
|
|
127
|
-
- 核心功能快速加载
|
|
128
|
-
- 按需延迟加载附加模块
|
|
129
|
-
- 预测性加载提高响应速度
|
|
130
|
-
|
|
131
|
-
### v2.0.0:企业级解决方案
|
|
132
|
-
|
|
133
|
-
- **云端协同验证**:
|
|
134
|
-
- 可选云端验证API
|
|
135
|
-
- 本地与云端结果比对
|
|
136
|
-
- 多级安全验证
|
|
137
|
-
- **高级分析功能**:
|
|
138
|
-
- 证件使用统计与分析
|
|
139
|
-
- 风险评估模型
|
|
140
|
-
- 异常检测系统
|
|
141
|
-
- **行业解决方案包**:
|
|
142
|
-
- 金融行业KYC流程集成
|
|
143
|
-
- 酒店/零售快速登记系统
|
|
144
|
-
- 政务/安防高安全性验证
|
|
145
|
-
- **企业级管理功能**:
|
|
146
|
-
- 多租户支持
|
|
147
|
-
- 批量处理队列
|
|
148
|
-
- 完整审计日志
|
|
149
|
-
|
|
150
|
-
## 系统架构
|
|
1
|
+
# ID Scanner Lib
|
|
151
2
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
│
|
|
162
|
-
▼
|
|
163
|
-
┌────────────────────────────────────────────────────────────┐
|
|
164
|
-
│ 核心处理引擎 │
|
|
165
|
-
├─────────────────┬─────────────────┬────────────────────────┤
|
|
166
|
-
│ OCRProcessor │ DataExtractor │ ImageProcessor │
|
|
167
|
-
│ (文字识别) │ (数据提取验证) │ (图像预处理) │
|
|
168
|
-
├─────────────────┴─────────────────┴────────────────────────┤
|
|
169
|
-
│ AntiFakeDetector (身份证防伪检测) │
|
|
170
|
-
└────────────────────────────────────────────────────────────┘
|
|
171
|
-
```
|
|
3
|
+
[English](./README_EN.md) | [中文](./README.md)
|
|
4
|
+
|
|
5
|
+
一个功能强大的浏览器端身份验证和人脸识别库,支持人脸检测、人脸比对、活体检测和二维码扫描。
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## 特性
|
|
172
12
|
|
|
173
|
-
|
|
13
|
+
- 🚀 **模块化架构** - 核心组件独立封装,便于扩展和维护
|
|
14
|
+
- 👤 **人脸检测** - 快速准确的人脸定位和属性分析
|
|
15
|
+
- 🔍 **人脸比对** - 高精度的人脸相似度比对
|
|
16
|
+
- 🛡️ **活体检测** - 支持被动式和主动式活体验证,防止照片、视频欺骗
|
|
17
|
+
- 📱 **二维码扫描** - 支持QR码和多种条形码格式
|
|
18
|
+
- ⚡ **轻量级** - 优化的模型加载策略,按需加载
|
|
19
|
+
- 🌐 **跨平台** - 支持所有主流浏览器和设备
|
|
174
20
|
|
|
175
|
-
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
### NPM
|
|
176
24
|
|
|
177
25
|
```bash
|
|
178
|
-
npm install id-scanner-lib
|
|
26
|
+
npm install id-scanner-lib
|
|
179
27
|
```
|
|
180
28
|
|
|
181
|
-
### CDN
|
|
29
|
+
### CDN
|
|
182
30
|
|
|
183
31
|
```html
|
|
184
|
-
<!--
|
|
185
|
-
<script src="https://cdn.jsdelivr.net/npm/id-scanner-lib
|
|
32
|
+
<!-- UMD -->
|
|
33
|
+
<script src="https://cdn.jsdelivr.net/npm/id-scanner-lib/dist/id-scanner-lib.min.js"></script>
|
|
186
34
|
|
|
187
|
-
<!--
|
|
188
|
-
<script
|
|
35
|
+
<!-- ESM -->
|
|
36
|
+
<script type="module">
|
|
37
|
+
import IDScannerLib from 'https://cdn.jsdelivr.net/npm/id-scanner-lib/dist/id-scanner-lib.esm.js';
|
|
38
|
+
</script>
|
|
189
39
|
```
|
|
190
40
|
|
|
191
|
-
##
|
|
41
|
+
## 快速开始
|
|
192
42
|
|
|
193
|
-
|
|
43
|
+
### 基础使用
|
|
194
44
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
| 完整包(min.js) | 93KB | 包含所有功能 |
|
|
198
|
-
| 核心包(min.js) | 186KB | 基础功能,无OCR |
|
|
199
|
-
| OCR模块(min.js) | 70KB | 仅文字识别 |
|
|
200
|
-
| QR模块(min.js) | 60KB | 仅二维码识别 |
|
|
201
|
-
| ESM模块 | 各模块更小 | 支持Tree-shaking |
|
|
45
|
+
```typescript
|
|
46
|
+
import { IDScanner, FaceModule } from 'id-scanner-lib';
|
|
202
47
|
|
|
203
|
-
|
|
48
|
+
// 初始化库
|
|
49
|
+
await IDScanner.initialize({
|
|
50
|
+
debug: true
|
|
51
|
+
});
|
|
204
52
|
|
|
205
|
-
|
|
53
|
+
// 创建人脸模块
|
|
54
|
+
const faceModule = new FaceModule({
|
|
55
|
+
onFaceDetected: (faces) => console.log('检测到人脸:', faces),
|
|
56
|
+
onError: (error) => console.error('错误:', error)
|
|
57
|
+
});
|
|
206
58
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
import { IDScanner } from 'id-scanner-lib';
|
|
59
|
+
// 初始化人脸模块
|
|
60
|
+
await faceModule.initialize();
|
|
210
61
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
onAntiFakeDetected: (result) => console.log('防伪检测结果:', result)
|
|
215
|
-
});
|
|
62
|
+
// 启动摄像头并开始人脸检测
|
|
63
|
+
const videoElement = document.getElementById('video');
|
|
64
|
+
await faceModule.startFaceRecognition(videoElement);
|
|
216
65
|
```
|
|
217
66
|
|
|
218
|
-
###
|
|
67
|
+
### 人脸比对
|
|
219
68
|
|
|
220
|
-
```
|
|
221
|
-
//
|
|
222
|
-
|
|
69
|
+
```typescript
|
|
70
|
+
// 比对两张人脸图片
|
|
71
|
+
const result = await faceModule.compareFaces(image1, image2);
|
|
223
72
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
});
|
|
73
|
+
console.log(`相似度: ${result.similarity}`);
|
|
74
|
+
console.log(`是否匹配: ${result.isMatch}`);
|
|
227
75
|
```
|
|
228
76
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
### 二维码识别
|
|
232
|
-
|
|
233
|
-
```javascript
|
|
234
|
-
import { IDScanner } from 'id-scanner-lib';
|
|
77
|
+
### 活体检测
|
|
235
78
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
79
|
+
```typescript
|
|
80
|
+
// 被动式活体检测
|
|
81
|
+
const result = await faceModule.detectLiveness(image, {
|
|
82
|
+
type: LivenessDetectionType.PASSIVE,
|
|
83
|
+
onlyLive: true,
|
|
84
|
+
minConfidence: 0.7
|
|
241
85
|
});
|
|
242
86
|
|
|
243
|
-
|
|
244
|
-
|
|
87
|
+
console.log(`是否为真人: ${result.isLive}`);
|
|
88
|
+
console.log(`置信度: ${result.score}`);
|
|
89
|
+
```
|
|
245
90
|
|
|
246
|
-
|
|
247
|
-
const videoElement = document.getElementById('video');
|
|
248
|
-
await scanner.startQRScanner(videoElement);
|
|
91
|
+
### 二维码扫描
|
|
249
92
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
93
|
+
```typescript
|
|
94
|
+
// 创建二维码扫描器
|
|
95
|
+
const qrScanner = IDScanner.createQRScanner({
|
|
96
|
+
scanFrequency: 200,
|
|
97
|
+
formats: ['qrcode', 'code_128', 'code_39', 'ean_13']
|
|
98
|
+
});
|
|
253
99
|
|
|
254
|
-
|
|
100
|
+
// 初始化扫描器
|
|
101
|
+
await qrScanner.init();
|
|
255
102
|
|
|
256
|
-
|
|
257
|
-
|
|
103
|
+
// 启动实时扫描
|
|
104
|
+
await qrScanner.startRealtime(videoElement);
|
|
258
105
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
document.getElementById('name').textContent = info.name;
|
|
263
|
-
document.getElementById('idNumber').textContent = info.idNumber;
|
|
264
|
-
}
|
|
106
|
+
// 处理扫描结果
|
|
107
|
+
qrScanner.on('module:realtime:result', (event) => {
|
|
108
|
+
console.log('扫描结果:', event.result.content);
|
|
265
109
|
});
|
|
110
|
+
```
|
|
266
111
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
112
|
+
## API 文档
|
|
113
|
+
|
|
114
|
+
### 核心类
|
|
115
|
+
|
|
116
|
+
| 类 | 说明 |
|
|
117
|
+
|---|---|
|
|
118
|
+
| `IDScanner` | 主入口类,管理所有模块 |
|
|
119
|
+
| `FaceModule` | 人脸检测、比对、活体检测模块 |
|
|
120
|
+
| `IDCardModule` | 身份证识别模块 |
|
|
121
|
+
| `QRCodeModule` | 二维码扫描模块 |
|
|
122
|
+
|
|
123
|
+
### 工具函数
|
|
124
|
+
|
|
125
|
+
| 函数 | 说明 |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `withRetry()` | 带重试的异步函数包装器 |
|
|
128
|
+
| `AsyncCache` | 异步缓存类 |
|
|
129
|
+
| `Semaphore` | 信号量,并发控制 |
|
|
130
|
+
| `ErrorHandler` | 统一错误处理 |
|
|
131
|
+
| `LoadingStateManager` | 加载状态管理 |
|
|
132
|
+
|
|
133
|
+
### 类型定义
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import type {
|
|
137
|
+
ImageSource,
|
|
138
|
+
Rectangle,
|
|
139
|
+
Point,
|
|
140
|
+
ModuleState,
|
|
141
|
+
BaseResult
|
|
142
|
+
} from 'id-scanner-lib';
|
|
297
143
|
```
|
|
298
144
|
|
|
299
|
-
|
|
145
|
+
## 性能优化
|
|
300
146
|
|
|
301
|
-
|
|
302
|
-
import { IDScanner } from 'id-scanner-lib';
|
|
147
|
+
### 模型懒加载
|
|
303
148
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
document.getElementById('warning').style.display = 'block';
|
|
313
|
-
}
|
|
314
|
-
}
|
|
149
|
+
默认只加载必要的模型,按需加载其他模型:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const faceModule = new FaceModule({
|
|
153
|
+
// 只加载检测模型,不加载表情、年龄等模型
|
|
154
|
+
extractEmbeddings: false,
|
|
155
|
+
detectExpressions: false,
|
|
156
|
+
detectAgeGender: false
|
|
315
157
|
});
|
|
158
|
+
```
|
|
316
159
|
|
|
317
|
-
|
|
160
|
+
### 内存管理
|
|
318
161
|
|
|
319
|
-
|
|
320
|
-
const antiFakeResult = await scanner.detectIDCardAntiFake(idCardImage);
|
|
321
|
-
console.log('防伪检测结果:', antiFakeResult);
|
|
322
|
-
console.log('检测置信度:', antiFakeResult.confidence);
|
|
162
|
+
使用完成后务必释放资源:
|
|
323
163
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
// 提示可能为伪造证件
|
|
331
|
-
}
|
|
164
|
+
```typescript
|
|
165
|
+
// 释放模块
|
|
166
|
+
await faceModule.dispose();
|
|
167
|
+
|
|
168
|
+
// 释放整个库
|
|
169
|
+
await scanner.dispose();
|
|
332
170
|
```
|
|
333
171
|
|
|
334
|
-
|
|
172
|
+
## 浏览器兼容性
|
|
335
173
|
|
|
336
|
-
|
|
337
|
-
|
|
174
|
+
| 浏览器 | 最低版本 |
|
|
175
|
+
|--------|---------|
|
|
176
|
+
| Chrome | 80+ |
|
|
177
|
+
| Firefox | 75+ |
|
|
178
|
+
| Safari | 14+ |
|
|
179
|
+
| Edge | 80+ |
|
|
338
180
|
|
|
339
|
-
|
|
340
|
-
const demo = new IDScannerDemo(
|
|
341
|
-
'video', // 视频元素ID
|
|
342
|
-
'result', // 结果显示元素ID
|
|
343
|
-
'switchButton', // 切换按钮ID
|
|
344
|
-
'imageInput' // 图片输入元素ID
|
|
345
|
-
);
|
|
181
|
+
## 项目结构
|
|
346
182
|
|
|
347
|
-
|
|
183
|
+
```
|
|
184
|
+
src/
|
|
185
|
+
├── core/ # 核心功能
|
|
186
|
+
│ ├── camera-manager.ts # 摄像头管理
|
|
187
|
+
│ ├── config.ts # 配置管理
|
|
188
|
+
│ ├── logger.ts # 日志系统
|
|
189
|
+
│ └── loading-state.ts # 加载状态
|
|
190
|
+
├── modules/ # 功能模块
|
|
191
|
+
│ ├── face/ # 人脸模块
|
|
192
|
+
│ ├── id-card/ # 身份证模块
|
|
193
|
+
│ └── qrcode/ # 二维码模块
|
|
194
|
+
├── utils/ # 工具函数
|
|
195
|
+
│ ├── retry.ts # 重试机制
|
|
196
|
+
│ └── error-handler.ts # 错误处理
|
|
197
|
+
└── types/ # 类型定义
|
|
348
198
|
```
|
|
349
199
|
|
|
350
|
-
##
|
|
200
|
+
## 常见问题
|
|
351
201
|
|
|
352
|
-
|
|
353
|
-
import { ImageProcessor } from 'id-scanner-lib';
|
|
202
|
+
### Q: 模型加载失败怎么办?
|
|
354
203
|
|
|
355
|
-
|
|
356
|
-
const file = document.getElementById('fileInput').files[0];
|
|
357
|
-
const imageData = await ImageProcessor.createImageDataFromFile(file);
|
|
204
|
+
A: 检查网络连接,或使用本地模型:
|
|
358
205
|
|
|
359
|
-
|
|
360
|
-
const
|
|
361
|
-
|
|
362
|
-
contrast: 25, // 提高对比度
|
|
363
|
-
sharpen: true, // 锐化图像
|
|
364
|
-
grayscale: false // 不转换为灰度
|
|
206
|
+
```typescript
|
|
207
|
+
const faceModule = new FaceModule({
|
|
208
|
+
modelPath: '/local/models'
|
|
365
209
|
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Q: 如何处理权限问题?
|
|
213
|
+
|
|
214
|
+
A: 确保页面在 HTTPS 环境下运行,并获取用户授权:
|
|
366
215
|
|
|
367
|
-
|
|
368
|
-
const
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
const canvas = document.getElementById('previewCanvas');
|
|
372
|
-
const ctx = canvas.getContext('2d');
|
|
373
|
-
ctx.putImageData(binaryImage, 0, 0);
|
|
374
|
-
|
|
375
|
-
// 转换为文件并上传
|
|
376
|
-
const processedFile = await ImageProcessor.imageDataToFile(
|
|
377
|
-
enhancedImage,
|
|
378
|
-
'processed.jpg',
|
|
379
|
-
'image/jpeg',
|
|
380
|
-
0.9
|
|
381
|
-
);
|
|
216
|
+
```typescript
|
|
217
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
218
|
+
video: { facingMode: 'user' }
|
|
219
|
+
});
|
|
382
220
|
```
|
|
383
221
|
|
|
384
|
-
|
|
222
|
+
### Q: 如何处理内存泄漏?
|
|
385
223
|
|
|
386
|
-
|
|
224
|
+
A: 确保在使用完毕后释放资源:
|
|
387
225
|
|
|
388
|
-
|
|
226
|
+
```typescript
|
|
227
|
+
// 组件卸载时
|
|
228
|
+
useEffect(() => {
|
|
229
|
+
return () => {
|
|
230
|
+
faceModule?.dispose();
|
|
231
|
+
};
|
|
232
|
+
}, []);
|
|
233
|
+
```
|
|
389
234
|
|
|
390
|
-
|
|
391
|
-
2. **字符集约束**:针对身份证特定字符集进行了优化,提高识别准确度
|
|
392
|
-
3. **多线程处理**:使用Web Worker避免主线程阻塞
|
|
393
|
-
4. **结果缓存**:相同图像指纹不重复计算,提高响应速度
|
|
235
|
+
### Q: 支持哪些图片格式?
|
|
394
236
|
|
|
395
|
-
|
|
237
|
+
A: 支持 JPEG、PNG、WebP 等浏览器常见的图片格式。
|
|
396
238
|
|
|
397
|
-
|
|
239
|
+
## TypeScript 类型
|
|
398
240
|
|
|
399
|
-
|
|
400
|
-
2. **微缩文字**:识别证件上的微小文字,伪造证件难以复制
|
|
401
|
-
3. **光变图案**:检测特定角度下的光变效果
|
|
402
|
-
4. **雕刻凹印**:通过纹理检测特定的凹印模式
|
|
403
|
-
5. **隐形图案**:识别证件上的幽灵图像和隐形水印
|
|
241
|
+
完整类型定义请参考 [types](./src/types/) 目录。
|
|
404
242
|
|
|
405
|
-
|
|
243
|
+
### 核心类型
|
|
406
244
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
- 自适应阈值处理增强识别准确度
|
|
245
|
+
```typescript
|
|
246
|
+
// 图像源
|
|
247
|
+
type ImageSource = HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageData;
|
|
411
248
|
|
|
412
|
-
|
|
249
|
+
// 矩形区域
|
|
250
|
+
interface Rectangle {
|
|
251
|
+
x: number;
|
|
252
|
+
y: number;
|
|
253
|
+
width: number;
|
|
254
|
+
height: number;
|
|
255
|
+
}
|
|
413
256
|
|
|
414
|
-
|
|
257
|
+
// 点坐标
|
|
258
|
+
interface Point {
|
|
259
|
+
x: number;
|
|
260
|
+
y: number;
|
|
261
|
+
}
|
|
415
262
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
- **过度曝光**:自适应调整对比度
|
|
419
|
-
- **特殊角度**:透视校正(开发中)
|
|
263
|
+
// 模块状态
|
|
264
|
+
type ModuleState = 'idle' | 'loading' | 'ready' | 'error' | 'disposed';
|
|
420
265
|
|
|
421
|
-
|
|
266
|
+
// 人脸检测结果
|
|
267
|
+
interface FaceDetectionResult {
|
|
268
|
+
faces: Face[];
|
|
269
|
+
image: ImageData;
|
|
270
|
+
}
|
|
422
271
|
|
|
423
|
-
|
|
272
|
+
// 人脸详情
|
|
273
|
+
interface Face {
|
|
274
|
+
box: Rectangle;
|
|
275
|
+
landmarks: Point[];
|
|
276
|
+
expressions?: Record<string, number>;
|
|
277
|
+
age?: number;
|
|
278
|
+
gender?: string;
|
|
279
|
+
embedding?: number[];
|
|
280
|
+
}
|
|
281
|
+
```
|
|
424
282
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
283
|
+
## 错误处理
|
|
284
|
+
|
|
285
|
+
### 错误类型
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
import { ScannerError, ErrorCode } from 'id-scanner-lib';
|
|
289
|
+
|
|
290
|
+
try {
|
|
291
|
+
await faceModule.initialize();
|
|
292
|
+
} catch (error) {
|
|
293
|
+
if (error instanceof ScannerError) {
|
|
294
|
+
switch (error.code) {
|
|
295
|
+
case ErrorCode.CAMERA_NOT_FOUND:
|
|
296
|
+
// 处理摄像头未找到
|
|
297
|
+
break;
|
|
298
|
+
case ErrorCode.PERMISSION_DENIED:
|
|
299
|
+
// 处理权限被拒绝
|
|
300
|
+
break;
|
|
301
|
+
case ErrorCode.MODEL_LOAD_FAILED:
|
|
302
|
+
// 处理模型加载失败
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
434
308
|
|
|
435
|
-
|
|
309
|
+
### 错误代码
|
|
436
310
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
311
|
+
| 代码 | 说明 |
|
|
312
|
+
|------|------|
|
|
313
|
+
| `CAMERA_NOT_FOUND` | 摄像头未找到 |
|
|
314
|
+
| `PERMISSION_DENIED` | 权限被拒绝 |
|
|
315
|
+
| `MODEL_LOAD_FAILED` | 模型加载失败 |
|
|
316
|
+
| `INITIALIZATION_FAILED` | 初始化失败 |
|
|
317
|
+
| `PROCESSING_FAILED` | 处理失败 |
|
|
318
|
+
| `DISPOSED` | 模块已释放 |
|
|
442
319
|
|
|
443
|
-
##
|
|
320
|
+
## 性能调优
|
|
444
321
|
|
|
445
|
-
|
|
446
|
-
- **酒店登记系统**:自动录入住客信息并验证证件真伪
|
|
447
|
-
- **自助服务终端**:无需人工,自动处理证件信息
|
|
448
|
-
- **企业内部系统**:员工证件信息采集与验证
|
|
449
|
-
- **活动签到系统**:快速扫码签到与证件登记
|
|
322
|
+
### 1. 调整检测频率
|
|
450
323
|
|
|
451
|
-
|
|
324
|
+
```typescript
|
|
325
|
+
const faceModule = new FaceModule({
|
|
326
|
+
// 降低检测频率以提升性能
|
|
327
|
+
detectionFrequency: 100, // ms
|
|
328
|
+
});
|
|
329
|
+
```
|
|
452
330
|
|
|
453
|
-
###
|
|
331
|
+
### 2. 缩小检测区域
|
|
454
332
|
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
|
|
333
|
+
```typescript
|
|
334
|
+
const faceModule = new FaceModule({
|
|
335
|
+
// 只检测画面中心区域
|
|
336
|
+
detectionRegion: {
|
|
337
|
+
x: 0.25,
|
|
338
|
+
y: 0.25,
|
|
339
|
+
width: 0.5,
|
|
340
|
+
height: 0.5
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
```
|
|
458
344
|
|
|
459
|
-
|
|
460
|
-
npm run build:prod
|
|
345
|
+
### 3. 使用 Web Worker
|
|
461
346
|
|
|
462
|
-
|
|
463
|
-
|
|
347
|
+
```typescript
|
|
348
|
+
// 身份证识别使用 Web Worker,不阻塞主线程
|
|
349
|
+
const idCardModule = new IDCardModule({
|
|
350
|
+
useWorker: true
|
|
351
|
+
});
|
|
352
|
+
```
|
|
464
353
|
|
|
465
|
-
|
|
466
|
-
|
|
354
|
+
### 4. 模型选择
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
const faceModule = new FaceModule({
|
|
358
|
+
// 使用轻量级模型
|
|
359
|
+
modelType: 'tiny',
|
|
360
|
+
// 或者使用完整模型(更准确但更慢)
|
|
361
|
+
// modelType: 'full'
|
|
362
|
+
});
|
|
467
363
|
```
|
|
468
364
|
|
|
469
|
-
|
|
365
|
+
## 浏览器兼容性
|
|
470
366
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
367
|
+
| 浏览器 | 最低版本 | 支持情况 |
|
|
368
|
+
|--------|---------|---------|
|
|
369
|
+
| Chrome | 80+ | ✅ 完全支持 |
|
|
370
|
+
| Firefox | 75+ | ✅ 完全支持 |
|
|
371
|
+
| Safari | 14+ | ✅ 完全支持 |
|
|
372
|
+
| Edge | 80+ | ✅ 完全支持 |
|
|
373
|
+
| iOS Safari | 14+ | ✅ 完全支持 |
|
|
374
|
+
| Android Chrome | 80+ | ✅ 完全支持 |
|
|
375
|
+
|
|
376
|
+
### Polyfill
|
|
377
|
+
|
|
378
|
+
如需支持旧版浏览器,请添加以下 polyfill:
|
|
475
379
|
|
|
476
|
-
|
|
477
|
-
|
|
380
|
+
```html
|
|
381
|
+
<script src="https://polyfill.io/v3/polyfill.min.js"></script>
|
|
382
|
+
```
|
|
478
383
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
384
|
+
## 项目结构
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
src/
|
|
388
|
+
├── core/ # 核心功能
|
|
389
|
+
│ ├── camera-manager.ts # 摄像头管理
|
|
390
|
+
│ ├── config.ts # 配置管理
|
|
391
|
+
│ ├── logger.ts # 日志系统
|
|
392
|
+
│ └── loading-state.ts # 加载状态
|
|
393
|
+
├── modules/ # 功能模块
|
|
394
|
+
│ ├── face/ # 人脸模块
|
|
395
|
+
│ ├── id-card/ # 身份证模块
|
|
396
|
+
│ └── qrcode/ # 二维码模块
|
|
397
|
+
├── utils/ # 工具函数
|
|
398
|
+
│ ├── retry.ts # 重试机制
|
|
399
|
+
│ └── error-handler.ts # 错误处理
|
|
400
|
+
└── types/ # 类型定义
|
|
482
401
|
```
|
|
483
402
|
|
|
484
403
|
## 贡献指南
|
|
485
404
|
|
|
486
|
-
|
|
405
|
+
欢迎提交 Issue 和 Pull Request!
|
|
487
406
|
|
|
488
|
-
1. Fork
|
|
489
|
-
2.
|
|
490
|
-
3.
|
|
491
|
-
4.
|
|
492
|
-
5.
|
|
407
|
+
1. Fork 本仓库
|
|
408
|
+
2. 创建特性分支 (`git checkout -b feature/xxx`)
|
|
409
|
+
3. 提交更改 (`git commit -m 'Add xxx'`)
|
|
410
|
+
4. 推送分支 (`git push origin feature/xxx`)
|
|
411
|
+
5. 创建 Pull Request
|
|
493
412
|
|
|
494
413
|
## 许可证
|
|
495
414
|
|
|
496
|
-
|
|
415
|
+
MIT License
|
|
497
416
|
|
|
498
|
-
|
|
417
|
+
## 更新日志
|
|
499
418
|
|
|
500
|
-
|
|
501
|
-
<a href="https://github.com/agions/id-scanner-lib">GitHub</a> •
|
|
502
|
-
<a href="https://www.npmjs.com/package/id-scanner-lib">NPM</a> •
|
|
503
|
-
<a href="https://github.com/agions/id-scanner-lib/issues">Issues</a> •
|
|
504
|
-
<a href="https://github.com/agions/id-scanner-lib/releases">Releases</a>
|
|
505
|
-
</p>
|
|
419
|
+
See [CHANGELOG](./CHANGELOG.md)
|