UNPKG

id-scanner-lib

Version:

一款纯前端实现的TypeScript身份证&二维码识别库,无需后端支持,所有处理在浏览器端完成,新增图像批处理与优化

188 lines (166 loc) 4.9 kB
/** * @file OCR模块入口文件 * @description 包含身份证OCR识别相关功能 * @module IDScannerOCR * @version 1.0.0 * @license MIT */ import { Camera, CameraOptions } from "./utils/camera" import { ImageProcessor } from "./utils/image-processing" import { IDCardInfo, DetectionResult } from "./utils/types" import { IDCardDetector, IDCardDetectorOptions, } from "./id-recognition/id-detector" import { OCRProcessor } from "./id-recognition/ocr-processor" import { DataExtractor } from "./id-recognition/data-extractor" /** * OCR模块配置选项 */ export interface OCRModuleOptions { cameraOptions?: CameraOptions onIDCardScanned?: (info: IDCardInfo) => void onError?: (error: Error) => void } /** * OCR模块类 * * 提供身份证检测和OCR文字识别功能 */ export class OCRModule { private idDetector: IDCardDetector private ocrProcessor: OCRProcessor private dataExtractor: DataExtractor private camera: Camera private isRunning: boolean = false private videoElement: HTMLVideoElement | null = null /** * 构造函数 * @param options 配置选项 */ constructor(private options: OCRModuleOptions = {}) { this.camera = new Camera(options.cameraOptions) this.idDetector = new IDCardDetector({ onDetection: this.handleIDDetection.bind(this), onError: this.handleError.bind(this), } as IDCardDetectorOptions) this.ocrProcessor = new OCRProcessor() this.dataExtractor = new DataExtractor() } /** * 初始化OCR引擎 * * @returns Promise<void> */ async initialize(): Promise<void> { try { await this.ocrProcessor.initialize() console.log("OCR engine initialized") } catch (error) { this.handleError(error as Error) throw error } } /** * 启动身份证扫描 * @param videoElement HTML视频元素 */ async startIDCardScanner(videoElement: HTMLVideoElement): Promise<void> { if (!this.ocrProcessor) { throw new Error("OCR engine not initialized. Call initialize() first.") } this.videoElement = videoElement this.isRunning = true await this.camera.start(videoElement) this.idDetector.start(videoElement) } /** * 停止扫描 */ stop(): void { this.isRunning = false this.idDetector.stop() this.camera.stop() } /** * 处理身份证检测结果 */ private async handleIDDetection(result: DetectionResult): Promise<void> { if (!this.isRunning) return try { // 检查 imageData 是否存在 if (!result.imageData) { this.handleError(new Error("无效的图像数据")) return } const idCardInfo = await this.ocrProcessor.processIDCard(result.imageData) const extractedInfo = this.dataExtractor.extractAndValidate(idCardInfo) if (this.options.onIDCardScanned) { this.options.onIDCardScanned(extractedInfo) } } catch (error) { this.handleError(error as Error) } } /** * 处理错误 */ private handleError(error: Error): void { if (this.options.onError) { this.options.onError(error) } else { console.error("OCRModule error:", error) } } /** * 释放资源 */ async terminate(): Promise<void> { this.stop() await this.ocrProcessor.terminate() } /** * 直接处理图像数据中的身份证 * @param imageData 要处理的图像数据 * @returns 返回Promise,解析为身份证信息 */ async processIDCard(imageData: ImageData): Promise<IDCardInfo> { try { if (!this.ocrProcessor) { throw new Error("OCR engine not initialized. Call initialize() first.") } // 检查图像数据有效性 if ( !imageData || !imageData.data || imageData.width <= 0 || imageData.height <= 0 ) { throw new Error("无效的图像数据") } // 进行图像预处理,提高识别率 const processedImage = ImageProcessor.adjustBrightnessContrast( imageData, 5, // 轻微提高亮度 10 // 适度提高对比度 ) // 调用OCR处理器进行文字识别 const idCardInfo = await this.ocrProcessor.processIDCard(processedImage) // 提取和验证身份证信息 const extractedInfo = this.dataExtractor.extractAndValidate(idCardInfo) // 如果有回调,触发回调 if (this.options.onIDCardScanned) { this.options.onIDCardScanned(extractedInfo) } return extractedInfo } catch (error) { this.handleError(error as Error) throw error } } } // 导出相关类型和工具 export { IDCardDetector } from "./id-recognition/id-detector" export { OCRProcessor } from "./id-recognition/ocr-processor" export { DataExtractor } from "./id-recognition/data-extractor" export { IDCardInfo } from "./utils/types"