概要
本プロジェクトは、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コード認識とナンバープレート認識の統合処理
・画像データの適切な保存パス管理
・リソースの効率的な解放処理