0
0
Lập trình
NM

Hướng Dẫn Triển Khai OCR Trong HarmonyOS Bằng Regex

Đăng vào 6 tháng trước

• 4 phút đọc

Chủ đề:

KungFuTech

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 Copy
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 Copy
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 Copy
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 Copy
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:

Copy
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ề:

Copy
{
  "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 Copy
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

Tác Giả: Mehmet Algul

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào