OpenHarmonyでの自動車ナンバープレート認識実装手法

概要

本プロジェクトは、OpenCVベースのオープンソースナンバープレート認識システムEasyPRをOpenHarmony環境に移植したものです。HiSpark Taurus AI Camera(Hi3516DV300)開発ボードを使用して、ナンバープレートの撮影と認識結果の表示を実現しています。

システム構成

OpenHarmony 3.1 Release小型システム上で動作し、カメラとナンバープレートの距離は60cm~70cmを想定しています。プログラム実行後、キー入力により撮影と認識処理を制御します。

開発アーキテクチャ

本システムはOpenHarmonyのメディアサブシステムを活用し、駐車場シナリオ向けのローカルナンバープレート認識を実装しています。

依存ライブラリの移植

EasyPRはOpenCVに依存しているため、まずOpenCVの移植が必要です。移植はGn→Shellスクリプト→Makefileの連携で実現します。

プロジェクト構造:
├── BUILD.gn
├── include 
│   ├── camera_controller.h
│   ├── network_communication.h
│   ├── network_definitions.h
│   ├── device_list.h
│   ├── message_handler.h
│   ├── udp_protocol.h
│   ├── utility_functions.h
│   ├── logging_system.h
│   └── wifi_configuration.h
└── src
    ├── base64_converter.cpp
    ├── camera_controller.cpp
    ├── network_communication.cpp
    ├── device_list.cpp
    ├── message_handler.cpp
    ├── udp_protocol.cpp
    ├── utility_functions.cpp
    ├── application_main.cpp
    └── wifi_configuration.cpp

OpenCV移植手順

1. ソースコード取得: OpenCVソースをthird_partyディレクトリに配置
2. Makefile生成: buildディレクトリ作成後、cmake-guiで設定
3. ビルドスクリプト作成: build_opencv.shを実装
4. ビルド設定: BUILD.gnファイルでコンパイル対象に追加

EasyPR移植手順

1. ソースコード取得: EasyPRソースをthird_partyディレクトリに配置
2. ビルド環境構築: buildディレクトリでcmake-gui実行
3. ビルドスクリプト作成: build_easypr.shを実装
4. 依存関係設定: BUILD.gnでOpenCVとのリンクを定義

主要実装ステップ

1. GNビルドシステムへの統合
2. カメラ撮影機能の実装
3. EasyPRを用いたナンバープレート認識処理

GNビルド設定

import("//build/lite/config/component/lite_component.gni")

static_library("license_plate_detector") {
  sources = [
    "src/application_main.cpp",
    "src/camera_controller.cpp"
  ]
  
  include_dirs = [
    "include",
    "//third_party/EasyPR/include"
  ]
  
  deps = [
    "//third_party/opencv:opencv_lib",
    "//third_party/EasyPR:easypr_lib"
  ]
  
  cflags = [ "-Wno-unused-parameter" ]
}

カメラ制御実装

void initializeCameraSystem() {
  CameraConfig camera_config;
  camera_config.resolution_width = 1280;
  camera_config.resolution_height = 720;
  setupCameraDevice(camera_config);
}

void captureImageData() {
  if (!ai_processing_enabled) {
    processQRCodeDetection();
  } else {
    saveImageToPath("/sdcard/CaptureAi.jpg");
  }
}

メイン制御ロジック

int applicationEntry(int argc, char** argv) {
  initializeCameraSystem();
  initializePlateRecognition();
  
  char user_input;
  char detected_plate[32] = {0};
  
  while(std::cin >> user_input) {
    switch(user_input) {
      case '1':
        executeImageCapture();
        break;
      case '2':
        memset(detected_plate, 0, sizeof(detected_plate));
        int recognition_result = processPlateRecognition(
          IMAGE_STORAGE_PATH, detected_plate);
        outputRecognitionResult(recognition_result, detected_plate);
        break;
      case 's':
        cleanupResources();
        return 0;
      default:
        outputErrorMessage();
        break;
    }
  }
  return 0;
}

実装の要点

・1280×720解像度設定による認識精度向上
・QRコード認識とナンバープレート認識の統合処理
・画像データの適切な保存パス管理
・リソースの効率的な解放処理

タグ: OpenHarmony Hi3516DV300 EasyPR OpenCV ナンバープレート認識

5月27日 06:31 投稿