张荣
openharmony 知识体系工作组
介绍
本车牌识别项目是基于开源项目 easypr(easy to do plate recognition)实现。easypr 是一个开源的中文车牌识别系统,基于 opencv 开源库开发。本项目使用润和 hispark taurus ai camera(hi3516dv300) 摄像头开发板套件(以下简称 hi3516)实现拍照车牌并显示识别结果。采用的系统是 openatom openharmony (简称“openharmony”) 3.1 release 小型系统。首先将 hi3516 中的摄像头对准车牌,其距离约为 60cm~70cm 如下所示:
运行程序后按下 1 拍照、按 2 输出识别结果如下所示:
开发流程
本车牌识别项目使用 openharmony 中的媒体子系统实现。代码基于停车场景下的本地车牌识别。进行讲解,其代码结构如下: 三方库移植
easypr 实现是基于 opencv 实现,因此实现 easypr 首先得移植 opencv。移植的方式采用 gn 调用 shell 脚本,shell 脚本调用 makefile 实现。 ├── build.gn├── include │ ├── camera.h // 摄像头定义│ ├── local_net_communication.h // 设备协同主要功能定义│ ├── local_net_def.h // 设备协同打印日志│ ├── local_net_dlist.h // 设备协同设备列表定义│ ├── local_net_message.h // 设备协同传输消息定义│ ├── local_net_udp.h // 设备协同udp协议定义│ ├── local_net_utils.h // 设备协同通用工具定义│ ├── log.h // 打印日志定义│ └── wpa_work.h // wifi设置定义└── src ├── base64.cpp // 图片转base64格式功能代码 ├── camera.cpp // 摄像头实现 ├── local_net_communication.c // 设备协同主要功能实现 ├── local_net_dlist.c // 设备协同设备列表实现 ├── local_net_message.c // 设备协同传输消息实现 ├── local_net_udp.c // 设备协同udp协议实现 ├── local_net_utils.c // 设备协同通用工具实现 ├── main.cpp // 主程序 └── wpa_work.c // wifi设置实现 下面介绍移植的大致流程,具体细节可参考小型系统上运行开源项目车牌识别及移植 opencv 库。 移植opencv
下载源码
获取源码将 opencv 库源码放在 openharmony 根目录下的 third_party 下:
生成makefile
在 opencv 源码根目录新建 build 目录生成 makefile 文件:
使用 cmake-gui 来配置编译环境:
cd buildmake-gui ..
显示的 ui 界面如下图:
点击 configure 进行配置,选择第四个选项进行配置,如下图:
配置工具链:
点击 generate 生成 makefile。
创建 shell 脚本
在 opencv 源码根目录新增 build_opencv.sh:
touch build_opencv.shchmod 777 build_opencv.shvim build_opencv.sh##添加如下内容#!/bin/shprocessor=`cat /proc/cpuinfo|grep processor | sort -u | wc -l`cd buildmake -j$processorcp lib/* $1/libs/ 创建gn文件
在 opencv 源码根目录新增 build.gn 将 opencv 库加入编译构建:
移植easypr
下载源码
获取源码 easypr 库源码放在源码根目录下的 third_party 下:
生成makefile
在 easypr 源码根目录新建 build 目录:
mkdir buildcd buildcmake-gui .. 显示的 ui 界面如下图:
点击 configure 进行配置,选择第四个选项进行配置,如下图:
配置工具链:
点击 generate 生成 makefile。
创建shell脚本
在 easypr 源码根目录新增 build_easypr.sh:
创建gn文件
在 easypr 源码根目录新增 build.gn 加入至编译构建:
vim build.gn#build.gn中添加如下内容import(//build/lite/config/component/lite_component.gni)import(//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 = [ //third_party/opencv:opencv, :easypr_lib ] features = []} 最终 opencv 与 easypr 在 third_party 目录如下图所示:
在 openharmony 实现 easypr 需要主要分为如下三步:
1.gn 构建,将 easypr 加入编译构建;
2.拍照,调用 openharmony 拍照接口,拍摄车牌;
3.easypr 本地识别,调用 easypr 识别车牌接口并返回识别结果。
gn构建
gn 构建中包含了 easypr 的头文件路径 、链接 easypr 动态库、编译依赖 easypr。如下所示:
拍照
拍照功能是基于官方文档拍照开发指导开发的,其 demo 样例在如下目录:
在停车场景中二维码识别与车牌识别共用同一份拍照代码 ,为提高二维码识别率在拍照初始化时须将分辨率设置为 1280*720。该改动在进行车牌识别时不会影响 ,初始化拍照代码如下图:
设置照片保存路径在文件 camera.h 下:
因为在停车场景中二维码扫码与车牌识别都会调用拍照接口,因此使用 s_runai 作区分:
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); // 识别车牌 sample_info(ret -> %d, licenseplate->%s, ret, licenseplate); break; case 's': platedeinit(); exitcamera(); return 0; default: sample_error(input error); break; } } return 0;}
进行拍照后会进入拍照数据处理,当 s_runai 为 false 说明是二维码识别,直接调用二维码识别接口即可。当 s_runai 为 true 时须将拍照的数据保存为图片:
将拍照数据以图片保存路径为“/sdcard/captureai.jpg” 。
easypr本地识别
编写主程序 main.cpp 设置程序功能为按 1 拍照、按 2 显示结果 :
编译烧录
前文大致概括了 opencv 和 easypr 的移植步骤,更详细的关于环境搭建、烧录以及项目源码构建的步骤,请查看参考文章本地车牌识别。
总结
编写车牌识别库对外接口,相关接口使用可以参考作者文章介绍;本文章的源码参考本地车牌识别。丰富多样的 openharmony 开发样例离不开广大合作伙伴和开发者的贡献,如果你也想把自己开发的样例分享出来,欢迎把样例提交到 openharmony 知识体系 sig 仓来,共建开发样例请参考如何共建开发样例。 车牌识别器(opencv版本)
https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/greywolf_imagerecognition_localai
车牌识别器
https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/greywolf_easypr/readme.md
拍照开发指导
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
构建开发样例
https://gitee.com/openharmony-sig/knowledge/blob/master/docs/co-construct_demos/readme_zh.md
3GPP发布5G标准SA方案,5G商用开启冲刺模式
纸张表面缺陷检测的几种方法
巴塞罗那相约:诺基亚8骁龙835,2K屏!OPPOFind9充电仅10分钟,4k屏!
电动汽车公司 Lucid Motors证实 :目前正考虑在中国建厂的可能性
SSD硬盘保持最佳状态的一些最佳做法
基于OpenCV开源库开发的在OpenHarmony中实现车牌识别
带大家一起用数据去解读其中最值得看的影片
找方案 | 基于NUVOTON MA35D1 在OpenWRT系统的 IP CAM方案
2018全球显示屏与led市场怎么样?看看数据就知道了
超星未来基于自研Al芯片的NM10
怎么去设计一种基于AMESim的窨井清挖机械手液压系统呢?
软密封蝶阀的特点_软密封蝶阀的优缺点
线阵音响连接方法_线阵音响组合方法
从四个角度介绍EMC的设计技巧
监视视频性能指标的影响因素与优化方法分析
到2022年将有65%的数据会在数据边缘中心进行存储和处理
介绍关于SRAM读写中“写操作”的分析
8051单片机实现高速串行通信的设计
ADI:这些创新将影响我们2018年的生活
荧光灯不容易启动怎么回事