id-scanner-lib 1.0.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/LICENSE +21 -0
- package/README.md +317 -0
- package/dist/demo/demo.d.ts +14 -0
- package/dist/id-recognition/data-extractor.d.ts +74 -0
- package/dist/id-recognition/id-detector.d.ts +76 -0
- package/dist/id-recognition/ocr-processor.d.ts +64 -0
- package/dist/id-scanner.esm.js +94656 -0
- package/dist/id-scanner.esm.js.map +1 -0
- package/dist/id-scanner.js +94660 -0
- package/dist/id-scanner.js.map +1 -0
- package/dist/id-scanner.min.js +9 -0
- package/dist/id-scanner.min.js.map +1 -0
- package/dist/index.d.ts +143 -0
- package/dist/scanner/barcode-scanner.d.ts +90 -0
- package/dist/scanner/qr-scanner.d.ts +80 -0
- package/dist/utils/camera.d.ts +76 -0
- package/dist/utils/image-processing.d.ts +75 -0
- package/dist/utils/types.d.ts +65 -0
- package/package.json +56 -0
- package/src/demo/demo.ts +88 -0
- package/src/id-recognition/data-extractor.ts +165 -0
- package/src/id-recognition/id-detector.ts +171 -0
- package/src/id-recognition/ocr-processor.ts +169 -0
- package/src/index.ts +228 -0
- package/src/scanner/barcode-scanner.ts +164 -0
- package/src/scanner/qr-scanner.ts +128 -0
- package/src/utils/camera.ts +139 -0
- package/src/utils/image-processing.ts +157 -0
- package/src/utils/types.ts +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 agions
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
# ID-Scanner-Lib
|
|
2
|
+
|
|
3
|
+
纯前端实现的TypeScript身份证&二维码识别库,无需后端支持,所有处理在浏览器端完成。
|
|
4
|
+
|
|
5
|
+
## 主要功能
|
|
6
|
+
|
|
7
|
+
- **二维码扫描识别**:实时识别摄像头中的二维码
|
|
8
|
+
- **条形码扫描识别**:支持常见一维条形码格式识别
|
|
9
|
+
- **身份证检测**:自动检测和定位摄像头中的身份证
|
|
10
|
+
- **OCR信息提取**:从身份证图像中提取文字信息
|
|
11
|
+
- **数据验证与增强**:验证身份证号码格式,并通过多种方式补充缺失信息
|
|
12
|
+
|
|
13
|
+
## 系统架构
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
17
|
+
│ IDScanner 主类 │
|
|
18
|
+
├─────────────┬─────────────────┬────────────────────────────┤
|
|
19
|
+
│ QRScanner │ BarcodeScanner │ IDCardDetector │
|
|
20
|
+
├─────────────┴─────────────────┴────────────────────────────┤
|
|
21
|
+
│ Camera (视频流捕获与处理) │
|
|
22
|
+
└─────────────────────────────────────────────────────────────┘
|
|
23
|
+
▲
|
|
24
|
+
│
|
|
25
|
+
▼
|
|
26
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
27
|
+
│ 数据处理与识别模块 │
|
|
28
|
+
├─────────────────┬─────────────────┬────────────────────────┤
|
|
29
|
+
│ OCRProcessor │ DataExtractor │ ImageProcessor │
|
|
30
|
+
│ (文字识别) │ (数据提取验证) │ (图像预处理) │
|
|
31
|
+
└─────────────────┴─────────────────┴────────────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 安装
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install id-scanner-lib
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 快速开始
|
|
41
|
+
|
|
42
|
+
### 基本用法
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
import { IDScanner } from 'id-scanner-lib';
|
|
46
|
+
|
|
47
|
+
// 创建扫描器实例
|
|
48
|
+
const scanner = new IDScanner({
|
|
49
|
+
// 二维码识别回调
|
|
50
|
+
onQRCodeScanned: (result) => {
|
|
51
|
+
console.log('扫描到二维码:', result);
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// 条形码识别回调
|
|
55
|
+
onBarcodeScanned: (result) => {
|
|
56
|
+
console.log('扫描到条形码:', result);
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
// 身份证识别回调
|
|
60
|
+
onIDCardScanned: (info) => {
|
|
61
|
+
console.log('识别到身份证信息:', info);
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
// 错误处理
|
|
65
|
+
onError: (error) => {
|
|
66
|
+
console.error('扫描出错:', error);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// 初始化
|
|
71
|
+
await scanner.initialize();
|
|
72
|
+
|
|
73
|
+
// 启动二维码扫描
|
|
74
|
+
const videoElement = document.getElementById('video');
|
|
75
|
+
await scanner.startQRScanner(videoElement);
|
|
76
|
+
|
|
77
|
+
// 切换到身份证识别
|
|
78
|
+
scanner.stop();
|
|
79
|
+
await scanner.startIDCardScanner(videoElement);
|
|
80
|
+
|
|
81
|
+
// 使用结束后释放资源
|
|
82
|
+
scanner.terminate();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 演示代码
|
|
86
|
+
|
|
87
|
+
查看 `examples/index.html` 获取完整的演示代码。
|
|
88
|
+
|
|
89
|
+
## 详细API文档
|
|
90
|
+
|
|
91
|
+
### IDScanner 主类
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
class IDScanner {
|
|
95
|
+
// 构造函数
|
|
96
|
+
constructor(options?: IDScannerOptions);
|
|
97
|
+
|
|
98
|
+
// 初始化OCR引擎和资源
|
|
99
|
+
async initialize(): Promise<void>;
|
|
100
|
+
|
|
101
|
+
// 启动二维码扫描
|
|
102
|
+
async startQRScanner(videoElement: HTMLVideoElement): Promise<void>;
|
|
103
|
+
|
|
104
|
+
// 启动条形码扫描
|
|
105
|
+
async startBarcodeScanner(videoElement: HTMLVideoElement): Promise<void>;
|
|
106
|
+
|
|
107
|
+
// 启动身份证扫描
|
|
108
|
+
async startIDCardScanner(videoElement: HTMLVideoElement): Promise<void>;
|
|
109
|
+
|
|
110
|
+
// 停止当前扫描
|
|
111
|
+
stop(): void;
|
|
112
|
+
|
|
113
|
+
// 释放所有资源
|
|
114
|
+
async terminate(): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 类型定义
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// IDScanner配置选项
|
|
122
|
+
interface IDScannerOptions {
|
|
123
|
+
// 相机配置
|
|
124
|
+
cameraOptions?: CameraOptions;
|
|
125
|
+
// 二维码扫描配置
|
|
126
|
+
qrScannerOptions?: QRScannerOptions;
|
|
127
|
+
// 条形码扫描配置
|
|
128
|
+
barcodeScannerOptions?: BarcodeScannerOptions;
|
|
129
|
+
// 二维码识别回调
|
|
130
|
+
onQRCodeScanned?: (result: string) => void;
|
|
131
|
+
// 条形码识别回调
|
|
132
|
+
onBarcodeScanned?: (result: string) => void;
|
|
133
|
+
// 身份证识别回调
|
|
134
|
+
onIDCardScanned?: (info: IDCardInfo) => void;
|
|
135
|
+
// 错误处理回调
|
|
136
|
+
onError?: (error: Error) => void;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// 相机配置选项
|
|
140
|
+
interface CameraOptions {
|
|
141
|
+
width?: number; // 视频宽度
|
|
142
|
+
height?: number; // 视频高度
|
|
143
|
+
facingMode?: 'user' | 'environment'; // 前置或后置摄像头
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 识别结果的身份证信息
|
|
147
|
+
interface IDCardInfo {
|
|
148
|
+
name?: string; // 姓名
|
|
149
|
+
gender?: string; // 性别
|
|
150
|
+
nationality?: string; // 民族
|
|
151
|
+
birthDate?: string; // 出生日期,如"1990-01-01"
|
|
152
|
+
address?: string; // 地址
|
|
153
|
+
idNumber?: string; // 身份证号码
|
|
154
|
+
issuingAuthority?: string; // 签发机关
|
|
155
|
+
validPeriod?: string; // 有效期限
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 高级用法
|
|
160
|
+
|
|
161
|
+
### 自定义相机配置
|
|
162
|
+
|
|
163
|
+
```javascript
|
|
164
|
+
const scanner = new IDScanner({
|
|
165
|
+
cameraOptions: {
|
|
166
|
+
width: 1280,
|
|
167
|
+
height: 720,
|
|
168
|
+
facingMode: 'environment' // 使用后置摄像头,更适合扫描
|
|
169
|
+
},
|
|
170
|
+
onIDCardScanned: (info) => {
|
|
171
|
+
console.log('识别到身份证信息:', info);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 调整扫描频率
|
|
177
|
+
|
|
178
|
+
```javascript
|
|
179
|
+
const scanner = new IDScanner({
|
|
180
|
+
qrScannerOptions: {
|
|
181
|
+
scanInterval: 100 // 每100ms扫描一次,默认为200ms
|
|
182
|
+
},
|
|
183
|
+
onQRCodeScanned: (result) => {
|
|
184
|
+
console.log('扫描到二维码:', result);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 直接使用子模块
|
|
190
|
+
|
|
191
|
+
```javascript
|
|
192
|
+
import { QRScanner, ImageProcessor } from 'id-scanner-lib';
|
|
193
|
+
|
|
194
|
+
// 单独使用二维码扫描功能
|
|
195
|
+
const qrScanner = new QRScanner({
|
|
196
|
+
onScan: (result) => {
|
|
197
|
+
console.log('扫描到二维码:', result);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// 使用图像处理工具
|
|
202
|
+
const enhancedImage = ImageProcessor.adjustBrightnessContrast(
|
|
203
|
+
originalImageData,
|
|
204
|
+
10, // 亮度调整
|
|
205
|
+
20 // 对比度调整
|
|
206
|
+
);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 性能优化建议
|
|
210
|
+
|
|
211
|
+
1. **预加载OCR引擎**:在用户可能需要识别身份证前就初始化`OCRProcessor`,避免用户等待。
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
// 页面加载后即初始化,而不是等到用户点击按钮才初始化
|
|
215
|
+
document.addEventListener('DOMContentLoaded', async () => {
|
|
216
|
+
const scanner = new IDScanner();
|
|
217
|
+
await scanner.initialize(); // 预先加载OCR引擎
|
|
218
|
+
|
|
219
|
+
// 保存scanner实例供后续使用
|
|
220
|
+
window.idScanner = scanner;
|
|
221
|
+
});
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
2. **减小分辨率**:如果识别速度太慢,可以尝试降低相机分辨率。
|
|
225
|
+
|
|
226
|
+
```javascript
|
|
227
|
+
const scanner = new IDScanner({
|
|
228
|
+
cameraOptions: {
|
|
229
|
+
width: 640,
|
|
230
|
+
height: 480 // 降低分辨率提高处理速度
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
3. **关闭不必要的扫描**:不使用时及时停止扫描,节省资源。
|
|
236
|
+
|
|
237
|
+
## 常见问题解答
|
|
238
|
+
|
|
239
|
+
**Q: 为什么我在移动设备上无法访问摄像头?**
|
|
240
|
+
|
|
241
|
+
A: 确保你的网站使用HTTPS协议,现代浏览器要求在安全上下文中才能访问摄像头。
|
|
242
|
+
|
|
243
|
+
**Q: 身份证识别准确率不高怎么办?**
|
|
244
|
+
|
|
245
|
+
A:
|
|
246
|
+
- 确保光线充足,避免反光和阴影
|
|
247
|
+
- 调整相机对准身份证,使其占据画面大部分区域
|
|
248
|
+
- 保持身份证平整,避免弯曲
|
|
249
|
+
- 尝试增强图像对比度:`ImageProcessor.adjustBrightnessContrast()`
|
|
250
|
+
|
|
251
|
+
**Q: 库的大小会不会影响页面加载速度?**
|
|
252
|
+
|
|
253
|
+
A: 库的大小约为1MB,主要是因为包含OCR引擎。可以考虑按需加载,只在用户需要识别身份证时才加载OCR相关模块。
|
|
254
|
+
|
|
255
|
+
## 浏览器兼容性
|
|
256
|
+
|
|
257
|
+
| 浏览器 | 版本要求 | 备注 |
|
|
258
|
+
|--------------|---------------------|--------------------------|
|
|
259
|
+
| Chrome | 60+ | 全功能支持 |
|
|
260
|
+
| Firefox | 55+ | 全功能支持 |
|
|
261
|
+
| Edge | 79+ (Chromium) | 全功能支持 |
|
|
262
|
+
| Safari | 11+ | iOS需要用户主动点击激活相机 |
|
|
263
|
+
| 安卓WebView | 60+ | 需要应用授予相机权限 |
|
|
264
|
+
| iOS WebView | 11+ | 需要用户主动点击激活相机 |
|
|
265
|
+
|
|
266
|
+
## 开发与贡献
|
|
267
|
+
|
|
268
|
+
### 本地开发
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# 克隆仓库
|
|
272
|
+
git clone https://github.com/agions/id-scanner-lib.git
|
|
273
|
+
|
|
274
|
+
# 安装依赖
|
|
275
|
+
npm install
|
|
276
|
+
|
|
277
|
+
# 开发模式
|
|
278
|
+
npm run dev
|
|
279
|
+
|
|
280
|
+
# 构建生产版本
|
|
281
|
+
npm run build
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 目录结构
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
src/
|
|
288
|
+
├── index.ts # 主入口
|
|
289
|
+
├── scanner/ # 扫描模块
|
|
290
|
+
│ ├── qr-scanner.ts # 二维码扫描
|
|
291
|
+
│ └── barcode-scanner.ts # 条形码扫描
|
|
292
|
+
├── id-recognition/ # 身份证识别模块
|
|
293
|
+
│ ├── id-detector.ts # 身份证检测
|
|
294
|
+
│ ├── ocr-processor.ts # OCR文字识别
|
|
295
|
+
│ └── data-extractor.ts # 数据提取和验证
|
|
296
|
+
└── utils/ # 工具类
|
|
297
|
+
├── camera.ts # 相机访问
|
|
298
|
+
├── image-processing.ts # 图像处理
|
|
299
|
+
└── types.ts # 类型定义
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## 技术实现
|
|
303
|
+
|
|
304
|
+
- 使用 WebRTC 获取摄像头视频流
|
|
305
|
+
- 使用 jsQR 进行二维码识别
|
|
306
|
+
- 使用 Tesseract.js 进行OCR文字识别
|
|
307
|
+
- 基于 Canvas API 进行图像处理
|
|
308
|
+
|
|
309
|
+
## 许可证
|
|
310
|
+
|
|
311
|
+
本项目基于MIT许可证开源。
|
|
312
|
+
|
|
313
|
+
## 致谢
|
|
314
|
+
|
|
315
|
+
本项目使用了以下开源库:
|
|
316
|
+
- [jsQR](https://github.com/cozmo/jsQR) - 二维码扫描
|
|
317
|
+
- [Tesseract.js](https://github.com/naptha/tesseract.js) - OCR文字识别
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class IDScannerDemo {
|
|
2
|
+
private scanner;
|
|
3
|
+
private videoElement;
|
|
4
|
+
private resultContainer;
|
|
5
|
+
private switchButton;
|
|
6
|
+
constructor(videoElementId: string, resultContainerId: string, switchButtonId: string);
|
|
7
|
+
initialize(): Promise<void>;
|
|
8
|
+
private currentMode;
|
|
9
|
+
private toggleScanMode;
|
|
10
|
+
private handleQRCodeResult;
|
|
11
|
+
private handleIDCardResult;
|
|
12
|
+
private handleError;
|
|
13
|
+
stop(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 数据提取工具类
|
|
3
|
+
* @description 提供身份证信息的验证和格式化功能
|
|
4
|
+
* @module DataExtractor
|
|
5
|
+
*/
|
|
6
|
+
import { IDCardInfo } from '../utils/types';
|
|
7
|
+
/**
|
|
8
|
+
* 数据提取工具类
|
|
9
|
+
*
|
|
10
|
+
* 提供身份证信息的验证、提取和增强功能,可以从身份证号码中提取出生日期、性别等信息,
|
|
11
|
+
* 并对OCR识别结果进行补充和验证
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // 验证身份证号码
|
|
16
|
+
* const isValid = DataExtractor.validateIDNumber('110101199001011234');
|
|
17
|
+
*
|
|
18
|
+
* // 从身份证号码提取出生日期
|
|
19
|
+
* const birthDate = DataExtractor.extractBirthDateFromID('110101199001011234');
|
|
20
|
+
* // 结果: '1990-01-01'
|
|
21
|
+
*
|
|
22
|
+
* // 增强OCR识别结果
|
|
23
|
+
* const enhancedInfo = DataExtractor.enhanceIDCardInfo({
|
|
24
|
+
* name: '张三',
|
|
25
|
+
* idNumber: '110101199001011234'
|
|
26
|
+
* });
|
|
27
|
+
* // 结果会自动补充性别和出生日期
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class DataExtractor {
|
|
31
|
+
/**
|
|
32
|
+
* 验证身份证号码格式
|
|
33
|
+
*
|
|
34
|
+
* 检查身份证号码的长度、格式和出生日期部分是否有效
|
|
35
|
+
*
|
|
36
|
+
* @param {string} idNumber - 要验证的身份证号码
|
|
37
|
+
* @returns {boolean} 是否是有效的身份证号码
|
|
38
|
+
*/
|
|
39
|
+
static validateIDNumber(idNumber: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* 从身份证号码提取出生日期
|
|
42
|
+
*
|
|
43
|
+
* @param {string} idNumber - 身份证号码
|
|
44
|
+
* @returns {string|null} 格式化的出生日期(YYYY-MM-DD),如果身份证号码无效则返回null
|
|
45
|
+
*/
|
|
46
|
+
static extractBirthDateFromID(idNumber: string): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* 从身份证号码提取性别
|
|
49
|
+
*
|
|
50
|
+
* 根据身份证号码第17位判断性别,奇数为男,偶数为女
|
|
51
|
+
*
|
|
52
|
+
* @param {string} idNumber - 身份证号码
|
|
53
|
+
* @returns {string|null} '男'或'女',如果身份证号码无效则返回null
|
|
54
|
+
*/
|
|
55
|
+
static extractGenderFromID(idNumber: string): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* 从身份证号码提取地区编码
|
|
58
|
+
*
|
|
59
|
+
* @param {string} idNumber - 身份证号码
|
|
60
|
+
* @returns {string|null} 地区编码(前6位),如果身份证号码无效则返回null
|
|
61
|
+
*/
|
|
62
|
+
static extractRegionFromID(idNumber: string): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* 合并并优化身份证信息
|
|
65
|
+
*
|
|
66
|
+
* 使用多个来源的数据进行交叉验证和补充,如果OCR识别结果缺少某些信息,
|
|
67
|
+
* 但有身份证号码,则可以从号码中提取出生日期和性别等信息
|
|
68
|
+
*
|
|
69
|
+
* @param {IDCardInfo} ocrInfo - OCR识别到的身份证信息
|
|
70
|
+
* @param {string} [idNumber] - 可选的外部提供的身份证号码,优先级高于OCR识别结果
|
|
71
|
+
* @returns {IDCardInfo} 增强后的身份证信息
|
|
72
|
+
*/
|
|
73
|
+
static enhanceIDCardInfo(ocrInfo: IDCardInfo, idNumber?: string): IDCardInfo;
|
|
74
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 身份证检测模块
|
|
3
|
+
* @description 提供自动检测和定位图像中的身份证功能
|
|
4
|
+
* @module IDCardDetector
|
|
5
|
+
*/
|
|
6
|
+
import { DetectionResult } from '../utils/types';
|
|
7
|
+
/**
|
|
8
|
+
* 身份证检测器类
|
|
9
|
+
*
|
|
10
|
+
* 通过图像处理和计算机视觉技术,实时检测视频流中的身份证,并提取身份证区域
|
|
11
|
+
* 注意:当前实现是简化版,实际项目中建议使用OpenCV.js进行更精确的检测
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // 创建身份证检测器
|
|
16
|
+
* const detector = new IDCardDetector((result) => {
|
|
17
|
+
* if (result.success && result.croppedImage) {
|
|
18
|
+
* console.log('检测到身份证!');
|
|
19
|
+
* // 对裁剪出的身份证图像进行处理
|
|
20
|
+
* processIDCardImage(result.croppedImage);
|
|
21
|
+
* }
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // 启动检测
|
|
25
|
+
* const videoElement = document.getElementById('video') as HTMLVideoElement;
|
|
26
|
+
* await detector.start(videoElement);
|
|
27
|
+
*
|
|
28
|
+
* // 停止检测
|
|
29
|
+
* detector.stop();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class IDCardDetector {
|
|
33
|
+
private onDetected?;
|
|
34
|
+
private camera;
|
|
35
|
+
private detecting;
|
|
36
|
+
private detectTimer;
|
|
37
|
+
/**
|
|
38
|
+
* 创建身份证检测器实例
|
|
39
|
+
*
|
|
40
|
+
* @param {Function} [onDetected] - 身份证检测成功回调函数,接收检测结果对象
|
|
41
|
+
*/
|
|
42
|
+
constructor(onDetected?: ((result: DetectionResult) => void) | undefined);
|
|
43
|
+
/**
|
|
44
|
+
* 启动身份证检测
|
|
45
|
+
*
|
|
46
|
+
* 初始化相机并开始连续检测视频帧中的身份证
|
|
47
|
+
*
|
|
48
|
+
* @param {HTMLVideoElement} videoElement - 用于显示相机画面的video元素
|
|
49
|
+
* @returns {Promise<void>} 启动完成的Promise
|
|
50
|
+
*/
|
|
51
|
+
start(videoElement: HTMLVideoElement): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* 执行一次身份证检测
|
|
54
|
+
*
|
|
55
|
+
* 内部方法,捕获当前视频帧并尝试检测其中的身份证
|
|
56
|
+
*
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
private detect;
|
|
60
|
+
/**
|
|
61
|
+
* 身份证检测核心算法
|
|
62
|
+
*
|
|
63
|
+
* 通过图像处理技术检测和提取图像中的身份证区域
|
|
64
|
+
*
|
|
65
|
+
* @private
|
|
66
|
+
* @param {ImageData} imageData - 需要检测身份证的图像数据
|
|
67
|
+
* @returns {Promise<DetectionResult>} 检测结果,包含成功标志和裁剪后的身份证图像
|
|
68
|
+
*/
|
|
69
|
+
private detectIDCard;
|
|
70
|
+
/**
|
|
71
|
+
* 停止身份证检测
|
|
72
|
+
*
|
|
73
|
+
* 停止检测循环并释放相机资源
|
|
74
|
+
*/
|
|
75
|
+
stop(): void;
|
|
76
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file OCR处理模块
|
|
3
|
+
* @description 提供身份证文字识别和信息提取功能
|
|
4
|
+
* @module OCRProcessor
|
|
5
|
+
*/
|
|
6
|
+
import { IDCardInfo } from '../utils/types';
|
|
7
|
+
/**
|
|
8
|
+
* OCR处理器类
|
|
9
|
+
*
|
|
10
|
+
* 使用Tesseract.js实现对身份证图像的OCR文字识别和信息提取功能
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // 创建OCR处理器
|
|
15
|
+
* const ocrProcessor = new OCRProcessor();
|
|
16
|
+
*
|
|
17
|
+
* // 初始化OCR引擎
|
|
18
|
+
* await ocrProcessor.initialize();
|
|
19
|
+
*
|
|
20
|
+
* // 处理身份证图像
|
|
21
|
+
* const idInfo = await ocrProcessor.processIDCard(idCardImageData);
|
|
22
|
+
* console.log('识别到的身份证信息:', idInfo);
|
|
23
|
+
*
|
|
24
|
+
* // 使用结束后释放资源
|
|
25
|
+
* await ocrProcessor.terminate();
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class OCRProcessor {
|
|
29
|
+
private worker;
|
|
30
|
+
constructor();
|
|
31
|
+
/**
|
|
32
|
+
* 初始化OCR引擎
|
|
33
|
+
*
|
|
34
|
+
* 加载Tesseract OCR引擎和中文简体语言包,并设置适合身份证识别的参数
|
|
35
|
+
*
|
|
36
|
+
* @returns {Promise<void>} 初始化完成的Promise
|
|
37
|
+
*/
|
|
38
|
+
initialize(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* 处理身份证图像并提取信息
|
|
41
|
+
*
|
|
42
|
+
* 对身份证图像进行OCR识别,并从识别结果中提取结构化信息
|
|
43
|
+
*
|
|
44
|
+
* @param {ImageData} imageData - 身份证图像数据
|
|
45
|
+
* @returns {Promise<IDCardInfo>} 提取到的身份证信息
|
|
46
|
+
*/
|
|
47
|
+
processIDCard(imageData: ImageData): Promise<IDCardInfo>;
|
|
48
|
+
/**
|
|
49
|
+
* 解析身份证文本信息
|
|
50
|
+
*
|
|
51
|
+
* 从OCR识别到的文本中提取结构化的身份证信息
|
|
52
|
+
*
|
|
53
|
+
* @private
|
|
54
|
+
* @param {string} text - OCR识别到的文本
|
|
55
|
+
* @returns {IDCardInfo} 提取到的身份证信息对象
|
|
56
|
+
*/
|
|
57
|
+
private parseIDCardText;
|
|
58
|
+
/**
|
|
59
|
+
* 终止OCR引擎并释放资源
|
|
60
|
+
*
|
|
61
|
+
* @returns {Promise<void>} 终止完成的Promise
|
|
62
|
+
*/
|
|
63
|
+
terminate(): Promise<void>;
|
|
64
|
+
}
|