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

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

3天内不再提示

基于树莓派4B设计的智慧停车场(华为云在线车牌识别接口)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-07-12 16:47 次阅读

1. 项目介绍

车牌识别系统是计算机视频图像识别技术在车辆牌照识别中的一种经典应用,现在高速电子收费(ETC),违规驾驶、超速驾驶、停车场自动收费系统,等等很多场景都用到了车牌识别技术。

这篇文章就利用华为云的人工智能分类里的车牌号识别接口,快速搭建一个停车场自动收费系统,硬件采用树莓派开发板,摄像头采用普通的免驱USB摄像头,使用超声波测距模块检测是否有车辆靠近,车牌识别接口采用的是在线的方式;软件后台、UI界面采用QT、C++设计,支持跨平台,比较方便,代码一次写完,主流平台都可以编译运行。

本项目只是为了演示车牌号识别接口的使用,快速搭建了一个应用场景,很多细节还没考虑完善。

识别思路: 使用两个USB摄像头当做进口与出口,分别使用超声波测距模块不断测量摄像头前方的物体距离,当检测到车辆靠近的时候,读取当前摄像头的一帧数据,通过华为云的车牌号识别接口进行识别,返回识别结果;如果是入口摄像头,那么就将识别的车牌存放到数据库,并记录当前入场时间,如果是出口,就与当前数据库里的车牌数据进行对比,找到车牌入场的时间,与当前时间进行相减得到停车时间,再根据停车场设置的计费规则,完成费用提示,语音播报,告诉车主需要付款多少钱。

image-20211227011717512

image-20211227011113372

image-20211227011134316

2. 配置华为云接口

2.1 开通车牌识别服务

当前体验的是在线API车牌接口,需要先开通车牌识别服务,才可以使用接口(需要先注册华为云账号登录)。

车牌识别服务开通地址: https://console.huaweicloud.com/ocr/?region=cn-north-4#/ocr/overview

image-20211226231518223

接口的使用计费说明页面: https://www.huaweicloud.com/pricing.html?tab=detail#/ocr

image-20211226231637159

可以看到,如果使用在线API接口实现车牌识别,每月免费1000次,作为体验来讲已经足够了。

2.2 车牌识别接口使用介绍

在线文档地址: https://support.huaweicloud.com/api-ocr/ocr_03_0040.html

在这个页面可以看到在线请求的接口地址,参数、响应结果等详细介绍。

image-20211226232044413

如果想快速体验效果,可以直接使用在线调试功能,这个功能非常好用,可以快速体验各种接口,参数的功能。

在线调试地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=OCR&api=RecognizeLicensePlate

准备一张待测试识别的车牌:

image-20211226232703680

使用接口调试:

image-20211226233107253

调试的时候需要填入图片的base64编码,可以直接使用浏览器自带的功能实现。

官网文档: https://support.huaweicloud.com/ocr_faq/ocr_01_0032.html

image-20211226234844770

实操:

image-20211226234944137

2.3 接口总结

请求方式: post
 ​
 URL地址格式: POST https://{endpoint}/v2/{project_id}/ocr/license-plate
 ​
 实际地址: (下面填的是我的项目ID,需要替换成自己,服务器域名也是一样)
 https://ocr.cn-north-4.myhuaweicloud.com/v2/0e5957be8a00f53c2fa7c0045e4d8fbf/ocr/license-plate
 ​
 请求头: 
 {
  "User-Agent": "API Explorer",
  "X-Auth-Token": "******", 这里填Token
  "Content-Type": "application/json;charset=UTF-8"
 }
 ​
 ​
 请求体:
 {
  "image": "/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAMCAgMCAgMDAwME.........这里是图片的base64编码,非常长,这里就省略了,明白意思就行....."
 }
 ​
 响应头:
 {
  "Darklaunch-Rule-Name": "s-bdc8-1254-202112061537",
  "Server": "api-gateway",
  "X-Request-Id": "6b9a88702fe419acd8b638d35a9bf523",
  "Connection": "keep-alive",
  "X-ModelArts-Trace": "6b9a88702fe419acd8b638d35a9bf523",
  "Content-Length": "544",
  "X-ModelArts-Latency": "100",
  "Date": "Sun, 26 Dec 2021 15:29:46 GMT",
  "Instance-Request-Count": "1",
  "Content-Type": "application/json"
 }
 ​
 响应体:
 {
  "result": [
   {
    "plate_number": "京A33333",
    "plate_color": "blue",
    "plate_location": [
     [
      236,
      331
     ],
     [
      882,
      331
     ],
     [
      882,
      542
     ],
     [
      236,
      542
     ]
    ],
    "confidence": 0.9964
   }
  ]
 }

2.4 接口参数解释

上面2.3小节里总结了接口地址一些详细参数,这里把接口里的一些重要参数解释一遍。

车牌识别的URL:

POST https://{endpoint}/v2/{project_id}/ocr/license-plate

endpoint 是指定承载REST服务端点的服务器域名或IP,不同服务不同区域的endpoint不同,可以从终端节点中获取。

例如,OCR服务在“华北-北京四”区域的 “endpoint” 为“ocr.cn-north-4.myhuaweicloud.com”。

image-20211227000018117

URL里还有一个project_id参数,这是项目ID,可以从获取项目ID中获取。

image-20211227000326180

请求头里有个比较总要的参数:X-Auth-Token, 华为云上面几乎所有的API接口请求头都需要填X-Auth-Token,获取的方法在这里: https://bbs.huaweicloud.com/blogs/317759 翻到第3小节。

image-20211227000642651

3. 项目实现代码

3.1 车牌识别请求代码

//车牌识别接口
 void Widget::car_distinguish(QImage imag)
 {
     function_select=0;
     QString requestUrl;
     QNetworkRequest request;
 ​
     //存放图片BASE64编码
     QString imgData;
 ​
     //设置请求地址
     QUrl url;
 ​
     //车牌识别请求地址
     requestUrl = QString("https://ocr.%1.myhuaweicloud.com/v2/%2/ocr/license-plate")
             .arg(SERVER_ID)
             .arg(PROJECT_ID);
 ​
     //设置数据提交格式
     request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
 ​
     //将图片进行Base64编码
     imgData = QString(toBase64(imag)); //编码后的图片大小不超过2M
     //设置token
     request.setRawHeader("X-Auth-Token",Token);
 ​
     //构造请求
     url.setUrl(requestUrl);
     request.setUrl(url);
 ​
     QString post_param=QString("{"image": "%1"}").arg(imgData);
 ​
     //发送请求
     manager- >post(request, post_param.toUtf8());
 }

3.2 图片base64编码

/*
 将图片进行base64编码
 */
 QByteArray Widget::toBase64(const QImage &image)
 {
     //将要检测的图片进行BASE64编码
     QByteArray ba;
     QBuffer buffer(&ba);
     buffer.open(QIODevice::WriteOnly);
     //以png格式将图片数据写入ba
     image.save(&buffer,"jpg");
 ​
     buffer.close();
     return ba.toBase64();
 }

3.3 超声波模块驱动代码

#include < linux/kernel.h >
 #include < linux/module.h >
 #include < linux/miscdevice.h >
 #include < linux/fs.h >
 #include < linux/uaccess.h >
 #include < linux/io.h >
 #include < linux/irq.h >
 #include < linux/delay.h >
 #include < linux/workqueue.h >
 #include < linux/gpio.h >
 #include < mach/gpio.h >
 #include < plat/gpio-cfg.h >
 #include < linux/timer.h >
 #include < linux/wait.h >
 #include < linux/sched.h >
 #include < linux/poll.h >
 #include < linux/fcntl.h >
 #include < linux/interrupt.h >
 #include < linux/ktime.h >static unsigned int distance_irq; /*存放中断号*/
 static u32 *GPB_DAT=NULL;
 static u32 *GPB_CON=NULL;
 ​
 /*
 工作队列处理函数: 
 */
 static void distance_work_func(struct work_struct *work)
 {
     u32 time1,time2;
     time1=ktime_to_us(ktime_get()); /*获取当前时间,再转换为 us 单位*//*等待高电平时间结束*/
     while(gpio_get_value(EXYNOS4_GPX1(0))){}
     
     time2=ktime_to_us(ktime_get()); /*获取当前时间,再转换为 us 单位*/printk("us=%dn",time2-time1);  /*us/58=厘米*/
 }
 ​
 /*静态方式初始化工作队列*/
 static DECLARE_WORK(distance_work,distance_work_func);
 ​
 /*
 中断处理函数: 用于检测超声波测距的回波
 */
 static irqreturn_t distance_handler(int irq, void *dev)
 {
     /*调度工作队列*/
     schedule_work(&distance_work);
     return IRQ_HANDLED;
 }
 ​
 static void distance_function(unsigned long data);
 /*静态方式定义内核定时器*/
 static DEFINE_TIMER(distance_timer,distance_function,0,0);
 ​
 /*内核定时器超时处理函数: 触发超声波发送方波*/
 static void distance_function(unsigned long data)
 {
     static u8 state=0;
     state=!state;
     
     /*更改GPIO口电平*/
     if(state)
     {
         *GPB_DAT|=1< < 7;
     }
     else
     {
         *GPB_DAT&=~(1< < 7);
     }
     
     /*修改定时器的超时时间*/
     mod_timer(&distance_timer,jiffies+msecs_to_jiffies(100));
 }
 ​
 static int __init tiny4412_distance_dev_init(void) 
 {
     int err;
     /*1. 映射GPIO口地址*/
     GPB_DAT=ioremap(0x11400044,4);
     GPB_CON=ioremap(0x11400040,4);
 ​
     *GPB_CON&=~(0xF< < 4*7);
     *GPB_CON|=0x1< < 4*7; /*配置输出模式*/
     
     /*2. 根据GPIO口编号,获取中断号*/
     distance_irq=gpio_to_irq(EXYNOS4_GPX1(0));
     
     /*3. 注册中断*/
     err=request_irq(distance_irq,distance_handler,IRQ_TYPE_EDGE_RISING,"distance_device",NULL);
     if(err!=0)printk("中断注册失败!n");
     else printk("中断:超声波测距驱动安装成功!n");
 ​
     /*4. 修改定时器超时时间*/
     mod_timer(&distance_timer,jiffies+msecs_to_jiffies(100));
     
     return 0;
 }
 ​
 static void __exit tiny4412_distance_dev_exit(void) 
 {
     /*5. 注销中断*/
     free_irq(distance_irq,NULL);
 ​
     /*6. 停止定时器*/
     del_timer(&distance_timer);
     
     /*7. 取消IO映射*/
     iounmap(GPB_DAT);
     iounmap(GPB_CON);
     printk("中断:超声波测距驱动卸载成功!n");
 }
 ​
 module_init(tiny4412_distance_dev_init);
 module_exit(tiny4412_distance_dev_exit);
 MODULE_LICENSE("GPL");

审核编辑:汤梓红

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

    关注

    59

    文章

    7437

    浏览量

    258252
  • 摄像头
    +关注

    关注

    59

    文章

    4612

    浏览量

    92909
  • 树莓派
    +关注

    关注

    113

    文章

    1640

    浏览量

    104751
  • 华为云
    +关注

    关注

    3

    文章

    2155

    浏览量

    16808
收藏 人收藏

    评论

    相关推荐

    浅谈新型停车场管理系统的先进性

    的时间进入或离开停车场。相比较以往的IC/ID卡刷卡自动开闸或保安确认开闸,新型停车场管理系统的先进性表现在诸如:蓝牙远距离读卡器、高清摄像机自动时识别车牌号码的自动开闸、RFID标签
    发表于 10-11 10:53

    物联网停车场你知道吗?

    停车场的出现将大大的改变目前这一现状。物联网停车场系统充分运用了物联网识别技术,通过在停车场出入口布置百万级高清的智能车牌
    发表于 01-06 13:45

    智能停车场车牌自动识别系统特点

    了携带卡片而带来的麻烦。  3、出入口无需安排人员值守,节省人工成本,降低管理费用。  4、进出停车场无需刷卡、无需停车,加快车辆进出场速度,避免拥堵。  5、停车场
    发表于 06-13 11:02

    谷歌将推出“智能停车场”项目

      据英国《卫报》报道,为缓解城市停车难题,近日谷歌计划基于Flow服务在俄亥俄州哥伦布市推出“智能停车场”项目。谷歌希望Flow服务实现公共
    发表于 06-28 14:07

    SYN6658语音合成芯片引领停车场收费系统走向巅峰

    之前进行扫码支付,系统接收指令后15分钟内,车辆到达车牌自动识别道闸前,即可自动开启道闸杆放行,智能语音播报“京A B4392,您已缴费,谢谢您的光临!“停车场收费系统语音播报: 欢迎
    发表于 09-01 15:28

    车牌识别PDA是什么?有什么作用?

    停车场出入口堵塞。3、车辆出入场登记车辆进入停车位后,收费员使用ZKC3506车牌识别PDA采集车牌号,形成入场记录。车辆离开时同样依据
    发表于 09-19 15:05

    基于射频识别的智能停车场有什么特点?

    传统的停车场管理系统重点均放在计费、收费管理功能上,关注的是各个车辆进出的时间以便于收费,而在停车场的安全性、运行效率和针对顾客的人性化要求方面考虑得较少。针对目前现状,笔者提出了智能停车场管理系统
    发表于 09-19 07:02

    树莓4B进行开机测试

    、显示器、键盘、鼠标。2、开机测试 有了上面所述的配件,就可以进行树莓4B的开机测试了,首先将TF卡插到树莓派上,注意TF卡接口一面朝向板
    发表于 10-29 09:19

    树莓4B安装及使用

    实验一树莓4B安装及使用目录实验一 树莓4B安装及使用... 1目录... 1一、
    发表于 12-13 06:12

    基于OpenHarmony操作系统的智能停车场

    停车场以车辆出入检测器和门闸控制器组成最小组合,在加入不同的系统后可为停车场景加入更多的功能。车辆出入检测器车辆出入检测器车牌识别车牌
    发表于 06-28 16:54

    智能停车场车牌识别技术系统方案

    系统自动识别进入停车场车辆的号码和车牌特征,验证用户的合法身份,自动比对黑名单库,自动报警,并可对整个停车场情况进行监控和管理,包括出入口管理,内部管理。
    发表于 07-18 11:34 3747次阅读

    智慧停车场管理系统大大提高了停车场的管理水平

    智慧停车管理系统就比较智能,可以对车辆自动识别放行与驶入。 全新智慧停车场管理系统,采用车牌
    发表于 11-26 11:05 1314次阅读

    车牌识别技术在停车场怎样使用

    车牌识别停车场系统由于识别速度快,所以车主不到1秒就能够进入停车场,不需要在经历开车门、取卡等繁琐步骤,简单方便。
    发表于 11-11 10:48 2268次阅读

    停车场车牌识别黑科技是什么样子的

    车牌识别技术是融合图像识别、云计算等多种技术,在停车场中用于对车辆身份的识别
    发表于 11-12 10:13 2970次阅读

    停车场车牌识别摄像机的工作原理及如何选择

    停车场车牌识别摄像机是利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的带有算法的摄像
    的头像 发表于 09-26 10:13 1.3w次阅读