一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - java實現騰訊ocr圖片識別接口調用

java實現騰訊ocr圖片識別接口調用

2021-06-17 11:29心懷寰宇 Java教程

這篇文章主要為大家詳細介紹了java實現騰訊ocr圖片識別接口調用,拍車牌識別車牌號功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近開發了一個拍車牌識別車牌號的功能,主要調用了騰訊的ocr車牌識別接口,直接上代碼:

首先生成簽名以及讀取配置的工具類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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);
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
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 ([email protected])
 * @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 junk
 
 int 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 accum
 int accum = 0; // excess bits
 int 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 thru
  shift += 6; // loop, with new bits being put in
  accum |= value; // at the bottom.
  if (shift >= 8)// whenever there are 8 or more shifted in,
  {
   shift -= 8; // write them out (from the top, leaving any
   out[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.
 // /////////////////////////////////////////////////
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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();
 }
 
 }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package weaver.general;
 
public class util {
 
 public static int getintvalue(string value) {
 try {
  return integer.parseint(value);
 } catch (numberformatexception e) {
  e.printstacktrace();
  return 0;
 }
 
 }
 
}

然后是接口調配置文件:

java實現騰訊ocr圖片識別接口調用

正主來了,調用接口部分:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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數據需要設置contenttype
    httppost.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,并且調用時傳入相應的參數即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_21134557/article/details/81363227

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美国产综合第一区 | 青青热久免费精品视频精品 | 国产精品原创巨作无遮挡 | 999久久久免费精品国产牛牛 | 九9热这里只有真品 | 疯狂刺激的3p国产在线 | 好吊操这里有精品 | 把老师操了 | 午夜精品久久久久久 | 国产毛片在线高清视频 | 久久亚洲高清观看 | 久久精品热只有精品 | a毛片免费观看完整 | 久久电影午夜 | 国产精品边做边接电话在线观看 | 国产三级精品91三级在专区 | 国产免费专区 | 好逼365| 日韩一区二区中文字幕 | 羞羞答答影院在线 | 久久理论片 | 我要看免费毛片 | 碰91精品国产91久久婷婷 | 五月激激激综合网色播免费 | 国产探花在线观看 | 久久精品观看 | 精品99一区二区三区麻豆 | 欧美人与日本人xx在线视频 | 色一情一区二区三区四区 | 免费看视频网站 | 国产婷婷综合丁香亚洲欧洲 | 暖暖的韩国免费观看 | 忘忧草在线社区WWW日本直播 | 欧美日韩免费一区二区在线观看 | 袖珍人与大黑人性视频 | 羞羞影院午夜男女爽爽影院网站 | 小辣椒精品福利视频导航 | 亚洲国产精品自产在线播放 | 免费人成在线观看69式小视频 | 日本一级不卡一二三区免费 | 性欧美黑人巨大喷潮xxoo |