Hướng Dẫn Triển Khai OCR Trong HarmonyOS Bằng Regex
Optical Character Recognition (OCR) là một công cụ mạnh mẽ giúp trích xuất văn bản từ hình ảnh. Tuy nhiên, chỉ có văn bản thô không phải lúc nào cũng đủ. Khi xây dựng ứng dụng trên HarmonyOS, khả năng trích xuất chính xác dữ liệu cụ thể (như số ID, tên hoặc ngày tháng) bằng cách sử dụng regex (biểu thức chính quy) có thể nâng tầm ứng dụng của bạn từ tốt đến xuất sắc.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách:
- Thiết lập camera trong ứng dụng HarmonyOS
- Chụp và xử lý hình ảnh bằng AI Kit
- Thực hiện OCR với Core Vision Kit
- Trích xuất dữ liệu có ý nghĩa bằng Regex
Mục Tiêu
Trước Khi Bắt Đầu
Để theo dõi hướng dẫn này, hãy đảm bảo bạn đã có:
- DevEco Studio được cài đặt
- Một dự án HarmonyOS với các kit sau được kích hoạt:
- CameraKit
- CoreVisionKit
- ImageKit
- AbilityKit
- Kiến thức cơ bản về TypeScript
Bước 1: Thiết Lập Camera
HarmonyOS cung cấp các công cụ camera mạnh mẽ thông qua CameraKit. Dưới đây là cách bạn có thể khởi tạo và bắt đầu một phiên camera:
typescript
async initCamera(surfaceId: string): Promise<void> {
this.cameraMgr = camera.getCameraManager(getContext(this) as common.UIAbilityContext);
let cameraArray = this.getCameraDevices(this.cameraMgr);
this.cameraDevice = cameraArray[0]; // Camera sau
this.cameraInput = this.getCameraInput(this.cameraDevice, this.cameraMgr)!;
await this.cameraInput.open();
this.capability = this.cameraMgr.getSupportedOutputCapability(this.cameraDevice, camera.SceneMode.NORMAL_PHOTO);
this.previewOutput = this.getPreviewOutput(this.cameraMgr, this.capability, surfaceId)!;
this.photoOutput = this.getPhotoOutput(this.cameraMgr, this.capability)!;
// Đăng ký listener cho chụp ảnh
this.photoOutput.on('photoAvailable', async (errCode: BusinessError, photo: camera.Photo) => {
const imageObj = photo.main;
imageObj.getComponent(image.ComponentType.JPEG, async (errCode, component) => {
const buffer = component.byteBuffer;
this.idCardResult = await this.recognizeImage(buffer);
this.result = JSON.stringify(this.idCardResult);
});
});
// Thiết lập phiên chụp
this.captureSession = this.getCaptureSession(this.cameraMgr)!;
this.beginConfig(this.captureSession);
this.startSession(this.captureSession, this.cameraInput, this.previewOutput, this.photoOutput);
}
Bạn có thể chụp một bức ảnh bằng cách gọi:
typescript
async takePicture() {
this.photoOutput!.capture();
}
Bước 2: Thực Hiện OCR Với CoreVisionKit
Sau khi một hình ảnh được chụp, nó cần được xử lý để nhận diện văn bản bằng cách sử dụng API textRecognition.recognizeText().
typescript
async recognizeImage(buffer: ArrayBuffer): Promise<IDCardData> {
const imageResource = image.createImageSource(buffer);
const pixelMapInstance = await imageResource.createPixelMap();
const visionInfo = { pixelMap: pixelMapInstance };
const textConfig = { isDirectionDetectionSupported: true };
let recognitionString = '';
if (canIUse('SystemCapability.AI.OCR.TextRecognition')) {
await textRecognition.recognizeText(visionInfo, textConfig).then((result) => {
recognitionString = result.value;
});
pixelMapInstance.release();
imageResource.release();
}
return this.extractDataWithRegex(recognitionString);
}
Bước 3: Trích Xuất Thông Tin Cụ Thể Sử Dụng Regex
OCR cho chúng ta tất cả văn bản — nhưng chúng ta thường chỉ muốn một số phần nhất định (như số ID hoặc tên). Đó là lúc regex trở thành cứu tinh.
Dưới đây là cách chúng ta định nghĩa các mẫu và trích xuất các kết quả:
typescript
const patterns: RegexPatterns = {
tckn: /(?:T\.?\s*C\.?\s*Kimlik\s*No|TR\s*identity\s*No)[\s:]*([1-9]\d{10})/i,
surname: /(?:Soyadı|Surname)[\s:]*([A-ZÇĞİÖŞÜ]+)/i,
name: /(?:Adı|Given Name)[\s:]*([A-ZÇĞİÖŞÜ]+)/i,
birthDate: /(?:Doğum\s*Tarihi|Date\s*of\s*Birth)[\s:]*([\d./-]+)/i,
gender: /(?:Cinsiyeti\s*\/\s*Gender)[\s:]*([EM])/i,
documentNo: /(?:Seri\s*No|Document\s*No)[\s:]*([A-Z0-9]{5,})/i,
};
function extractDataWithRegex(text: string): IDCardData {
return {
tckn: text.match(patterns.tckn)?.[1],
name: text.match(patterns.name)?.[1],
surname: text.match(patterns.surname)?.[1],
birthDate: text.match(patterns.birthDate)?.[1],
gender: text.match(patterns.gender)?.[1],
documentNo: text.match(patterns.documentNo)?.[1],
rawText: text
};
}
Cách tiếp cận regex này cho bạn toàn quyền kiểm soát việc trích xuất từ đầu ra ồn ào của OCR.
Kết Quả Ví Dụ
Giả sử OCR trả về văn bản thô sau:
T.C. Kimlik No: 1234*******
Adı: MEHMET
Soyadı: YILMAZ
Doğum Tarihi: 01.01.1990
Cinsiyeti / Gender: E
Seri No: A1234**
B parser của chúng tôi sẽ trả về:
{
"tckn": "1234*******",
"name": "MEHMET",
"surname": "YILMAZ",
"birthDate": "01.01.1990",
"gender": "E",
"documentNo": "A1234**"
}
Bonus: Giải Phóng Tài Nguyên Camera
Đừng quên dọn dẹp sau khi bạn hoàn tất:
typescript
async releaseCamera(): Promise<void> {
await this.cameraInput?.close();
await this.previewOutput?.release();
await this.receiver?.release();
await this.photoOutput?.release();
await this.captureSession?.release();
}
Những Điều Cuối Cùng
Bằng cách kết hợp CameraKit, CoreVisionKit, và Regex, bạn có thể xây dựng các tính năng OCR thông minh và hiệu quả trong ứng dụng HarmonyOS của mình. Cho dù bạn đang xử lý thẻ ID, biên lai hay danh thiếp, phương pháp này cho phép trích xuất văn bản có cấu trúc và chính xác.
Tóm Tắt
- Sử dụng
CameraKitđể chụp hình ảnh - Xử lý hình ảnh với OCR của
CoreVisionKit - Sử dụng
Regexđể trích xuất dữ liệu có cấu trúc như TCKN, tên, ngày sinh - Luôn giải phóng tài nguyên camera đúng cách
Các Tài Liệu Tham Khảo
- OCR
- Camera Kit