一、功能需求
如图所示,上报时不仅可以手动输入车牌号,还允许拍照自动识别车牌,填充到输入框。

二、思路
拟采用百度AI实现该功能(http://ai.baidu.com/docs#/OCR-API/5116ac95)

根据百度的文档描述,初步明确需要的几个参数为:
1、应用的API Key
2、应用的Secret Key
3、access_token
4、图片数据

官方文档给的提示比较混乱,这一点那一点,刚接触的人会觉得比较晕,我按照自己的思路重新整理了一下。

三、步骤
1、先去百度AI后台创建一个应用,获取到相应的两个KEY
https://console.bce.baidu.com/ai/

2、获取access_token
文档:http://ai.baidu.com/docs#/Auth/top

注意:access_token的有效期为30天,需要每30天进行定期更换;

前端代码

<script>var token = sessionStorage.getItem("accessToken");if (token == null || token == '') {$.ajax({url: "${ctx!}/mobile/index/baidu",type: "GET",dataType: "JSON",data: {},success: function (message) {sessionStorage.setItem("accessToken", message.data.token);},error: function (e) {}});}</script>

后端代码

 /*** 获取百度AI应用数据.** @param map map* @return message*/@CrossOrigin@RequestMapping(value = "/baidu", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic Message getAi(Model map) {Message message = new Message();String url = Constants.BAIDU_AI_TOKEN + clientId + "&client_secret=" + clientSecret + "";String data = HttpUtil.httpRequest(url);String accessToken = JSONObject.parseObject(data).getString("access_token");map.addAttribute("token", accessToken);message.setData(map);message.setSuccess(Boolean.TRUE);return message;}

3、图片数据
文档:http://ai.baidu.com/docs#/OCR-API/0d9adafa (车牌识别所需参数格式要求参考的是该文档)

【image】参数
这里的image我采用的是base64编码。

格式文档:http://ai.baidu.com/docs#/OCR-API/0d9adafa

(1)、注意:图片的base64编码是不包含图片头的,如(data:image/jpg;base64,)

在这一步需要前端获取图片,并将图片转成base64编码,js代码如下:

前端代码

$("#file1").change(function () {var file1 = document.getElementById("file1").files;file1 = validateUp(file1);var url = window.URL.createObjectURL(file1[0]);//转base64var canvas = document.createElement('CANVAS'),ctx = canvas.getContext('2d'),img2 = new Image;img2.crossOrigin = 'Anonymous';img2.onload = function () {var height = img2.height;//console.log("========原始高========" + height);var width = img2.width;//console.log("========原始宽========" + width);if (height > width) {height = img2.width;width = img2.height;//console.log("====" + width + "====转换height========" + height + "===" + height + "==转换width======" + width);}var scale = width / height;//console.log("--比例--" + scale);// 图片宽度压缩var width1 = img2.width;if (width < 500) {width1 = width;} else if (width < 1000) {width1 = width / 2;} else if (width < 2000) {width1 = width / 4;} else if (width < 3000) {width1 = width / 6;} else if (width < 4000) {width1 = width / 8;} else if (width < 5000) {width1 = width / 10;}//console.log("========调整后宽========" + width1);//console.log("========调整后高========" + parseInt(width1 / scale));// 创建属性节点var anw = document.createAttribute("width");anw.nodeValue = width1;var anh = document.createAttribute("height");anh.nodeValue = parseInt(width1 / scale);canvas.setAttributeNode(anw);canvas.setAttributeNode(anh);ctx.drawImage(img2, 0, 0, width1, parseInt(width1 / scale));var base64 = canvas.toDataURL('image/jpeg', 0.1);if (base64 != null && base64 != "" && base64 != "undefined") {var imgData = base64.replace("data:image/jpeg;base64,", "");//imgData = encodeURI(imgData);getLicense(imgData);//console.info("========images========" + JSON.stringify(imgData));}canvas = null;};img2.src = url;})

这里取到的【imgData】就不包含头部信息了。

(2)、图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效

我采用后台去请求接口获取车牌号,所以要将access_token和image传到后台,对image进行urlencode参照的是下图方法:

至此,所需要的4个参数都已准备完毕。

4、后台发起POST请求获取参数

后端代码

/*** 获取车牌号.** @param base64 base64* @param token  token* @param map    map* @return message*/@CrossOrigin@RequestMapping(value = "/getLicense", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic Message getLicense(@RequestParam(value = "base64") String base64, @RequestParam(value = "token")String token, Model map) {Message message = new Message();try {String base = HttpUtil.urlEncode("image", "UTF-8") + "=" +HttpUtil.urlEncode(base64, "UTF-8");String url = Constants.BAIDU_AI_LICENSE;String result = HttpUtil.post(url, token, base);String license = JSONObject.parseObject(result).getJSONObject("words_result").getString("number");if (!Strings.isNullOrEmpty(license)) {map.addAttribute("license", license);message.setData(map);message.setSuccess(Boolean.TRUE);} else {message.setSuccess(Boolean.FALSE);}} catch (Exception e) {message.setSuccess(Boolean.FALSE);}return message;}

DEBUG调试看下数据是否拿到:

四、效果展示

五、注意事项:
1、access_token有有效期,需要定期更换。
2、图片大小限制(分辨率、字节数)。
后台发起请求获取车牌号,一张图片从前台传到后台,再调用百度API,相当于传递两次,图片太大的话会造成访问过慢,用户体验不好。但是图片过小、分辨率压缩的过低,又会降低识别成功率。所以这里对处理图片的参数设置需要自己去把握,更好的平衡利弊。

六、资源
HttpUtil下载地址:https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3

整合百度AI实现手机拍照识别车牌号相关推荐

  1. 安卓手机拍照识别车牌号OCR sdk

    关键词:车牌识别 车牌ocr识别 新能源车牌识别 安卓车牌识别 ios车牌识别 车牌识别已经成为每个城市的车辆管理重点工作之一,有效.准确.及时的车牌识别可以方便警务人员的交通执法.停车场车辆管理等工 ...

  2. Android拍照识别车牌号SDK

    Android拍照识别车牌号SDK Android拍照识别车牌号技术描述 Android拍照识别车牌号是我公司开发的基于移动平台的车牌识别软件开发包,支持android.ios等多种主流移动操作系统. ...

  3. 手机扫描识别车牌号SDK

    手机扫描识别车牌号的功能描述 手机扫描识别车牌号的功能SDK是我公司开发的基于移动平台的车牌识别软件开发包,支持android.ios等多种主流移动操作系统.该产品采用手机.平板电脑摄像头拍摄汽车牌照 ...

  4. Python用百度AI识别车牌号教程(超详细)

    Python用百度AI识别车牌号教程 创建API接口 用浏览器打开http://ai.baidu.com/ 点击右上角的"控制台" 登录账号(没有就注册一个) 点击 产品服务> ...

  5. 票据识别android代码,Android 百度AI开放平台-文字识别-财务票据文字识别

    简单记录一下今天关于百度AI开放平台-文字识别-财务票据文字识别的实现过程 文字识别有对应的Android SDK集成及相关Demo,文档地址如下图: SDK目录图.png 但是SDK中的返回数据字段 ...

  6. 微信小程序+百度AI OCR二代身份证识别

    微信小程序内虽然有OCR识别功能 但是收费是按次计费的,还是选用了百度ai提供的OCR识别二代身份证. // 上传人面像upFileFront:function(e){let type = e.cur ...

  7. 人脸检测颜值软件_AI人脸颜值测颜版下载-百度ai测试颜值人脸识别源码下载v1.0 免费版-西西软件下载...

    百度ai测试颜值人脸识别源码这是由官方百度AI精心打造出来的,这款软件将人脸识别氛围V2和V3两个接口,而且用户使用可以参考相应的文档权限来选择接口类型,让广大用户学习到百度AI人脸识别测颜值相关知识 ...

  8. 手机拍照识别文字的方法分享!错过后悔一年。

    手机拍照识别文字的方法分享!相信很多朋友也都有上公开课的经历,都知道,公开课一般来说都是比较重要的,对于我们提升自己的帮助非常的大,很多小伙伴也是在上课的时候经常时间不够,不知道如何记录,都是通过拍下 ...

  9. 2021爱智先行者-可识别车牌号的智能摄像头

    一 前言 [本文正在参与"2021爱智先行者-征文大赛"活动] EdgerOS 操作系统的优势在于"边缘计算",当我们手上有一些设备的时候,我们可以随心所欲地D ...

最新文章

  1. Asp.Net下通过切换CSS换皮肤
  2. npm install 因网络链接慢 卡住解决方法
  3. selenium2与python自动化1-selenium简介与降级
  4. pandas(二) -- Dataframe创建及索引
  5. sqlplus连接不上oracle,环境变量设置错误导致sqlplus 连接不上oracle
  6. Matlab 格式化字符串sscanf
  7. 操作系统上机题目(多进程2)
  8. public 返回一数组_数组:滑动窗口拯救了你
  9. 使用VS2015编译OpenJDK8
  10. poj 2996 Help Me with the Game 模拟
  11. PowerDesigner生成Oracle数据库时,表名会带引号问题
  12. 【重装系统Win10】U盘安装windows10正版操作系统 - 固体硬盘版(¥4.5-200)
  13. 给小白程序员的建议!
  14. linux dmesg查看时间,查看dmesg中的时间
  15. (转)编辑器_编辑器杂谈(转载)+点评
  16. 让IE6/IE7/IE8浏览器支持CSS3属性
  17. 计算机组老师颁奖词,获奖教师的颁奖词
  18. R语言-将数据按照月份、季度、年份划分及求某个代码(地名、产业名等)对应的累积值
  19. Java中Cookie详解
  20. 给谷歌浏览器添加网页翻译插件

热门文章

  1. IOS APP 隐私政策
  2. 视觉单目标跟踪任务概述
  3. full outer join应用场景
  4. Matlab函数参考
  5. 多个中通快运的物流情况是怎么批量查询并保存到电脑的
  6. Redisson3.10 RCacheMap踩坑记录
  7. Python制作专属有声小说(调用百度语音合成接口)
  8. Admin-UI分布式微服务监控中心
  9. 华氏温度转换为摄氏温度(C语言)
  10. Vin码查询车辆详细信息