好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 (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 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 ;

  }

 

  }

 

}

然后是接口调配置文件:

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

?

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

查看更多关于java实现腾讯ocr图片识别接口调用的详细内容...

  阅读:21次