腾讯ocr图片识别接口调用

最近开发了一个拍车牌识别车牌号的功能,主要调用了腾讯的ocr车牌识别接口,直接上代码:

首先生成签名以及读取配置的工具类:

package com.weaver.formmodel.integration.ocr;import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import weaver.general.Base64;public class SignUtil {/*** 生成 Authorization 签名字段* * @param appId* @param secretId* @param secretKey* @param bucketName* @param expired* @return 签名字符串* @throws Exception*/public static String appSign(long appId, String secretId, String secretKey,String bucketName, long expired) throws Exception {long now = System.currentTimeMillis() / 1000;int rdm = Math.abs(new Random().nextInt());String plainText = String.format("a=%d&b=%s&k=%s&t=%d&e=%d&r=%d",appId, bucketName, secretId, now, now + expired, rdm);byte[] hmacDigest = HmacSha1(plainText, secretKey);byte[] signContent = new byte[hmacDigest.length+ plainText.getBytes().length];System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);System.arraycopy(plainText.getBytes(), 0, signContent,hmacDigest.length, plainText.getBytes().length);return Base64Encode(signContent);}/*** 生成 base64 编码* * @param binaryData* @return*/public static String Base64Encode(byte[] binaryData) {String encodedstr = new String(Base64.encode(binaryData));return encodedstr;}/*** 生成 hmacsha1 签名* * @param binaryData* @param key* @return* @throws Exception*/public static byte[] HmacSha1(byte[] binaryData, String key)throws Exception {Mac mac = Mac.getInstance("HmacSHA1");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");mac.init(secretKey);byte[] HmacSha1Digest = mac.doFinal(binaryData);return HmacSha1Digest;}/*** 生成 hmacsha1 签名* * @param plainText* @param key* @return* @throws Exception*/public static byte[] HmacSha1(String plainText, String key)throws Exception {return HmacSha1(plainText.getBytes(), key);}
}

 


package weaver.general;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;/*** Provides encoding of raw bytes to base64-encoded characters, and decoding of* base64 characters to raw bytes. date: 06 August 1998 modified: 14 February* 2000 modified: 22 September 2000* * @author Kevin Kelley (kelley@ruralnet.net)* @version 1.3*/
public class Base64 {/*** returns an array of base64-encoded characters to represent the passed* data array.* * @param data*            the array of bytes to encode* @return base64-coded character array.*/public static char[] encode(byte[] data) {char[] out = new char[((data.length + 2) / 3) * 4];//// 3 bytes encode to 4 chars. Output is always an even// multiple of 4 characters.//for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {boolean quad = false;boolean trip = false;int val = (0xFF & data[i]);val <<= 8;if ((i + 1) < data.length) {val |= (0xFF & data[i + 1]);trip = true;}val <<= 8;if ((i + 2) < data.length) {val |= (0xFF & data[i + 2]);quad = true;}out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];val >>= 6;out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];val >>= 6;out[index + 1] = alphabet[val & 0x3F];val >>= 6;out[index + 0] = alphabet[val & 0x3F];}return out;}/*** Decodes a BASE-64 encoded stream to recover the original data. White* space before and after will be trimmed away, but no other manipulation of* the input will be performed.* * As of version 1.2 this method will properly handle input containing junk* characters (newlines and the like) rather than throwing an error. It does* this by pre-parsing the input and generating from that a count of VALID* input characters.**/public static byte[] decode(char[] data) {// as our input could contain non-BASE64 data (newlines,// whitespace of any sort, whatever) we must first adjust// our count of USABLE data so that...// (a) we don't misallocate the output array, and// (b) think that we miscalculated our data length// just because of extraneous throw-away junkint tempLen = data.length;for (int ix = 0; ix < data.length; ix++) {if ((data[ix] > 255) || codes[data[ix]] < 0)--tempLen; // ignore non-valid chars and padding}// calculate required length:// -- 3 bytes for every 4 valid base64 chars// -- plus 2 bytes if there are 3 extra base64 chars,// or plus 1 byte if there are 2 extra.int len = (tempLen / 4) * 3;if ((tempLen % 4) == 3)len += 2;if ((tempLen % 4) == 2)len += 1;byte[] out = new byte[len];int shift = 0; // # of excess bits stored in accumint accum = 0; // excess bitsint index = 0;// we now go through the entire array (NOT using the 'tempLen' value)for (int ix = 0; ix < data.length; ix++) {int value = (data[ix] > 255) ? -1 : codes[data[ix]];if (value >= 0)// skip over non-code{accum <<= 6; // bits shift up by 6 each time thrushift += 6; // loop, with new bits being put inaccum |= value; // at the bottom.if (shift >= 8)// whenever there are 8 or more shifted in,{shift -= 8; // write them out (from the top, leaving anyout[index++] = // excess at the bottom for next iteration.(byte) ((accum >> shift) & 0xff);}}// we will also have skipped processing a padding null byte ('=')// here;// these are used ONLY for padding to an even length and do not// legally// occur as encoded data. for this reason we can ignore the fact// that// no index++ operation occurs in that special case: the out[] array// is// initialized to all-zero bytes to start with and that works to our// advantage in this combination.}// if there is STILL something wrong we just have to throw up now!if (index != out.length) {throw new Error("Miscalculated data length (wrote " + index+ " instead of " + out.length + ")");}return out;}//// code characters for values 0..63//private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();//// lookup table for converting base64 characters to value in range 0..63//private static byte[] codes = new byte[256];static {for (int i = 0; i < 256; i++)codes[i] = -1;for (int i = 'A'; i <= 'Z'; i++)codes[i] = (byte) (i - 'A');for (int i = 'a'; i <= 'z'; i++)codes[i] = (byte) (26 + i - 'a');for (int i = '0'; i <= '9'; i++)codes[i] = (byte) (52 + i - '0');codes['+'] = 62;codes['/'] = 63;}// /// remainder (main method and helper functions) is// for testing purposes only, feel free to clip it.// /public static void main(String[] args) {boolean decode = false;if (args.length == 0) {System.out.println("usage:  java Base64 [-d[ecode]] filename");System.exit(0);}for (int i = 0; i < args.length; i++) {if ("-decode".equalsIgnoreCase(args[i]))decode = true;else if ("-d".equalsIgnoreCase(args[i]))decode = true;}String filename = args[args.length - 1];File file = new File(filename);if (!file.exists()) {System.out.println("Error:  file '" + filename + "' doesn't exist!");System.exit(0);}if (decode) {char[] encoded = readChars(file);byte[] decoded = decode(encoded);writeBytes(file, decoded);} else {byte[] decoded = readBytes(file);char[] encoded = encode(decoded);writeChars(file, encoded);}}private static byte[] readBytes(File file) {ByteArrayOutputStream baos = new ByteArrayOutputStream();try {InputStream fis = new FileInputStream(file);InputStream is = new BufferedInputStream(fis);int count = 0;byte[] buf = new byte[16384];while ((count = is.read(buf)) != -1) {if (count > 0)baos.write(buf, 0, count);}is.close();} catch (Exception e) {e.printStackTrace();}return baos.toByteArray();}private static char[] readChars(File file) {CharArrayWriter caw = new CharArrayWriter();try {Reader fr = new FileReader(file);Reader in = new BufferedReader(fr);int count = 0;char[] buf = new char[16384];while ((count = in.read(buf)) != -1) {if (count > 0)caw.write(buf, 0, count);}in.close();} catch (Exception e) {e.printStackTrace();}return caw.toCharArray();}private static void writeBytes(File file, byte[] data) {try {OutputStream fos = new FileOutputStream(file);OutputStream os = new BufferedOutputStream(fos);os.write(data);os.close();} catch (Exception e) {e.printStackTrace();}}private static void writeChars(File file, char[] data) {try {Writer fos = new FileWriter(file);Writer os = new BufferedWriter(fos);os.write(data);os.close();} catch (Exception e) {e.printStackTrace();}}// /// end of test code.// /}
package weaver.general;import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;public class BaseBean {private static Map<String, Properties> propertyMap = new HashMap<String, Properties>();public String getPropValue(String cONFIG_FILE, String key) {if (propertyMap.get(cONFIG_FILE) == null) {readPro(cONFIG_FILE);}Properties pro = propertyMap.get(cONFIG_FILE);return pro.getProperty(key);}private void readPro(String cONFIG_FILE) {Properties pro = new Properties();FileInputStream in;try {String path = Thread.currentThread().getContextClassLoader().getResource("").toString();path = path.substring(6, path.indexOf("classes/"));path = path + "prop/" + cONFIG_FILE + ".properties";path = path.replace("%20", " ");System.out.println(path);File f = new File(path);if (!f.exists()) {throw new RuntimeException("要读取的文件不存在");}in = new FileInputStream(f);pro.load(in);in.close();propertyMap.put(cONFIG_FILE, pro);} catch (Exception e) {e.printStackTrace();}}}
package weaver.general;public class Util {public static int getIntValue(String value) {try {return Integer.parseInt(value);} catch (NumberFormatException e) {e.printStackTrace();return 0;}}}

然后是接口调配置文件:

正主来了,调用接口部分:

package com.weaver.formmodel.integration.ocr;import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import weaver.general.BaseBean;
import weaver.general.Util;
public class OCRClient{private static String CONFIG_FILE = "OCR_Tencent";private static String host;private static int appid;private static String secretId;private static String secretKey;private static String targeturl;private static String encoding = "UTF-8";static {BaseBean bb = new BaseBean();host = bb.getPropValue(CONFIG_FILE, "host");appid = Util.getIntValue(bb.getPropValue(CONFIG_FILE, "appid"));secretId = bb.getPropValue(CONFIG_FILE, "secretId");secretKey = bb.getPropValue(CONFIG_FILE, "secretKey");targeturl = bb.getPropValue(CONFIG_FILE, "targetUrl");}/*** 识别图片* @param imageurl* @param paramsMap 参数map* @return* @throws Exception*/public static Map<String, Object> recognizeImage(Map<String,Object> paramsMap) throws Exception{HttpClient httpclient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(targeturl);// 创建httpPost   httpPost.setHeader("host", host);//设置签名httpPost.setHeader("Authorization", SignUtil.appSign(appid, secretId, secretKey, "", 2592000));//设置请求头, 签名//设置参数JSONObject requestParam = new JSONObject();requestParam.put("appid", String.valueOf(appid));for(String key :paramsMap.keySet()){//循环加入请求参数requestParam.put(key, paramsMap.get(key));}//请求报文StringEntity entity = new StringEntity(requestParam.toString(), encoding);entity.setContentEncoding(encoding);entity.setContentType("application/json");//发送json数据需要设置contentTypehttpPost.setEntity(entity);httpPost.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 120000);httpPost.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 120000);int state = 0;String result = "";HttpResponse response = null;try {response = httpclient.execute(httpPost);StatusLine status = response.getStatusLine();state = status.getStatusCode();if (state == HttpStatus.SC_OK) {HttpEntity responseEntity = response.getEntity();result = EntityUtils.toString(responseEntity);}else{//new BaseBean().writeLog("读取OCR驾驶证或者行驶证接口失败,状态码:"+state);}} finally {httpclient.getConnectionManager().shutdown();}Map<String, Object> resultMap = new HashMap<String, Object>();resultMap.put("state", state);resultMap.put("result", result);return resultMap;}//测试public static void main(String[] args) {String imgurl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1532414063478&di=f8709d73023a1a4ef9fe58f23ec95a8e&imgtype=jpg&src=http%3A%2F%2Fimg3.imgtn.bdimg.com%2Fit%2Fu%3D2587099383%2C4041264664%26fm%3D214%26gp%3D0.jpg";try {//车牌号识别参数设置Map<String, Object> requestParam = new HashMap<String, Object>();requestParam.put("url", imgurl);Map<String,Object> res =recognizeImage(requestParam);//解析车牌号返回值JSONObject resultJson = JSONObject.fromObject(res.get("result"));System.out.println(resultJson.toString());} catch (Exception e) {e.printStackTrace();}}
}

如需调用其他接口,如身份证识别接口、驾驶证识别接口、等,则只需要修改一下配置文件的targeturl,并且调用时传入相应的参数即可。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60893.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片识别工具Tesseract介绍和python搭配使用

Tesseract介绍和Python的搭配使用 一、Tesseract介绍、下载指南1、了解Tesseract工具2、下载地址3、请注意&#xff01;&#xff01;&#xff01; 二 、环境搭建2.1 版本3.05安装2.2 最新版本安装2.3 环境搭建2.4 举个栗子 三、Python中的环境搭建3.1 安装pytesseract3.2 修改配…

js逆向之补环境过瑞数4.0 某房地产

写这篇文章的目的是为了记录一下自己的逆向之旅,后面会持续更新5.0,6.0,加速乐,akamai,5s盾,极验滑块,腾讯滑块,网易易盾等等. 过瑞数有很多方法,rpc,js逆向(扣代码和补环境),如果你不想屁股坐出痔疮,又或者又少几根头发,可以参考一下本篇文章.本章将从rs的流程逻辑以及详解补…

燕尾夹-钣金

草图1 基体法兰 褶边 展开 切除 拉伸切除&#xff1a;完全贯穿&#xff0c;折叠 底面草图绘制 从草图绘制折弯 绘制第2个折弯 基准轴 基准面 基准面草绘 基准面&#xff0c;对称 镜像实体

钣金cad插件_ug,CAD,SolidWorks,钣金??????非标等设计讲解

ug,CAD,SolidWorks,钣金​‌‌​‌‌非标等设计讲解 《培训课程》 一&#xff0e;UG、PROE三维产品设计班 1)产品设计流程&#xff1b; 2)三维造型、各类产品结构设计 3)产品表面处理工艺 4)UG、PROE 3D造型、抄板、工程图、逆向工程、点云处理。 5)100多套家电、医疗器械、汽车…

在proe中设计钣金件

Pro/Engineer 是美国PTC公司开发的三维实体建模软件&#xff0c;在工程设计开发中有着广泛应用&#xff0c;比如零件设计&#xff0c;钣金件设计&#xff0c;模具设计&#xff0c;管道线路设计等。目前该工程软件已发展到Creo3.0。本次将以proe5.0为设计平台浅谈该软件在实际工…

钣金cad插件_ug,CAD,SolidWorks,钣金??????非标等设计

ug,CAD,SolidWorks,钣金​‌‌​‌‌非标等设计 《培训课程》 一&#xff0e;UG、PROE三维产品设计班 1)产品设计流程&#xff1b; 2)三维造型、各类产品结构设计 3)产品表面处理工艺 4)UG、PROE 3D造型、抄板、工程图、逆向工程、点云处理。 5)100多套家电、医疗器械、汽车、手…

钣金设计大师20年钣金设计经验总结

钣金设计经验总结 1&#xff1a;明确标识毛边方向 钣金在下料及冲孔时会有R角及毛边的产生。尤其在量产一个阶段模具有所磨损之后&#xff0c;毛边会更为严重&#xff0c;甚至会割伤手指头。因此在出图制作模具时&#xff0c;就必须依功能&#xff0c;明确标示出毛边方向。 …

结构建模设计——Solidworks软件之使用钣金折弯功能做一个带折弯固定口的铝合金面板

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

solidworks钣金学习分享

1、基本法兰&#xff1b;选择 折弯扣除 板厚1mm 设置1.7mm 2、边线法兰&#xff1b;半径选择0.2mm 3、闭合边角&#xff0c;加长边选择较长的一边&#xff0c;方便后期折弯 4、放样折弯需要开口的草图

catia钣金根据线段折弯,CATIA钣金实例教程_生成棱边弯曲_生成局部折叠或展开

CATIA钣金实例教程_生成棱边弯曲_生成局部折叠或展开,使用 5.3 节的钣金零件。模型如图 5-40。 @PLONQ9KOT2[YI0M)I9MT05.png (62.9 KB, 下载次数: 82) 2018-12-2 17:43 上传 图5-40 钣金零件模型  点击工具栏内的 Unfolding 展开图标 {C~UYV2UI(41%RRR_ML_KV9.png (1.64 KB…

搜索神器Perplexity的详细使用方法(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

git commit 模板配置

Git Log 之痛 在《The Art of Readable Code》这本经典书中&#xff0c;有个形象的比喻&#xff0c;衡量代码可读性的指标是阅读代码时每分钟的 WTF 次数&#xff0c;而在读 Git 提交历史的时候&#xff0c;不知道你有多少次爆粗口&#xff1f;不相信&#xff1f;你现在打开公司…

一键式AI绘画,让你也能体验当画师的魅力(附原理分析)

文章目录 讲在前面一、Novel AI1. 网站介绍2. AI作画 二、AI绘画的内在原理1. Diffusion Model的基本过程2. 扩散模型的兴起 讲在前面 大概在今年10月初期&#xff0c;AI作画的热潮突然被掀起&#xff0c;这股潮流瞬间激起了人们对于AI的思考和恐惧&#xff0c;一方面来说&…

AI绘画网站最全收集!!

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 重磅干货&#xff0c;第一时间送 AI绘画在过去也一直有研究&#xff0c;但是最近几个月的突然爆发主要是因为一些关键技术的突破。例如&#xff0c;超大规模、跨模态的预训练语言模型的成熟&#xff0c;使得AI绘画可…

Ai绘画工具有哪些?推荐这7款效果惊艳的AI绘画神器

2022虽然不是ai绘图这项技术诞生的时间&#xff0c;但却是到目前为止最爆火出圈的绘图元年。 AI绘图&#xff08;AI painting&#xff09;就是以文生图&#xff08;text2image&#xff09;&#xff0c;属于跨模态生成&#xff08;Cross-modal generation&#xff09;的一种&am…

AI魔法秀:D-ID助你打造视频虚拟数字人

随着ChatGPT的各种玩法&#xff0c;写文章、做PPT、编程、修bug等&#xff0c;大家都玩的不亦说乎&#xff0c;可以说真的给家人们提升的效率很高&#xff0c;最近个人尝试着制作一个虚拟数字人&#xff0c;也是一个玩法&#xff0c;可以帮助很多中小企业做企业文化宣讲或者是产…

对抗神经网络(GAN)

对抗神经网络其实是两个网络的组合&#xff0c;可以理解为一个网络生成模拟数据&#xff0c;另一个网络判断生成的数据是真实的还是模拟的。生成模拟数据的网络要不断优化自己让判别的网络判断不出来&#xff0c;判别的网络也要优化自己让自己判断得更准确。二者关系形成对抗&a…

BppAttack:通过图像量化和对比对抗学习来攻击深度神经网络

BppAttack&#xff1a;通过图像量化和对比对抗学习来攻击深度神经网络 论文地址&#xff1a;BppAttack 一. 当前主流trigger: image patches:BadNet watermark: image filter:ABS learned image transformation: SSBA(依赖于输入&#xff0c;需要自动编码器资源要求高); …

生成对抗网络(GAN)详解与实例

GAN介绍 理解GAN的直观方法是从博弈论的角度来理解它。GAN由两个参与者组成&#xff0c;即一个生成器和一个判别器&#xff0c;它们都试图击败对方。生成备从分巾中狄取一些随机噪声&#xff0c;并试图从中生成一些类似于输出的分布。生成器总是试图创建与真实分布没有区别的分…

深度对抗神经网络(DANN)笔记

一 总体介绍 DANN是一种迁移学习方法&#xff0c;是对抗迁移学习方法的代表方法。基本结构由特征提取层f,分类器部分c和对抗部分d组成&#xff0c;其中f和c其实就是一个标准的分类模型&#xff0c;通过GAN&#xff08;生成对抗网络&#xff09;得到迁移对抗模型的灵感。但此时…