張榮
OpenHarmony 知識(shí)體系工作組
介紹
本車牌識(shí)別項(xiàng)目是基于開(kāi)源項(xiàng)目 EasyPR(Easy to do Plate Recognition)實(shí)現(xiàn)。EasyPR 是一個(gè)開(kāi)源的中文車牌識(shí)別系統(tǒng),基于 OpenCV 開(kāi)源庫(kù)開(kāi)發(fā)。本項(xiàng)目使用潤(rùn)和 HiSpark Taurus AI Camera(Hi3516DV300) 攝像頭開(kāi)發(fā)板套件(以下簡(jiǎn)稱 Hi3516)實(shí)現(xiàn)拍照車牌并顯示識(shí)別結(jié)果。采用的系統(tǒng)是 OpenAtom OpenHarmony (簡(jiǎn)稱“OpenHarmony”) 3.1 Release 小型系統(tǒng)。首先將 Hi3516 中的攝像頭對(duì)準(zhǔn)車牌,其距離約為 60cm~70cm 如下所示:運(yùn)行程序后按下 1 拍照、按 2 輸出識(shí)別結(jié)果如下所示:
開(kāi)發(fā)流程
本車牌識(shí)別項(xiàng)目使用 OpenHarmony 中的媒體子系統(tǒng)實(shí)現(xiàn)。代碼基于停車場(chǎng)景下的本地車牌識(shí)別。進(jìn)行講解,其代碼結(jié)構(gòu)如下:三方庫(kù)移植
EasyPR 實(shí)現(xiàn)是基于 OpenCV 實(shí)現(xiàn),因此實(shí)現(xiàn) EasyPR 首先得移植 OpenCV。移植的方式采用 Gn 調(diào)用 Shell 腳本,Shell 腳本調(diào)用 Makefile 實(shí)現(xiàn)。下面介紹移植的大致流程,具體細(xì)節(jié)可參考小型系統(tǒng)上運(yùn)行開(kāi)源項(xiàng)目車牌識(shí)別及移植 opencv 庫(kù)。├── BUILD.gn
├── include
│ ├── camera.h // 攝像頭定義
│ ├── local_net_communication.h // 設(shè)備協(xié)同主要功能定義
│ ├── local_net_def.h // 設(shè)備協(xié)同打印日志
│ ├── local_net_dlist.h // 設(shè)備協(xié)同設(shè)備列表定義
│ ├── local_net_message.h // 設(shè)備協(xié)同傳輸消息定義
│ ├── local_net_udp.h // 設(shè)備協(xié)同udp協(xié)議定義
│ ├── local_net_utils.h // 設(shè)備協(xié)同通用工具定義
│ ├── log.h // 打印日志定義
│ └── wpa_work.h // wifi設(shè)置定義
└── src
├── base64.cpp // 圖片轉(zhuǎn)base64格式功能代碼
├── camera.cpp // 攝像頭實(shí)現(xiàn)
├── local_net_communication.c // 設(shè)備協(xié)同主要功能實(shí)現(xiàn)
├── local_net_dlist.c // 設(shè)備協(xié)同設(shè)備列表實(shí)現(xiàn)
├── local_net_message.c // 設(shè)備協(xié)同傳輸消息實(shí)現(xiàn)
├── local_net_udp.c // 設(shè)備協(xié)同udp協(xié)議實(shí)現(xiàn)
├── local_net_utils.c // 設(shè)備協(xié)同通用工具實(shí)現(xiàn)
├── main.cpp // 主程序
└──wpa_work.c//wifi設(shè)置實(shí)現(xiàn)
移植OpenCV
下載源碼
獲取源碼將 OpenCV 庫(kù)源碼放在 OpenHarmony 根目錄下的 third_party 下:
生成Makefile
在 OpenCV 源碼根目錄新建 build 目錄生成 Makefile 文件:
使用 cmake-gui 來(lái)配置編譯環(huán)境:
cd build
make-gui..
顯示的 UI 界面如下圖:
點(diǎn)擊 Configure 進(jìn)行配置,選擇第四個(gè)選項(xiàng)進(jìn)行配置,如下圖:
配置工具鏈:
點(diǎn)擊 Generate 生成 Makefile。
創(chuàng)建 Shell 腳本
在 OpenCV 源碼根目錄新增 build_opencv.sh:
touch build_opencv.sh
chmod 777 build_opencv.sh
vim build_opencv.sh
##添加如下內(nèi)容
processor=`cat /proc/cpuinfo|grep processor | sort -u | wc -l`
cd build
make -j$processor
cplib/*$1/libs/
創(chuàng)建Gn文件
在 OpenCV 源碼根目錄新增 BUILD.gn 將 OpenCV 庫(kù)加入編譯構(gòu)建:
移植EasyPR
下載源碼
獲取源碼 EasyPR 庫(kù)源碼放在源碼根目錄下的 third_party 下:
生成Makefile
在 EasyPr 源碼根目錄新建 build 目錄:
顯示的 UI 界面如下圖:mkdir build
cd build
cmake-gui..
點(diǎn)擊 Configure 進(jìn)行配置,選擇第四個(gè)選項(xiàng)進(jìn)行配置,如下圖:
配置工具鏈:
點(diǎn)擊 Generate 生成 Makefile。
創(chuàng)建Shell腳本
在 EasyPR 源碼根目錄新增 build_easypr.sh:
創(chuàng)建Gn文件
在 EasyPR 源碼根目錄新增 BUILD.gn 加入至編譯構(gòu)建:
最終 OpenCV 與 EasyPR 在 third_party 目錄如下圖所示:vim BUILD.gn
#BUILD.gn中添加如下內(nèi)容
import("http://build/lite/config/component/lite_component.gni")
import("http://build/lite/ndk/ndk.gni")
root_build = rebase_path(root_build_dir)
build_ext_component("easypr_lib") {
command = "sh build_easypr.sh $root_build"
exec_path = "$root_build/../../../third_party/EasyPR"
}
lite_component("easypr") {
deps = [
"http://third_party/opencv:opencv",
":easypr_lib"
]
features = []
}
在 OpenHarmony 實(shí)現(xiàn) EasyPR 需要主要分為如下三步:
1.GN 構(gòu)建,將 EasyPR 加入編譯構(gòu)建;
2.拍照,調(diào)用 OpenHarmony 拍照接口,拍攝車牌;
3.EasyPR 本地識(shí)別,調(diào)用 EasyPR 識(shí)別車牌接口并返回識(shí)別結(jié)果。
GN構(gòu)建
GN 構(gòu)建中包含了 EasyPR 的頭文件路徑 、鏈接 EasyPR 動(dòng)態(tài)庫(kù)、編譯依賴 EasyPR。如下所示:
拍照
拍照功能是基于官方文檔拍照開(kāi)發(fā)指導(dǎo)開(kāi)發(fā)的,其 demo 樣例在如下目錄:
在停車場(chǎng)景中二維碼識(shí)別與車牌識(shí)別共用同一份拍照代碼 ,為提高二維碼識(shí)別率在拍照初始化時(shí)須將分辨率設(shè)置為 1280*720。該改動(dòng)在進(jìn)行車牌識(shí)別時(shí)不會(huì)影響 ,初始化拍照代碼如下圖:
設(shè)置照片保存路徑在文件 camera.h 下:
因?yàn)樵谕\噲?chǎng)景中二維碼掃碼與車牌識(shí)別都會(huì)調(diào)用拍照接口,因此使用 s_runAi 作區(qū)分:
int main(int argc,char **argv)
{
int ret;
char licensePlate[32] = {0};
char input;
InitCamera();
PlateInit();
while(cin >> input) {
switch (input) {
case '1':
RunAICamera(); // 拍照
break;
case '2':
memset(licensePlate, 0, sizeof(licensePlate));
ret = GetPlateString(IMG_PATH, licensePlate); // 識(shí)別車牌
SAMPLE_INFO("ret -> %d, licensePlate->%s", ret, licensePlate);
break;
case 's':
PlateDeinit();
ExitCamera();
return 0;
default:
SAMPLE_ERROR("input Error");
break;
}
}
return 0;
}
進(jìn)行拍照后會(huì)進(jìn)入拍照數(shù)據(jù)處理,當(dāng) s_runAi 為 false 說(shuō)明是二維碼識(shí)別,直接調(diào)用二維碼識(shí)別接口即可。當(dāng) s_runAi 為 true 時(shí)須將拍照的數(shù)據(jù)保存為圖片:
將拍照數(shù)據(jù)以圖片保存路徑為“/sdcard/CaptureAi.jpg” 。
EasyPR本地識(shí)別
編寫(xiě)主程序 main.cpp 設(shè)置程序功能為按 1 拍照、按 2 顯示結(jié)果 :
編譯燒錄
前文大致概括了 OpenCV 和 EasyPR 的移植步驟,更詳細(xì)的關(guān)于環(huán)境搭建、燒錄以及項(xiàng)目源碼構(gòu)建的步驟,請(qǐng)查看參考文章本地車牌識(shí)別。
總結(jié)
編寫(xiě)車牌識(shí)別庫(kù)對(duì)外接口,相關(guān)接口使用可以參考作者文章介紹;本文章的源碼參考本地車牌識(shí)別。豐富多樣的 OpenHarmony 開(kāi)發(fā)樣例離不開(kāi)廣大合作伙伴和開(kāi)發(fā)者的貢獻(xiàn),如果你也想把自己開(kāi)發(fā)的樣例分享出來(lái),歡迎把樣例提交到 OpenHarmony 知識(shí)體系 SIG 倉(cāng)來(lái),共建開(kāi)發(fā)樣例請(qǐng)參考如何共建開(kāi)發(fā)樣例。車牌識(shí)別器(OpenCV版本)
https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/GreyWolf_ImageRecognition_LocalAI
車牌識(shí)別器
https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/GreyWolf_EasyPR/readme.md
拍照開(kāi)發(fā)指導(dǎo)
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/guide/device-camera-control-demo-photoguide.md
作者文章列表
https://gitee.com/link?target=https%3A%2F%2Fwww.cnblogs.com%2Fsubconscious%2Fp%2F3979988.html
源碼參考
https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/GreyWolf_ImageRecognition_LocalAI
構(gòu)建開(kāi)發(fā)樣例
https://gitee.com/openharmony-sig/knowledge/blob/master/docs/co-construct_demos/README_zh.md
-
開(kāi)源
+關(guān)注
關(guān)注
3文章
3380瀏覽量
42601 -
車牌識(shí)別
+關(guān)注
關(guān)注
5文章
82瀏覽量
15677 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41418 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3731瀏覽量
16425
原文標(biāo)題:三步就能在OpenHarmony中實(shí)現(xiàn)車牌識(shí)別
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論