id-scanner-lib 1.2.2 → 1.3.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/LICENSE +1 -1
- package/README.md +375 -363
- package/dist/id-scanner-core.esm.js +427 -221
- package/dist/id-scanner-core.esm.js.map +1 -1
- package/dist/id-scanner-core.js +427 -221
- package/dist/id-scanner-core.js.map +1 -1
- package/dist/id-scanner-core.min.js +1 -9
- package/dist/id-scanner-core.min.js.map +1 -1
- package/dist/id-scanner-ocr.esm.js +451 -276
- package/dist/id-scanner-ocr.esm.js.map +1 -1
- package/dist/id-scanner-ocr.js +451 -276
- package/dist/id-scanner-ocr.js.map +1 -1
- package/dist/id-scanner-ocr.min.js +1 -9
- package/dist/id-scanner-ocr.min.js.map +1 -1
- package/dist/id-scanner-qr.esm.js +483 -233
- package/dist/id-scanner-qr.esm.js.map +1 -1
- package/dist/id-scanner-qr.js +482 -232
- package/dist/id-scanner-qr.js.map +1 -1
- package/dist/id-scanner-qr.min.js +1 -9
- package/dist/id-scanner-qr.min.js.map +1 -1
- package/dist/id-scanner.js +2138 -358
- package/dist/id-scanner.js.map +1 -1
- package/dist/id-scanner.min.js +1 -9
- package/dist/id-scanner.min.js.map +1 -1
- package/package.json +27 -7
- package/src/demo/demo.ts +178 -62
- package/src/id-recognition/anti-fake-detector.ts +317 -0
- package/src/id-recognition/id-detector.ts +184 -155
- package/src/id-recognition/ocr-processor.ts +193 -146
- package/src/id-recognition/ocr-worker.ts +82 -72
- package/src/index-umd.ts +347 -110
- package/src/index.ts +866 -91
- package/src/ocr-module.ts +108 -60
- package/src/qr-module.ts +104 -54
- package/src/scanner/barcode-scanner.ts +145 -58
- package/src/scanner/qr-scanner.ts +86 -47
- package/src/utils/image-processing.ts +479 -294
- package/dist/core.d.ts +0 -77
- package/dist/demo/demo.d.ts +0 -14
- package/dist/id-recognition/data-extractor.d.ts +0 -105
- package/dist/id-recognition/id-detector.d.ts +0 -100
- package/dist/id-recognition/ocr-processor.d.ts +0 -64
- package/dist/id-scanner.esm.js +0 -94656
- package/dist/id-scanner.esm.js.map +0 -1
- package/dist/index-umd.d.ts +0 -96
- package/dist/index.d.ts +0 -78
- package/dist/ocr-module.d.ts +0 -67
- package/dist/qr-module.d.ts +0 -68
- package/dist/scanner/barcode-scanner.d.ts +0 -90
- package/dist/scanner/qr-scanner.d.ts +0 -80
- package/dist/types/core.d.ts +0 -77
- package/dist/types/demo/demo.d.ts +0 -14
- package/dist/types/id-recognition/data-extractor.d.ts +0 -105
- package/dist/types/id-recognition/id-detector.d.ts +0 -100
- package/dist/types/id-recognition/ocr-processor.d.ts +0 -64
- package/dist/types/index-umd.d.ts +0 -96
- package/dist/types/index.d.ts +0 -78
- package/dist/types/ocr-module.d.ts +0 -67
- package/dist/types/qr-module.d.ts +0 -68
- package/dist/types/scanner/barcode-scanner.d.ts +0 -90
- package/dist/types/scanner/qr-scanner.d.ts +0 -80
- package/dist/types/utils/camera.d.ts +0 -81
- package/dist/types/utils/image-processing.d.ts +0 -75
- package/dist/types/utils/types.d.ts +0 -65
- package/dist/utils/camera.d.ts +0 -81
- package/dist/utils/image-processing.d.ts +0 -75
- package/dist/utils/types.d.ts +0 -65
package/README.md
CHANGED
|
@@ -1,60 +1,224 @@
|
|
|
1
1
|
# ID-Scanner-Lib
|
|
2
2
|
|
|
3
|
-
纯前端实现的TypeScript
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
+
- 完整审计日志
|
|
12
149
|
|
|
13
150
|
## 系统架构
|
|
14
151
|
|
|
15
152
|
```
|
|
16
|
-
|
|
17
|
-
│ IDScanner
|
|
153
|
+
┌────────────────────────────────────────────────────────────┐
|
|
154
|
+
│ IDScanner 主模块 │
|
|
18
155
|
├─────────────┬─────────────────┬────────────────────────────┤
|
|
19
156
|
│ QRScanner │ BarcodeScanner │ IDCardDetector │
|
|
20
157
|
├─────────────┴─────────────────┴────────────────────────────┤
|
|
21
|
-
│ Camera (视频流捕获与处理)
|
|
22
|
-
|
|
158
|
+
│ Camera (视频流捕获与处理) │
|
|
159
|
+
└────────────────────────────────────────────────────────────┘
|
|
23
160
|
▲
|
|
24
161
|
│
|
|
25
162
|
▼
|
|
26
|
-
|
|
27
|
-
│
|
|
163
|
+
┌────────────────────────────────────────────────────────────┐
|
|
164
|
+
│ 核心处理引擎 │
|
|
28
165
|
├─────────────────┬─────────────────┬────────────────────────┤
|
|
29
166
|
│ OCRProcessor │ DataExtractor │ ImageProcessor │
|
|
30
|
-
│ (文字识别) │ (数据提取验证)
|
|
31
|
-
|
|
167
|
+
│ (文字识别) │ (数据提取验证) │ (图像预处理) │
|
|
168
|
+
├─────────────────┴─────────────────┴────────────────────────┤
|
|
169
|
+
│ AntiFakeDetector (身份证防伪检测) │
|
|
170
|
+
└────────────────────────────────────────────────────────────┘
|
|
32
171
|
```
|
|
33
172
|
|
|
34
|
-
##
|
|
173
|
+
## 安装与使用
|
|
174
|
+
|
|
175
|
+
### NPM安装
|
|
35
176
|
|
|
36
177
|
```bash
|
|
37
|
-
npm install id-scanner-lib
|
|
178
|
+
npm install id-scanner-lib --save
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### CDN引入
|
|
182
|
+
|
|
183
|
+
```html
|
|
184
|
+
<!-- 生产环境 (压缩版) -->
|
|
185
|
+
<script src="https://cdn.jsdelivr.net/npm/id-scanner-lib@1.3.1/dist/id-scanner.min.js"></script>
|
|
186
|
+
|
|
187
|
+
<!-- 开发环境 (未压缩) -->
|
|
188
|
+
<script src="https://cdn.jsdelivr.net/npm/id-scanner-lib@1.3.1/dist/id-scanner.js"></script>
|
|
38
189
|
```
|
|
39
190
|
|
|
40
|
-
##
|
|
191
|
+
## 包体积优化
|
|
41
192
|
|
|
42
|
-
|
|
193
|
+
v1.3.1版本通过代码分割和Tree-shaking极大地优化了包体积:
|
|
194
|
+
|
|
195
|
+
| 模块 | 大小 (gzip) | 说明 |
|
|
196
|
+
| --------------- | ----------- | ---------------- |
|
|
197
|
+
| 完整包(min.js) | 93KB | 包含所有功能 |
|
|
198
|
+
| 核心包(min.js) | 186KB | 基础功能,无OCR |
|
|
199
|
+
| OCR模块(min.js) | 70KB | 仅文字识别 |
|
|
200
|
+
| QR模块(min.js) | 60KB | 仅二维码识别 |
|
|
201
|
+
| ESM模块 | 各模块更小 | 支持Tree-shaking |
|
|
202
|
+
|
|
203
|
+
## 最佳实践:按需引入
|
|
43
204
|
|
|
44
205
|
### 完整引入
|
|
206
|
+
|
|
45
207
|
```javascript
|
|
46
|
-
//
|
|
208
|
+
// 引入完整功能
|
|
47
209
|
import { IDScanner } from 'id-scanner-lib';
|
|
48
210
|
|
|
49
211
|
const scanner = new IDScanner({
|
|
50
212
|
onQRCodeScanned: (result) => console.log('扫描结果:', result),
|
|
51
|
-
onIDCardScanned: (info) => console.log('身份证信息:', info)
|
|
213
|
+
onIDCardScanned: (info) => console.log('身份证信息:', info),
|
|
214
|
+
onAntiFakeDetected: (result) => console.log('防伪检测结果:', result)
|
|
52
215
|
});
|
|
53
216
|
```
|
|
54
217
|
|
|
55
|
-
###
|
|
218
|
+
### 轻量引入
|
|
219
|
+
|
|
56
220
|
```javascript
|
|
57
|
-
//
|
|
221
|
+
// 只引入二维码相关功能
|
|
58
222
|
import { ScannerModule } from 'id-scanner-lib/qr';
|
|
59
223
|
|
|
60
224
|
const qrScanner = new ScannerModule({
|
|
@@ -62,432 +226,280 @@ const qrScanner = new ScannerModule({
|
|
|
62
226
|
});
|
|
63
227
|
```
|
|
64
228
|
|
|
65
|
-
```javascript
|
|
66
|
-
// 只引入OCR身份证识别功能
|
|
67
|
-
import { OCRModule } from 'id-scanner-lib/ocr';
|
|
68
|
-
|
|
69
|
-
const ocrScanner = new OCRModule({
|
|
70
|
-
onIDCardScanned: (info) => console.log('身份证信息:', info)
|
|
71
|
-
});
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
```javascript
|
|
75
|
-
// 只引入轻量核心功能(无OCR)
|
|
76
|
-
import { IDScannerCore } from 'id-scanner-lib/core';
|
|
77
|
-
|
|
78
|
-
const coreScanner = new IDScannerCore({
|
|
79
|
-
onQRCodeScanned: (result) => console.log('扫描结果:', result)
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
229
|
## 快速开始
|
|
84
230
|
|
|
85
|
-
###
|
|
231
|
+
### 二维码识别
|
|
86
232
|
|
|
87
233
|
```javascript
|
|
88
234
|
import { IDScanner } from 'id-scanner-lib';
|
|
89
235
|
|
|
90
236
|
// 创建扫描器实例
|
|
91
237
|
const scanner = new IDScanner({
|
|
92
|
-
// 二维码识别回调
|
|
93
238
|
onQRCodeScanned: (result) => {
|
|
94
239
|
console.log('扫描到二维码:', result);
|
|
95
|
-
},
|
|
96
|
-
|
|
97
|
-
// 条形码识别回调
|
|
98
|
-
onBarcodeScanned: (result) => {
|
|
99
|
-
console.log('扫描到条形码:', result);
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
// 身份证识别回调
|
|
103
|
-
onIDCardScanned: (info) => {
|
|
104
|
-
console.log('识别到身份证信息:', info);
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
// 错误处理
|
|
108
|
-
onError: (error) => {
|
|
109
|
-
console.error('扫描出错:', error);
|
|
110
240
|
}
|
|
111
241
|
});
|
|
112
242
|
|
|
113
243
|
// 初始化
|
|
114
244
|
await scanner.initialize();
|
|
115
245
|
|
|
116
|
-
//
|
|
246
|
+
// 启动扫描
|
|
117
247
|
const videoElement = document.getElementById('video');
|
|
118
248
|
await scanner.startQRScanner(videoElement);
|
|
119
249
|
|
|
120
|
-
//
|
|
121
|
-
scanner.
|
|
122
|
-
await scanner.startIDCardScanner(videoElement);
|
|
123
|
-
|
|
124
|
-
// 使用结束后释放资源
|
|
125
|
-
scanner.terminate();
|
|
250
|
+
// 处理静态图片
|
|
251
|
+
const qrResult = await scanner.processQRCodeImage('https://example.com/qr.jpg');
|
|
126
252
|
```
|
|
127
253
|
|
|
128
|
-
###
|
|
129
|
-
|
|
130
|
-
查看 `examples/index.html` 获取完整的演示代码。
|
|
131
|
-
|
|
132
|
-
## 详细API文档
|
|
133
|
-
|
|
134
|
-
### IDScanner 主类
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
class IDScanner {
|
|
138
|
-
// 构造函数
|
|
139
|
-
constructor(options?: IDScannerOptions);
|
|
140
|
-
|
|
141
|
-
// 初始化OCR引擎和资源
|
|
142
|
-
async initialize(): Promise<void>;
|
|
143
|
-
|
|
144
|
-
// 启动二维码扫描
|
|
145
|
-
async startQRScanner(videoElement: HTMLVideoElement): Promise<void>;
|
|
146
|
-
|
|
147
|
-
// 启动条形码扫描
|
|
148
|
-
async startBarcodeScanner(videoElement: HTMLVideoElement): Promise<void>;
|
|
149
|
-
|
|
150
|
-
// 启动身份证扫描
|
|
151
|
-
async startIDCardScanner(videoElement: HTMLVideoElement): Promise<void>;
|
|
152
|
-
|
|
153
|
-
// 停止当前扫描
|
|
154
|
-
stop(): void;
|
|
155
|
-
|
|
156
|
-
// 释放所有资源
|
|
157
|
-
async terminate(): Promise<void>;
|
|
158
|
-
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### 类型定义
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
// IDScanner配置选项
|
|
165
|
-
interface IDScannerOptions {
|
|
166
|
-
// 相机配置
|
|
167
|
-
cameraOptions?: CameraOptions;
|
|
168
|
-
// 二维码扫描配置
|
|
169
|
-
qrScannerOptions?: QRScannerOptions;
|
|
170
|
-
// 条形码扫描配置
|
|
171
|
-
barcodeScannerOptions?: BarcodeScannerOptions;
|
|
172
|
-
// 二维码识别回调
|
|
173
|
-
onQRCodeScanned?: (result: string) => void;
|
|
174
|
-
// 条形码识别回调
|
|
175
|
-
onBarcodeScanned?: (result: string) => void;
|
|
176
|
-
// 身份证识别回调
|
|
177
|
-
onIDCardScanned?: (info: IDCardInfo) => void;
|
|
178
|
-
// 错误处理回调
|
|
179
|
-
onError?: (error: Error) => void;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// 相机配置选项
|
|
183
|
-
interface CameraOptions {
|
|
184
|
-
width?: number; // 视频宽度
|
|
185
|
-
height?: number; // 视频高度
|
|
186
|
-
facingMode?: 'user' | 'environment'; // 前置或后置摄像头
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// 识别结果的身份证信息
|
|
190
|
-
interface IDCardInfo {
|
|
191
|
-
name?: string; // 姓名
|
|
192
|
-
gender?: string; // 性别
|
|
193
|
-
nationality?: string; // 民族
|
|
194
|
-
birthDate?: string; // 出生日期,如"1990-01-01"
|
|
195
|
-
address?: string; // 地址
|
|
196
|
-
idNumber?: string; // 身份证号码
|
|
197
|
-
issuingAuthority?: string; // 签发机关
|
|
198
|
-
validPeriod?: string; // 有效期限
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## 高级用法
|
|
203
|
-
|
|
204
|
-
### 自定义相机配置
|
|
254
|
+
### 身份证识别
|
|
205
255
|
|
|
206
256
|
```javascript
|
|
257
|
+
import { IDScanner } from 'id-scanner-lib';
|
|
258
|
+
|
|
207
259
|
const scanner = new IDScanner({
|
|
208
|
-
cameraOptions: {
|
|
209
|
-
width: 1280,
|
|
210
|
-
height: 720,
|
|
211
|
-
facingMode: 'environment' // 使用后置摄像头,更适合扫描
|
|
212
|
-
},
|
|
213
260
|
onIDCardScanned: (info) => {
|
|
214
261
|
console.log('识别到身份证信息:', info);
|
|
262
|
+
document.getElementById('name').textContent = info.name;
|
|
263
|
+
document.getElementById('idNumber').textContent = info.idNumber;
|
|
215
264
|
}
|
|
216
265
|
});
|
|
217
|
-
```
|
|
218
266
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
267
|
+
await scanner.initialize();
|
|
268
|
+
await scanner.startIDCardScanner(document.getElementById('camera'));
|
|
269
|
+
|
|
270
|
+
// 使用文件输入处理
|
|
271
|
+
document.getElementById('fileInput').addEventListener('change', async (e) => {
|
|
272
|
+
const file = e.target.files[0];
|
|
273
|
+
try {
|
|
274
|
+
// 先压缩图片提高处理速度
|
|
275
|
+
const compressed = await scanner.compressImage(file, {
|
|
276
|
+
maxSizeMB: 1,
|
|
277
|
+
maxWidthOrHeight: 1920
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// 处理身份证图像
|
|
281
|
+
const idInfo = await scanner.processIDCardImage(compressed);
|
|
282
|
+
console.log('身份证信息:', idInfo);
|
|
283
|
+
|
|
284
|
+
// 检查防伪检测结果
|
|
285
|
+
if (idInfo.antiFakeResult) {
|
|
286
|
+
console.log('防伪检测结果:', idInfo.antiFakeResult);
|
|
287
|
+
if (idInfo.antiFakeResult.isAuthentic) {
|
|
288
|
+
console.log('证件验证通过');
|
|
289
|
+
} else {
|
|
290
|
+
console.log('警告:可能为伪造证件');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
} catch (error) {
|
|
294
|
+
console.error('处理失败:', error);
|
|
228
295
|
}
|
|
229
296
|
});
|
|
230
297
|
```
|
|
231
298
|
|
|
232
|
-
###
|
|
299
|
+
### 身份证防伪检测
|
|
233
300
|
|
|
234
301
|
```javascript
|
|
235
|
-
import {
|
|
302
|
+
import { IDScanner } from 'id-scanner-lib';
|
|
236
303
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
304
|
+
const scanner = new IDScanner({
|
|
305
|
+
// 防伪检测结果回调
|
|
306
|
+
onAntiFakeDetected: (result) => {
|
|
307
|
+
if (result.isAuthentic) {
|
|
308
|
+
console.log('身份证验证通过,检测到的防伪特征:', result.detectedFeatures);
|
|
309
|
+
} else {
|
|
310
|
+
console.log('警告:可能是伪造证件!', result.message);
|
|
311
|
+
// 显示安全提示
|
|
312
|
+
document.getElementById('warning').style.display = 'block';
|
|
313
|
+
}
|
|
241
314
|
}
|
|
242
315
|
});
|
|
243
316
|
|
|
244
|
-
|
|
245
|
-
const enhancedImage = ImageProcessor.adjustBrightnessContrast(
|
|
246
|
-
originalImageData,
|
|
247
|
-
10, // 亮度调整
|
|
248
|
-
20 // 对比度调整
|
|
249
|
-
);
|
|
250
|
-
```
|
|
317
|
+
await scanner.initialize();
|
|
251
318
|
|
|
252
|
-
|
|
319
|
+
// 方法1:单独进行防伪检测
|
|
320
|
+
const antiFakeResult = await scanner.detectIDCardAntiFake(idCardImage);
|
|
321
|
+
console.log('防伪检测结果:', antiFakeResult);
|
|
322
|
+
console.log('检测置信度:', antiFakeResult.confidence);
|
|
323
|
+
|
|
324
|
+
// 方法2:身份证识别时自动进行防伪检测
|
|
325
|
+
const idInfo = await scanner.processIDCardImage(idCardImage);
|
|
326
|
+
// 防伪检测结果包含在返回的信息中
|
|
327
|
+
if (idInfo.antiFakeResult && idInfo.antiFakeResult.isAuthentic) {
|
|
328
|
+
// 身份证真实,继续处理
|
|
329
|
+
} else {
|
|
330
|
+
// 提示可能为伪造证件
|
|
331
|
+
}
|
|
332
|
+
```
|
|
253
333
|
|
|
254
|
-
|
|
334
|
+
### 使用内置演示组件
|
|
255
335
|
|
|
256
336
|
```javascript
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
//
|
|
263
|
-
|
|
264
|
-
|
|
337
|
+
import { IDScannerDemo } from 'id-scanner-lib';
|
|
338
|
+
|
|
339
|
+
// 快速创建完整功能演示
|
|
340
|
+
const demo = new IDScannerDemo(
|
|
341
|
+
'video', // 视频元素ID
|
|
342
|
+
'result', // 结果显示元素ID
|
|
343
|
+
'switchButton', // 切换按钮ID
|
|
344
|
+
'imageInput' // 图片输入元素ID
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
await demo.initialize();
|
|
265
348
|
```
|
|
266
349
|
|
|
267
|
-
|
|
350
|
+
## 高级图像处理
|
|
268
351
|
|
|
269
352
|
```javascript
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
353
|
+
import { ImageProcessor } from 'id-scanner-lib';
|
|
354
|
+
|
|
355
|
+
// 从文件创建ImageData
|
|
356
|
+
const file = document.getElementById('fileInput').files[0];
|
|
357
|
+
const imageData = await ImageProcessor.createImageDataFromFile(file);
|
|
358
|
+
|
|
359
|
+
// 批量图像处理
|
|
360
|
+
const enhancedImage = ImageProcessor.batchProcess(imageData, {
|
|
361
|
+
brightness: 15, // 增加亮度
|
|
362
|
+
contrast: 25, // 提高对比度
|
|
363
|
+
sharpen: true, // 锐化图像
|
|
364
|
+
grayscale: false // 不转换为灰度
|
|
275
365
|
});
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
3. **关闭不必要的扫描**:不使用时及时停止扫描,节省资源。
|
|
279
|
-
|
|
280
|
-
## 高级性能优化
|
|
281
366
|
|
|
282
|
-
|
|
367
|
+
// 二值化处理
|
|
368
|
+
const binaryImage = ImageProcessor.toBinaryImage(enhancedImage);
|
|
283
369
|
|
|
284
|
-
|
|
370
|
+
// 显示处理结果
|
|
371
|
+
const canvas = document.getElementById('previewCanvas');
|
|
372
|
+
const ctx = canvas.getContext('2d');
|
|
373
|
+
ctx.putImageData(binaryImage, 0, 0);
|
|
285
374
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
// 初始化会在后台线程创建OCR处理能力
|
|
295
|
-
await ocrProcessor.initialize();
|
|
375
|
+
// 转换为文件并上传
|
|
376
|
+
const processedFile = await ImageProcessor.imageDataToFile(
|
|
377
|
+
enhancedImage,
|
|
378
|
+
'processed.jpg',
|
|
379
|
+
'image/jpeg',
|
|
380
|
+
0.9
|
|
381
|
+
);
|
|
296
382
|
```
|
|
297
383
|
|
|
298
|
-
|
|
384
|
+
## 技术实现细节
|
|
299
385
|
|
|
300
|
-
|
|
386
|
+
### OCR引擎优化
|
|
301
387
|
|
|
302
|
-
|
|
303
|
-
// 所有核心类都实现了Disposable接口
|
|
304
|
-
// 可以通过ResourceManager统一管理
|
|
305
|
-
import { ResourceManager } from 'id-scanner-lib/core';
|
|
388
|
+
OCR引擎基于Tesseract.js进行了一系列优化:
|
|
306
389
|
|
|
307
|
-
|
|
308
|
-
|
|
390
|
+
1. **预处理流水线**:图像经过多阶段处理,包括大小调整、增强对比度、锐化等
|
|
391
|
+
2. **字符集约束**:针对身份证特定字符集进行了优化,提高识别准确度
|
|
392
|
+
3. **多线程处理**:使用Web Worker避免主线程阻塞
|
|
393
|
+
4. **结果缓存**:相同图像指纹不重复计算,提高响应速度
|
|
309
394
|
|
|
310
|
-
|
|
311
|
-
// 也可以手动释放
|
|
312
|
-
await resourceManager.dispose('scanner');
|
|
313
|
-
```
|
|
395
|
+
### 身份证防伪检测技术
|
|
314
396
|
|
|
315
|
-
|
|
397
|
+
防伪检测模块能识别身份证中的多种防伪特征:
|
|
316
398
|
|
|
317
|
-
|
|
399
|
+
1. **荧光油墨特征**:检测特定区域的荧光反应模式
|
|
400
|
+
2. **微缩文字**:识别证件上的微小文字,伪造证件难以复制
|
|
401
|
+
3. **光变图案**:检测特定角度下的光变效果
|
|
402
|
+
4. **雕刻凹印**:通过纹理检测特定的凹印模式
|
|
403
|
+
5. **隐形图案**:识别证件上的幽灵图像和隐形水印
|
|
318
404
|
|
|
319
|
-
|
|
320
|
-
// 可以配置最大图像尺寸
|
|
321
|
-
const ocrProcessor = new OCRProcessor({
|
|
322
|
-
maxImageDimension: 1000 // 设置图像处理的最大尺寸
|
|
323
|
-
});
|
|
405
|
+
算法结合多种图像处理技术:
|
|
324
406
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
407
|
+
- 特定光谱通道提取与分析
|
|
408
|
+
- 边缘检测与微文字模式识别
|
|
409
|
+
- 对比度与光照调整突出隐形特征
|
|
410
|
+
- 自适应阈值处理增强识别准确度
|
|
328
411
|
|
|
329
|
-
###
|
|
412
|
+
### 图像增强算法
|
|
330
413
|
|
|
331
|
-
|
|
414
|
+
针对不同场景提供最佳图像处理策略:
|
|
332
415
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
});
|
|
338
|
-
```
|
|
416
|
+
- **弱光环境**:自动提高亮度和对比度
|
|
417
|
+
- **模糊图像**:应用锐化算法提高清晰度
|
|
418
|
+
- **过度曝光**:自适应调整对比度
|
|
419
|
+
- **特殊角度**:透视校正(开发中)
|
|
339
420
|
|
|
340
|
-
|
|
421
|
+
## 浏览器兼容性
|
|
341
422
|
|
|
342
|
-
|
|
423
|
+
完整支持所有现代浏览器:
|
|
343
424
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
425
|
+
| 浏览器 | 最低版本 | 功能限制 |
|
|
426
|
+
| -------------- | -------- | --------------------------- |
|
|
427
|
+
| Chrome | 60+ | 完整支持 |
|
|
428
|
+
| Firefox | 55+ | 完整支持 |
|
|
429
|
+
| Safari | 11+ | 完整支持 |
|
|
430
|
+
| Edge | 79+ | 完整支持 |
|
|
431
|
+
| iOS Safari | 11+ | 仅支持Safari,不支持WebView |
|
|
432
|
+
| Android Chrome | 60+ | 完整支持 |
|
|
433
|
+
| 微信浏览器 | 最新版 | 仅支持静态图像处理 |
|
|
350
434
|
|
|
351
|
-
|
|
352
|
-
ocrProcessor.clearCache();
|
|
353
|
-
```
|
|
435
|
+
## 性能优化建议
|
|
354
436
|
|
|
355
|
-
|
|
437
|
+
1. **按需加载**:仅引入所需模块,减少首次加载时间
|
|
438
|
+
2. **预加载模型**:提前加载OCR模型,避免首次识别延迟
|
|
439
|
+
3. **适当降低分辨率**:处理前将图像缩小到合适尺寸(约1000px宽)
|
|
440
|
+
4. **开启缓存**:对于相似图像,启用结果缓存
|
|
441
|
+
5. **使用Web Worker**:处理大量图像时开启多线程
|
|
356
442
|
|
|
357
|
-
##
|
|
443
|
+
## 应用场景
|
|
358
444
|
|
|
359
|
-
|
|
445
|
+
- **网上银行身份验证**:快速验证用户身份信息,检测伪造证件
|
|
446
|
+
- **酒店登记系统**:自动录入住客信息并验证证件真伪
|
|
447
|
+
- **自助服务终端**:无需人工,自动处理证件信息
|
|
448
|
+
- **企业内部系统**:员工证件信息采集与验证
|
|
449
|
+
- **活动签到系统**:快速扫码签到与证件登记
|
|
360
450
|
|
|
361
|
-
|
|
451
|
+
## 发布指南
|
|
362
452
|
|
|
363
|
-
|
|
453
|
+
### 发布到NPM
|
|
364
454
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
- 保持身份证平整,避免弯曲
|
|
369
|
-
- 尝试增强图像对比度:`ImageProcessor.adjustBrightnessContrast()`
|
|
455
|
+
```bash
|
|
456
|
+
# 1. 确保版本号正确
|
|
457
|
+
npm version [patch|minor|major]
|
|
370
458
|
|
|
371
|
-
|
|
459
|
+
# 2. 构建生产版本
|
|
460
|
+
npm run build:prod
|
|
372
461
|
|
|
373
|
-
|
|
462
|
+
# 3. 发布到NPM
|
|
463
|
+
npm publish
|
|
374
464
|
|
|
375
|
-
|
|
465
|
+
# 4. 生成标签
|
|
466
|
+
git push origin --tags
|
|
467
|
+
```
|
|
376
468
|
|
|
377
|
-
|
|
378
|
-
|--------------|---------------------|--------------------------|
|
|
379
|
-
| Chrome | 60+ | 全功能支持 |
|
|
380
|
-
| Firefox | 55+ | 全功能支持 |
|
|
381
|
-
| Edge | 79+ (Chromium) | 全功能支持 |
|
|
382
|
-
| Safari | 11+ | iOS需要用户主动点击激活相机 |
|
|
383
|
-
| 安卓WebView | 60+ | 需要应用授予相机权限 |
|
|
384
|
-
| iOS WebView | 11+ | 需要用户主动点击激活相机 |
|
|
385
|
-
|
|
386
|
-
## 体积优化与性能优化
|
|
387
|
-
|
|
388
|
-
本库设计时考虑了多种使用场景和设备性能限制,提供了多种优化选项:
|
|
389
|
-
|
|
390
|
-
### 包体积优化
|
|
391
|
-
1. **按需引入模块**:基于ES模块可以实现tree-shaking,只引入需要的功能,如:
|
|
392
|
-
```javascript
|
|
393
|
-
// 只需要二维码功能时,包体积减小约65%
|
|
394
|
-
import { ScannerModule } from 'id-scanner-lib/qr';
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
2. **延迟加载OCR引擎**:OCR引擎体积较大,默认采用延迟加载策略:
|
|
398
|
-
```javascript
|
|
399
|
-
// OCR引擎只在实际使用身份证识别功能时才会加载
|
|
400
|
-
const scanner = new IDScanner();
|
|
401
|
-
|
|
402
|
-
// 这一步不会加载OCR引擎
|
|
403
|
-
await scanner.startQRScanner(videoElement);
|
|
404
|
-
|
|
405
|
-
// 只有在需要识别身份证时才会加载OCR引擎
|
|
406
|
-
await scanner.startIDCardScanner(videoElement);
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
3. **分包构建**:完整库约1MB,但按功能拆分后最小可达200KB:
|
|
410
|
-
- 核心包 (无OCR): 约200KB
|
|
411
|
-
- 二维码扫描: 约350KB
|
|
412
|
-
- OCR模块: 约650KB
|
|
413
|
-
|
|
414
|
-
4. **CDN加载**:可以通过CDN加载以加快访问速度:
|
|
415
|
-
```html
|
|
416
|
-
<!-- 完整版 -->
|
|
417
|
-
<script src="https://cdn.jsdelivr.net/npm/id-scanner-lib/dist/id-scanner.min.js"></script>
|
|
418
|
-
|
|
419
|
-
<!-- 或仅加载核心功能 -->
|
|
420
|
-
<script src="https://cdn.jsdelivr.net/npm/id-scanner-lib/dist/id-scanner-core.min.js"></script>
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
5. **版本更新记录**:
|
|
424
|
-
- v1.0.0: 首次发布版本
|
|
425
|
-
- v1.1.0: 模块化重构,实现按需加载,大幅减小体积
|
|
426
|
-
- v1.2.0: 实现多种性能优化策略,提升处理速度和降低资源占用
|
|
427
|
-
- v1.2.1: 修复类型错误和代码健壮性问题
|
|
428
|
-
- v1.2.2: 完善类型定义,修复所有类型检查警告
|
|
429
|
-
|
|
430
|
-
### 运行时性能
|
|
431
|
-
1. **摄像头参数自动优化**:根据设备性能自动调整摄像头分辨率
|
|
432
|
-
2. **OCR引擎缓存**:OCR引擎加载后会缓存,避免重复加载
|
|
433
|
-
3. **资源释放**:不使用时自动释放内存资源
|
|
434
|
-
4. **图像预处理**:针对不同光线条件优化识别准确率
|
|
435
|
-
|
|
436
|
-
### 推荐做法
|
|
437
|
-
- 在应用初始化阶段,先使用核心功能
|
|
438
|
-
- 为OCR等重型功能设置单独的入口或交互按钮
|
|
439
|
-
- 在用户可能需要OCR前预加载,但不立即初始化
|
|
440
|
-
- 实现加载状态UI反馈,提升用户体验
|
|
441
|
-
|
|
442
|
-
## 开发与贡献
|
|
443
|
-
|
|
444
|
-
### 本地开发
|
|
469
|
+
### 发布到GitHub
|
|
445
470
|
|
|
446
471
|
```bash
|
|
447
|
-
#
|
|
448
|
-
git
|
|
449
|
-
|
|
450
|
-
# 安装依赖
|
|
451
|
-
npm install
|
|
472
|
+
# 1. 提交代码变更
|
|
473
|
+
git add .
|
|
474
|
+
git commit -m "发布 v1.x.x"
|
|
452
475
|
|
|
453
|
-
#
|
|
454
|
-
|
|
476
|
+
# 2. 推送到GitHub
|
|
477
|
+
git push origin main
|
|
455
478
|
|
|
456
|
-
#
|
|
457
|
-
|
|
479
|
+
# 3. 创建Release
|
|
480
|
+
# 访问 https://github.com/agions/id-scanner-lib/releases/new
|
|
481
|
+
# 选择对应的标签,填写Release说明
|
|
458
482
|
```
|
|
459
483
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
```
|
|
463
|
-
src/
|
|
464
|
-
├── index.ts # 主入口
|
|
465
|
-
├── scanner/ # 扫描模块
|
|
466
|
-
│ ├── qr-scanner.ts # 二维码扫描
|
|
467
|
-
│ └── barcode-scanner.ts # 条形码扫描
|
|
468
|
-
├── id-recognition/ # 身份证识别模块
|
|
469
|
-
│ ├── id-detector.ts # 身份证检测
|
|
470
|
-
│ ├── ocr-processor.ts # OCR文字识别
|
|
471
|
-
│ └── data-extractor.ts # 数据提取和验证
|
|
472
|
-
└── utils/ # 工具类
|
|
473
|
-
├── camera.ts # 相机访问
|
|
474
|
-
├── image-processing.ts # 图像处理
|
|
475
|
-
└── types.ts # 类型定义
|
|
476
|
-
```
|
|
484
|
+
## 贡献指南
|
|
477
485
|
|
|
478
|
-
|
|
486
|
+
欢迎贡献代码、报告问题或提出新功能建议。请通过GitHub Issues或Pull Requests参与项目。
|
|
479
487
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
488
|
+
1. Fork项目仓库
|
|
489
|
+
2. 创建你的特性分支 (`git checkout -b feature/amazing-feature`)
|
|
490
|
+
3. 提交你的更改 (`git commit -m '添加一些很棒的功能'`)
|
|
491
|
+
4. 推送到分支 (`git push origin feature/amazing-feature`)
|
|
492
|
+
5. 打开Pull Request
|
|
484
493
|
|
|
485
494
|
## 许可证
|
|
486
495
|
|
|
487
|
-
|
|
496
|
+
本项目采用MIT许可证。详见[LICENSE](LICENSE)文件。
|
|
488
497
|
|
|
489
|
-
|
|
498
|
+
---
|
|
490
499
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
500
|
+
<p align="center">
|
|
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>
|