调用百度“车牌识别”API接口(go语言实现) - Go语言中文社区

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


调用百度的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
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_34525938/article/details/88926038
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 12:11:19
  • 阅读 ( 1326 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢