调用百度“车牌识别”API接口(go语言实现)

2023-11-04

调用百度的api识别车牌,没有GPU的机器,也没有大量的有标注的车牌数据,所以就只好拿别人现成的车牌识别api接口

具体的识别原理就不说了,只是调别人的接口而已,具体的调用文档百度已经给出:

http://ai.baidu.com/docs#/OCR-API/5116ac95

 

但是我看文档里面好像没有一个是用go调用的例子,所以就自己写了一个go调用的,发http请求到具体的api上获取参数

具体流程:

 

准备工作: 有一个车牌图片的url,这个url能够访问到图片,例子中给出的url是:

https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2181674788,2215933125&fm=26&gp=0.jpg

1.先访问token获取的url,传入appKey和appSecret , 获取 access_token

2.读取上述图片url地址,获取图片的二进制流信息

3.进行base64处理

4.进行urlencode处理

5.传入access_token和第4步的结果,调用车牌识别api,再根据这个token去调用车牌识别的接口

注:返回的数据是json格式,所以写了一些简单的结构体,用来json解析

      用的是免费的接口,注册开发者,创建应用就能调用了,但是每天的调用有上限

 

运行结果:

 

代码:

PlateHandler.go (这里是获取一次token,用token识别一次车牌,但是token的有效期是一个月,不用每次识别都获取新的token,在开发中可以将token的信息存储起来,到期了再去获取新的token)

package main

import (
	"encoding/base64"
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
)

func main() {
	handler := PlateHandler{}

	appKey := "your_appKey"
	secret := "your_appSecret"
	accessToken := handler.GetAccessToken(appKey, secret)
	log.Println("获取到的accessToken:",accessToken)

	pictureUrl := "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2181674788,2215933125&fm=26&gp=0.jpg"
	plate,err:=handler.GetPlate(pictureUrl,accessToken)
	if err!=nil{
		log.Fatal("获取车牌失败",err)
	}
	log.Println("获取到的车牌:",plate)
}

type accessTokenInfo struct {
	AccessToken string `json:"access_token"`
	ExpiresIn   int64  `json:"expires_in""`
}

type WordResult struct {
	Number string `json:"number"`
}
type Data struct {
	WordsResult WordResult `json:"words_result"`
}
type PlateHandler struct {
}

func (handler *PlateHandler) GetAccessToken(appKey string, appSecret string) (accessToken string) {
	url := "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id="+appKey+"&client_secret="+appSecret

	response, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
		return ""
	}
	data, err := ioutil.ReadAll(response.Body)
	if err != nil {
		log.Fatal(err)
		return ""
	}
	info := accessTokenInfo{}
	json.Unmarshal(data, &info)
	log.Print("请求accessToken返回的数据:", string(data))
	return info.AccessToken
}

func (handler *PlateHandler) GetPlate(picture_url string,accessToken string) (plate string, err error) {
	rsp, err := http.Get(picture_url)
	if err != nil {
		log.Fatal(err)
		return "", err
	}
	image, _ := ioutil.ReadAll(rsp.Body)
	image_value, err2 := url.Parse(base64.StdEncoding.EncodeToString(image))
	if err2 != nil {
		log.Fatal(err)
		return "", err
	}
	to_url := "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?access_token="+accessToken
	values := url.Values{}
	values.Add("image", image_value.EscapedPath())
	values.Add("multi_detect", "false")
	rsp2, err := http.PostForm(to_url, values)
	defer rsp2.Body.Close()
	if err != nil {
		log.Fatal(err)
		return "", err
	}
	data, err := ioutil.ReadAll(rsp2.Body)
	if err != nil {
		log.Fatal(err)
		
		return "", err
	}
	log.Println("请求车牌返回的数据:",string(data))
	m := Data{}
	err = json.Unmarshal(data, &m)
	if err != nil {
		log.Fatal(err)
		return "", err
	}
	log.Println(m)
	return m.WordsResult.Number, nil
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用百度“车牌识别”API接口(go语言实现) 的相关文章

  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 为什么 Go 禁止取 (&) 映射成员的地址,却允许取 (&) 切片元素?

    Go 不允许获取地图成员的地址 if I do this p mm abc Syntax Error cannot take the address of mm abc 理由是 如果 Go 允许使用此地址 那么当地图后台存储增长或缩小时 该
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 正确的文件扩展名或缩写是什么。 golang 的文本/模板?

    我正在考虑为其创建语法荧光笔 但我不知道这种特定类型模板的常规缩写 In 例子之一 http golang org pkg text template example Template helpers从文本 模板 godoc 中 它们引用
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • 与通道相比,sync.WaitGroup 的优势是什么?

    我正在开发一个并发 Go 库 我偶然发现了 goroutine 之间两种不同的同步模式 其结果相似 等待组 https play golang org p ZYPLlcp16TZ package main import fmt sync t
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 关于编写惯用的 Golang 的建议

    我正在掌握 Golang 的做事方式 首先是一些示例代码 package main import log os func logIt s string f os OpenFile errors log os O RDWR os O CREA
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 如何在 Go 中获取给定月份的第一个星期一?

    我正在尝试获取给定月份的第一个星期一 我能想到的最好方法是循环前 7 天 然后返回 Weekday Monday 有一个更好的方法吗 通过查看时间的 Weekday 您可以计算出第一个星期一 package main import fmt

随机推荐

  • DY直播运营(持续更新)

    前言 首先感谢 佳灵MM和江北帅哥 的教导 才有了作者的这篇笔记 毕业后做计算机实习工作 发现实际工作待遇和付出与理想不符之后 几经思考也受到了杭州电商的影响决心转行 机缘巧合下 在两位老师的课堂上听了半天课 收益很多 之后打算去全身心学习
  • PCI-E接口的学习

    一 pci e接口的概念 PCI E全称PCI Express peripheral component interconnect express 外部设备互连总线接口 由intel提出并推广 所连接的设备分配独享通道带宽 不共享总线带宽
  • 梯度下降法的三种解释(BGD,SGD,MBGD).

    机器学习里面 梯度下降法可以说是随处可见 虽然它不是什么高大上的机器学习算法 但是它却是用来解决机器学习算法的良药 我们经常会用到梯度下降法来对机器学习算法进行训练 在很多介绍梯度下降的书籍里 我们看到这样的几个英文单词缩写 BGD SGD
  • 互联网JAVA面试常问问题(一)

    一 为什么要创建线程池 线程是稀缺资源 使用线程池可以减少创建和销毁线程的次数 每个工作线程都可以重复使用 可以根据系统的承受能力 调整线程池中工作线程的数量 防止因为消耗过多内存导致服务器崩溃 二 创建线程池参数有哪些及其含义 publi
  • angular4点击事件监听_事件与接口

    首先来讲一下接口 接口的格式是 interface public interface 接口名 接口中有几点注意事项值得特别提醒 1 接口中不能定义变量 2 接口中的方法没有方法体 3 接口中不能实例化对象 4 类的接口可以实现多个 怎么实现
  • 小组活动学习

    0区别问题类型 问题是常规问题还是非常规问题 常规 1 理解问题需求2 理解相关概念3 搜索intenet book ask4 测试 实践 非常规1理解问题 未知 已知 条件2 拟定方案3执行方案4 回顾 警惕 需求不明朗就行动 思绪紊乱
  • C++Primer第五版习题答案(三)

    第三章 字符串 向量和数组 3 2 3 4 3 5 3 6 3 20 3 22 3 23 3 24 3 31 3 32 3 35 3 36 3 39 3 40 3 41 3 42 对于P115中int p 4 ia 为什么不是int p 3
  • Richer Convolutional Feature for Edge Detection

    Richer Convolutional Feature for Edge Detection 文章链接为Richer Convolutional Feature for Edge Detection 这篇文章通过结合所有有意义的卷积的fe
  • 剑指offer 学习笔记 礼物的最大价值

    面试题47 礼物的最大价值 在一个mxn的棋盘的每一格都放有一个礼物 每个礼物都有一定的价值 价值大于0 你从棋盘的左上角开始拿格子里的礼物 并每次向右或者向下移动一格 直到到达棋盘的右下角 给定一个棋盘和上面的礼物 请计算你最多能拿到多少
  • 基于Hypervisor智能驾舱的AUTOSAR解决方案(1)

    引言 当今的汽车制造商正竞相通过使用人机界面 HMI 基于云的服务 车辆自组织网络 VANET 和自动驾驶等技术在未来的车辆中部署这些创新且吸引眼球的新功能 这些新技术增加了车辆电气和电子 E E 架构的复杂性 并要求软件系统要支持汽车间及
  • 批量网页内容爬虫(附正则表达式)

    最近 我可爱的女朋友有一个新的任务 需要复制网页上的部分内容 多达1500多页 到word文档中 既有文字 又有图片 十分复杂 是不是可以使用爬虫的方法解决一下子呢 首先分析网页 每一页有30个新闻文章 首先爬取页面内的文章的链接 分析页面
  • hadoop关不掉namenode的解决办法

    原文地址 https blog csdn net arrow8071 article details 51365843 问题描述 部门的Hadoop集群运行有一个多月了 今天需要做点调整 但是突然发现Hadoop不能正常关闭 Hadoop版
  • spring内部bean和级联注入属性

    这里内部bean提供一种方法 级联注入提供两种方法 首先我们创建个员工类 package cn zsp spring5 bean public class Emp private String ename private String ge
  • 线性滤波、非线性滤波区别

    数字图像处理线性滤波 输出图像fo x y T fi x y T是线性算子 即 输出图像上每个像素点的值都是由输入图像各像素点值加权求和的结果 非线性滤波的算子中包含了取绝对值 置零等非线性运算 线性滤波器的原始数据与滤波结果是一种算术运算
  • sqlserver2019安装注意事项-最后一步机器学习无法验证通过,机器学习python

    sqlserver2019安装教程 先附上下载地址 百度云下载链接 链接 https pan baidu com s 1bhWZbkxdAjHxp3vd4MmKzQ 提取码 1sku 在线下载地址 http edu 51minicloud
  • 微信公众号支付(三):页面调用微信支付JS并完成支付

    一 调用微信的JS文件 1 首先要绑定 JS接口安全域名 公众号设置 的 功能设置 中 2 引入JS文件 备注 支持使用 AMD CMD 标准模块加载方法加载 1 3 通过config接口注入权限验证配置 1 wx config 2 deb
  • VB语言入门书籍推荐(15本)

    1 Visual Basic最佳实践 Bill Sempf Kent Sharkey 本书详细介绍了如何利用VB语言编写高效 可维护的代码 并展示了很多实际应用场景的最佳实践 2 Beginning Microsoft Visual Bas
  • 悟空CRM的环境搭建

    记录悟空CRM从零开始搭建的过程 1 悟空CRM官网 2 JAVA版介绍文档 中介绍了Java版CRM系统的安装简介 3 通俗简介 悟空CRM采用前后端分离模式 前端使用vue开发 后端使用java 此次IDE为Eclipse 数据库使用M
  • PlatformIO - 静态代码分析(Static Code Analysis)

    关于 静态代码分析 相信大部分的嵌入式开发者或多或少在日常的开发中都有所了解 但可能在实际的开发中我们使用的并不多也不习惯通过工具对我们编写的代码进行静态扫描而是完全依赖于在开发板上运行然后基于运行结果来判断自己所编写的代码的好坏 是否有b
  • 调用百度“车牌识别”API接口(go语言实现)

    调用百度的api识别车牌 没有GPU的机器 也没有大量的有标注的车牌数据 所以就只好拿别人现成的车牌识别api接口 具体的识别原理就不说了 只是调别人的接口而已 具体的调用文档百度已经给出 http ai baidu com docs OC