go版百度在线车牌识别

如果标准输入有内容(表示通过命令行输出了数据),则直接上传分析.否则通过参数base64图片

现在百度每日有限制,需要寻找更好的方法.

 

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"strings"
	"time"

	"github.com/soease/tools"
	"github.com/tidwall/gjson"
)

const (
	CLIENT_ID     = "123"
	CLIENT_SECRET = "321"

	BAIDU_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token"               //Token
	BAIDU_LPR_URL   = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate" //车牌识别
)

type BaiDuToken struct {
	ExpiresIn   int64  `json:"expires_in"`
	AccessToken string `json:"access_token"`
	RequestTime time.Time
}

type BaiDuError struct {
	Error       string `json:"error"`
	Description string `json:"error_description"`
}

//获取百度Token
func BaiDu_Token() (tk BaiDuToken, err error) {
	para := map[string]string{
		"grant_type":    "client_credentials",
		"client_id":     CLIENT_ID,
		"client_secret": CLIENT_SECRET,
	}
	ret := tools.Web_GetWithPara(BAIDU_TOKEN_URL, para)

	err = json.Unmarshal(ret, &tk)
	tk.RequestTime = time.Now()
	return tk, err
}

func GetImageBase64(filename string) string {
	fb := tools.Base64ImageFile(filename)
	fb = strings.Replace(fb, "+", "%2B", -1)

	return fb
}

func BaiDu_LPR_FileName(filename string, token string) (string, string) {
	return BaiDu_LPR(GetImageBase64(filename), token)
}

func BaiDu_LPR(Base64Image string, token string) (string, string) {
	data := fmt.Sprintf("access_token=%s&multi_detect=true&image=%s", token, Base64Image)
	ret := string(tools.Post(BAIDU_LPR_URL, "application/x-www-form-urlencoded", data))
	if len(ret) == 0 {
		return "", ""
	}

	err := gjson.Get(ret, "error_msg")
	if err.String() != "" {
		fmt.Println(err.String())
		return "", ""
	}

	num := gjson.Get(ret, "words_result.#.number")
	col := gjson.Get(ret, "words_result.#.color")
	return col.String(), num.String()
}

//读取所有标准输出
func ReadAllFrom(reader io.Reader) ([]byte, error) {
	return ReadFrom(reader, 10240)
}

//读取部份标准输出
func ReadFrom(reader io.Reader, num int) ([]byte, error) {
	var buffer bytes.Buffer
	p := make([]byte, num)

	for {
		n, err := reader.Read(p)

		if err == io.EOF {
			buffer.Write(p[:n])
			return buffer.Bytes(), nil
		} else if err == nil {
			if n > 0 {
				buffer.Write(p[:n])
			} else {
				buffer.Write(p)
			}
		}

	}
	return buffer.Bytes(), nil
}

func main() {
	picFile := "img/chepai.jpg"

	tk, err := BaiDu_Token()
	if err != nil {
		fmt.Println("获取百度Token错误")
		return
	}

	stat, _ := os.Stdin.Stat()
	if (stat.Mode() & os.ModeCharDevice) == 0 { //从stdin获取base64图片
		p, err := ReadAllFrom(os.Stdin)
		if err == nil {
			col, num := BaiDu_LPR(string(p), tk.AccessToken)
			fmt.Println(col, num)
		}
	} else {
		col, num := BaiDu_LPR_FileName(picFile, tk.AccessToken)
		fmt.Println(col, num)
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值