0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

项目分享|基于ELF 1开发板的车牌识别系统

ElfBoard 2024-03-12 09:22 次阅读

该项目选用ElfBoard ELF 1开发板作为核心硬件平台,利用USB接口连接的摄像头捕捉并识别车牌信息。一旦车牌成功识别,系统会触发绿灯指示,并将识别所得的车牌号码实时传输至手机APP。车牌识别技术方面,借助了百度提供的OCR(光学字符识别)服务来确保准确高效地读取车牌数据。同时,手机APP则是采用Java编程语言进行开发,可以便捷地接收和查看识别结果。

一、车牌识别的实现方法

1、车牌识别平台简介

本次车牌识别的实现方案是通过百度智能云平台进行实现,具体实现方法如下:进入百度智能云网页- >选择文字识别- > 车牌识别

wKgaomXq05eAEdOaAAHXdqQuotM133.png

进入车牌识别页面之后可通过阅读技术文档来学习车牌识别的使用方法。

2、安装 OpenSSL

因为百度智能云是通过libcurl的https进行访问,而https的访问需要openSSL的支持,所以先编译OpenSSL。

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz tar xvf openssl-1.1.1a.tar.gz ./config make sudo make install

3、安装curl

wget https://curl.se/download/curl-7.71.1.tar.bz2 tar -xjf curl-7.71.1.tar.bz2 cd curl-7.71.1/ ./configure --prefix=$PWD/_INSTALL_ARM --host=arm-linux-gnueabihf --with-openssl #./configure --prefix=$PWD/_INSTALL_GCC --with-openssl 为了在本地运行用GCC编译 make make install

4、车牌识别过程

(在做本次步骤之前请先去阅读百度智能云车牌识别的使用方法)

在本地实现之前可通过平台提供的在线验证方法进行验证,如下图,需要在旁边输入access_token(通过阅读文档可知怎么获取)和一张车牌图片的base64 编码的字符串即可进行在线识别。

wKgaomXvqR6AMdU8AAGpZGBiGrE315.png

本地实现车牌识别的方法需要将识别代码拷贝到本地,并需要实现一个将图片转换为base64编码的函数,详细代码如下:

wKgaomXvw_WARedSAACXZ6vsz2k413.png

wKgaomXvxAqAdpDuAAC7hTBIjec090.pngwKgaomXvxBmAAUHTAADSwjSxRqg032.png

编译

gcc demoCar.c -I ./curl-7.71.1/_INSTALL_GCC/include/ -L ./curl-7.71.1/_INSTALL_GCC/lib/ -l curl

编译完成将文件通过scp拷贝到ELF 1开发板进行运行即可,这样就可以将本地的车牌图片通过HTTPS发送到百度智能云进行识别,并将识别结果返回完成车牌识别。

注意:这里运行时可能会出现CA证书验证失败

root@ELF1:~# ./a.out OK:60

只需运行 date --s="2024-01-12 21:40:00"将时间设置正确即可。


二、移植 mjpg-streamer

在前面一个章节实现了对本地车牌图片的的识别,那如果需要通过摄像头进行车牌识别就需要借助 mjpg-streamer来实现,采用USB摄像头进行识别。

关于什么是 mjpg-streamer 我这里就不在解释,大家可以自行查阅资料进行了解,这里只介绍一下 mjpg-streamer 移植到 ELF 1开发板的过程。

1、编译 jpeg

(1)下载 jpeg 源码压缩包网址:http://www.ijg.org/files/

(2)tar -xvf jpegsrc.v8b.tar.gz

(3)编译配置

cd jpeg-8d ./configure --prefix=$PWD/_INSTALL --host=arm-linux-gnueabihf make -j8 make install

2、编译mjpg-streamer

(1)下载 mjpg-streamer 源码包

网址:https://sourceforge.net/projects/mjpg-streamer/

svn checkout https://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code

(2)tar -xvfmjpg-streamer.tar.gz

(3)配置

cd mjpg-streamer-code/mjpg-streamer/plugins/input_uvc vim Makefile

打开 Makefile 文件按照下图进行修改:

wKgZomXvqxWAN57-AAFP8ADHbjI563.png

(4)编译mjpg-streamer

因为mjpg-streamer默认是用GCC进行编译,所以要先将GCC改成自己的交叉编译工具,先安装需要用到的库。

sudo apt install graphicsmagick-imagemagick-compat sudo apt install imagemagick-6.q16 sudo apt install imagemagick-6.q16hdri

更改GCC有两种方法:

方法一:

cd ~/mjpg-streamer-code/mjpg-streamer make CC=arm-linux-gnueabihf-gcc

方法二:

find -name "Makefile" -exec sed -i "s/CC = gcc/CC = arm-linux-gnueabihf-gcc/g" {} \; grep "arm-linux-gnueabihf-gcc" * -nR

搜索当前目录及其子目录下的所有Makefile文件,并将Makefile里的CC变量设置为arm-linux-gnueabihf-gcc。(注:arm-linux-gnueabihf-gcc 需要换成自己的交叉编译工具。)

如下图所示所有目录下的Makefile中的CC都等于设置的交叉编译工具。

wKgaomXvrAaAJElXAAEL4r9B0yE158.png

做完上面这些步骤之后编译代码:

make -j8

编译完成后会生成下图文件

wKgZomXvrD6AMYlvAAB2Q1vqByw098.png

.so :动态库

mjpg_streamer:提供可执行命令

www:摄像头输出的网页

(5)移植到ELF 1开发板

scp -r mjpg-streamer/ root@192.168.0.106:~

(6)验证功能

登录ELF 1开发板,运行mjpg_streamer

cd mjpg-streamer export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/mjpg-streamer ./mjpg_streamer

wKgZomXvrIyAKAFYAABUWp49Y4I810.png

当开发板运行mjpg_streamer成功后,在浏览器中输入开发板的IP地址和8080端口号,比如我的是192.168.0.106:8080,点击Stream选项就会出现摄像头中的实时画面,如下图所示。

wKgaomXvrLSAK8EEAAZBa6DIIUI201.png

这样就完成了mjpg_streamer 的移植,后续就可以mjpg_streamer实现一些具体的需求,比如打开摄像头视频

mjpg_streamer -i "input_uvc.so -d /dev/video2 -f 30 -q 90 -n" -o "output_http.so -w /opt/www"

截取摄像头中的画面:

wget http://192.168.0.106:8080/?action=snapshot -O ./1.jpg

在这里就可以和前面车牌识别结合起来了,比如摄像头里面的画面是一张车牌信息,通过截取摄像头中的实时画面到本地,然后上传到百度智能云的后台进行识别,至此就完成通过摄像头进行车牌识别。


三、Android APP的实现

Android APP 的实现很简单,主要功能就是将识别成功的车牌号在APP上面显示。具体的实现方法是当ELF 1开发板成功识别车牌后,通过 Socket 将车牌发送到 Android APP 上面即可。由于这部分代码比较简单,大致如下。

1、Android 端XML代码实现

XML 这部分只实现了两个功能,Button 用来显示车牌号的提示,TextView用来显示识别的车牌号。

2、 Android端Socket实现

private Handler handler; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState)

{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.text); handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg)

{ super.handleMessage(msg); Bundle bundle = msg.getData(); String receivedMessage = bundle.getString("msg");

textView.setText(receivedMessage); } }; }

new Thread(new Runnable()

{ @Override public void run() { try { Socket client = new Socket("192.168.0.104", 8374); InputStream inputStream = client.getInputStream();

while (true) { byte[] data = new byte[128]; int len = inputStream.read(data); if (len > 0) { String str = new String(data, 0, len); Message message = new Message(); Bundle bundle = new Bundle(); bundle.putString("msg", str); message.setData(bundle); } } } catch (IOException e) { e.printStackTrace(); } }).start();

上面这段代码就实现了通过Socket接收来自开发板的车牌数据并将显示到TextView。

3、ELF 1开发板端实现

开发板端主要就是将识别成功的车牌号码通过Socket发送到Android APP上面,代码如下:

int main(int argc, char *argv[]) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { std::cerr << "Error creating socket" << std::endl; return 1; } struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = inet_addr("192.168.0.104"); serv_addr.sin_port = htons(8374); if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) return 1; if (listen(sockfd, 5) < 0) return 1;

struct sockaddr_in cli_addr;

socklen_t clilen = sizeof(cli_addr); int newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);

if (newsockfd < 0) std::cerr << "Accept failed" << std::endl; const char* reply = match[1].str().c_str(); int bytes_sent = send(newsockfd, reply, strlen(reply), 0); if (bytes_sent < 0) std::cerr << "Error sending data" << std::endl; close(newsockfd); close(sockfd); return 0; }

Android APP部分就介绍结束,具体的运行界面效果如下图所示:

wKgZomXvrZCAOEGDAABjFpRrcLw909.png

四、总结

整个项目的识别过程如下图所示,首先运行程序,启动摄像头运行,然后会获取摄像头中的实时画面进行识别,识别成功就会将车牌的关键字检索出来上传到手机APP上面,这就是整个项目的关键运行流程。

wKgZomXvrbGACGyMAADKQyANxr4324.png

上述全部内容由ElfBoard的共创官提供,所有分享内容仅供学习交流使用,严禁任何商业用途。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4983

    文章

    18286

    浏览量

    288492
  • 开发板
    +关注

    关注

    25

    文章

    4434

    浏览量

    94018
  • 识别系统
    +关注

    关注

    1

    文章

    130

    浏览量

    18687
  • 嵌入式应用
    +关注

    关注

    0

    文章

    57

    浏览量

    18385
收藏 人收藏

    评论

    相关推荐

    基于LabVIEW的车牌识别系统

    又没人做过基于LabVIEW的车牌识别系统或类似的?
    发表于 06-11 15:32

    【OK210申请】基于嵌入式的车牌识别系统

    申请理由:我是一名在校学生,最近在完成基于嵌入式的车牌识别系统的设计,处理器你用Cortex-A8处理器,该处理器在市面上较贵,作为学生买不起,所以想申请一快,为了自己能够更好的学习嵌入式项目描述
    发表于 07-03 16:52

    【TL6748 DSP申请】基于DSP的车牌识别系统

    有机会玩TMS320F项目描述:用TMS320C6748搭载摄像头实现车牌自动识别系统,基于模糊控制,图像分割、模式识别等理论,通过对采集的数据进行分析扫描,自动补全不全或污损的
    发表于 09-09 16:59

    怎么用FPGA做车牌识别系统

    最近在做毕业设计,要求用FPGA,原本打算做车牌识别系统,但是太难了,大家有没有好的想法。。
    发表于 11-25 23:23

    基于labview vision的机动车车牌识别系统

    机动车车牌识别系统,内附子VI打开密码
    发表于 02-26 19:35

    【创龙TMS320C665x开发板试用】应用:车牌识别-结项

    。闲话说罢,开始今天的正题。基于创龙TMS320C665x开发板车牌识别摘要 基于现在市场上已存在的车牌识别系统的原理,利用创龙TMS32
    发表于 05-01 16:41

    【Rico Board申请】基于SoC的车牌识别系统

    最近导师在外面公司承接的一个车牌识别系统其实还是非常适合用SoC作为硬件平台来完成这个项目;3.本人预期的设想是在SD卡上装入一个ubuntu,在里面再植入opencv的开发环境,
    发表于 11-10 10:12

    【MediaTek X20开发板申请】小区车牌自动识别系统

    项目名称:小区车牌自动识别系统试用计划:MediaTek X20 开发板是一款诚迈科技和联发科技联合发布的符合96board规范的开源硬件,具有非常强大的运算能力和多媒体处理能力最新的
    发表于 12-29 17:05

    【HarmonyOS HiSpark AI Camera】车牌识别系统

    项目名称:车牌识别系统试用计划:申请理由本人在嵌入式开发行业从事了五年的开发经验,在智能家居,无线mesh网络领域拥有丰富的经验。并且自学A
    发表于 11-18 18:15

    怎么实现基于MATLAB的车牌识别系统的设计?

    一个完整的牌照识别系统包括哪些单元?怎么实现基于MATLAB的车牌识别系统的设计?
    发表于 05-12 07:04

    怎么实现基于STM32F103单片机的车牌识别图像处理识别系统的设计?

    STM32的主要优点是什么?怎么实现基于STM32F103单片机的车牌识别图像处理识别系统的设计?
    发表于 09-29 06:29

    基于MATLAB的车牌识别系统的研究

    基于MATLAB的车牌识别系统的研究 1 引言     车辆牌照是机动车唯一的管理标识符号,在交通管理中具有不可替代的作用,因此车辆牌照识别系统
    发表于 12-10 10:29 2887次阅读
    基于MATLAB的<b class='flag-5'>车牌</b><b class='flag-5'>识别系统</b>的研究

    车牌识别技术的发展及意义_车牌识别系统原理介绍

    本文主要介绍了车牌识别系统原理、车牌识别技术的意义、车牌识别技术应用表现和国内
    发表于 01-02 15:12 1.6w次阅读
    <b class='flag-5'>车牌</b><b class='flag-5'>识别</b>技术的发展及意义_<b class='flag-5'>车牌</b><b class='flag-5'>识别系统</b>原理介绍

    基于MATLAB的车牌识别系统

    基于MATLAB的车牌识别系统设计说明。
    发表于 04-16 09:30 16次下载

    基于LABVIEW的车牌识别系统资料

    基于LABVIEW的车牌识别系统资料
    发表于 01-11 18:16 63次下载