调用百度的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
}
参与评论
手机查看
返回顶部