查看: 13134|回复: 3

解决Java上传图片OCR识别返回错误识别

[复制链接]

1

主题

1

帖子

31

积分

新手上路

Rank: 1

积分
31
lizhanzhishang 发表于 2015-12-2 10:38:57 | 显示全部楼层 |阅读模式
[i=s] 本帖最后由 lizhanzhishang 于 2015-12-4 17:56 编辑 [/i]
; D; c! r# m3 V/ W4 I' g  P  Z
昨天搞了N久不能用代码上传,不能返回正确的OCR信息6 U& ~0 }+ M3 `* S9 D5 {5 _6 N
今天问了百度的技术支持,感觉百度的技术支持蛮好的,哈哈
5 D& @( z2 ]& g5 z4 B+ O
& b% v& g6 M6 h1 d$ e只能说百度的文档给的不全面,所以才会导致我们的各种问题。4 N+ z! N: d% p$ ^5 M
[color=#ff0000]我现在做的是android上的OCR识别,拍照之后,照片肯定要处理的(像素特别高的手机)[/color]  R( W$ z/ N# K+ F; ]. [
[color=#ff0000]文档上说图片大小不能大于300KB,所以对图片质量压缩。[/color]
1 V$ ]3 r' F6 Z+ ?  }4 x( V, {# S* {6 I) h( [7 l4 v( O
[color=#ff0000]一般android高分辨的拍照之后,虽然图片质量压缩了,但是图片的宽高依然很大,这也会导致图片上传无法识别,[/color]/ ~: a. |; j- i( z, y+ c) |, z
[color=#ff0000]所以建议图片压缩宽高到800*800(个人尝试的结果,你们可以自己去实验,取你们觉得合适的高宽)[/color]2 c: P2 G, a! |$ Z
[color=#ff0000]8 n2 P; s1 i3 H% e) i. a; R
[/color]% j2 D, e# B3 H6 [, g9 R+ U) W
[color=#ff0000]文档上说要对图片BASE64编码,但是这个编码有问题的,还要再Unicode编码一次。[/color]
+ J6 @5 j( t$ ~9 C9 u1 O
  z. ?) J2 t7 `1 a  Y8 k' Y# k6 vUnicode编码是个啥啊,因为BASE64编码之后返回的是个String
% ?- j9 N% j/ S: S& Q6 i同事告诉我,是 urlencode 不是 unicode吧..............,其实就是url编码啦# g$ z6 i% w4 ]

, c" }3 a' j) H5 s+ t下面是我从手机上截图的处理的照片,然后电脑上Java测试的代码,返回的是正确的识别,代码如下7 {+ @: K. V1 r1 E! j+ Y. V* E

+ |) o' Q; }$ m, E! h8 r7 l
7 q6 N9 @  Y. v5 `7 F/ w' I[code]( q! ]4 [# [9 S0 T" v" D

3 r4 Z3 J! {+ K4 r9 ^8 ppublic class FFFFF {
- U+ _# N9 W6 x! K" Z. @static Object mp;6 x1 {- _! t/ R  d% w2 q! K
/**
! W5 a1 J6 L- m+ ~. E' P' n6 |* @param args ‪C:\Users\lenovo\Desktop\vvv.png
) r1 n' h# X2 p8 F9 P3 F- J*/. E' w6 b1 F- m5 f
public static void main(String[] args) { 5 f5 n% _. m8 G8 V. w
String httpUrl = "http://apis.baidu.com/idl_baidu/baiduocrpay/idlocrpaid";
* x) k* r9 u. S# Y, jString httpArg = "fromdevice=android&clientip=10.10.10.0&detecttype=LocateRecognize&languagetype=CHN_ENG&imagetype=1&image=";+ W1 Q# ]3 M9 |6 t6 Q  f
Base64 base64 = new Base64();
2 V; q) F" d4 v" ~6 o, F9 khttpArg=httpArg+URLEncoder.encode(base64.encode(getBytes("C:\\Users\\lenovo\\Desktop\\temp_cropped.jpg")));
: o* ]+ V7 s" ~+ `0 x( [" f/ `
4 `6 u; a6 R+ L8 VSystem.out.println(URLEncoder.encode(base64.encode(getBytes("C:\\Users\\lenovo\\Desktop\\temp_cropped.jpg"))));
, a" C. b/ P: K/ M2 d! Q, AString jsonResult = request(httpUrl, httpArg);
  i& t7 w2 V6 }. n" T) S1 Z5 MSystem.out.println(jsonResult);
. E6 o( D! D. z; B, e: L}1 N# {1 F+ V( h+ {+ e

  W) ^2 ~8 Q/ ^# B# upublic static byte[] getBytes(String filePath){
2 Y5 U/ R4 v9 N( Bbyte[] buffer = null; 8 q: Q8 c2 e) Z. R
try {
/ a; n8 r+ W9 h4 i$ zFile file = new File(filePath); # s) B1 W9 D! Q
FileInputStream fis = new FileInputStream(file); & f6 i0 E. z5 e8 O
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);   p( c$ l8 U4 Z% i2 k3 B
byte[] b = new byte[1000]; % }: D0 R1 n6 P5 {- W
int n; " K/ v/ d3 O; @
while ((n = fis.read(b)) != -1) {
$ ]1 U% s/ [3 z( C! Q# sbos.write(b, 0, n); - t* F. k' N2 h( b. Y" G
}
& o; _" Y) N+ m# ^$ P3 ?fis.close();
4 K& Z7 e! R* T' @/ ebos.close(); , F! ~: G4 i2 J9 u
buffer = bos.toByteArray(); & e. N8 ?3 S# ~" y( Z0 l
} catch (FileNotFoundException e) { ! I6 y2 a- {% m% I
e.printStackTrace();
- k' T+ T- b: _2 r4 K} catch (IOException e) { 1 u; z5 [  ]* Z( }2 b
e.printStackTrace();
* |0 c4 a" l- z} $ z' M. Y- \* ]( U9 ~/ {: I' p
return buffer; ( j( e) M# O  r% N$ t- G5 e
} : M# P6 P/ A0 V2 _# D5 p$ X
, r9 J1 F% R3 m& E0 j

5 S% j/ U; J/ u) u+ u6 c) v. }/**
: U; |/ Z( m6 x2 `* d* @param urlAll9 e, X+ U; V7 }& P+ N
* :请求接口$ S( s" t0 L$ q# C0 J( t- E
* @param httpArg; ~9 c5 E; U/ [- R$ q5 r
* :参数
. e' B) r0 J0 n/ d- P: N3 Y5 \0 u* @return 返回结果, r- |9 t7 E5 F$ V
*/  V2 q/ c; W4 d" ]6 n
public static String request(String httpUrl, String httpArg) {$ s& S$ b3 ~/ i) m0 G. G2 `8 B+ _' J4 c
BufferedReader reader = null;
  J: J8 Q$ _5 w5 ^String result = null;
8 s) f3 m, Y7 i8 C  ^8 B1 vStringBuffer sbf = new StringBuffer();
% T& X0 m8 q5 B2 Z. l8 i. g, h
4 B6 F- t6 I$ ztry {
  e4 \' v9 j9 }; P! [URL url = new URL(httpUrl);' k! j) [" @1 }
HttpURLConnection connection = (HttpURLConnection) url
; i: a" G: j6 M& i6 U8 o.openConnection();
" ~9 ^6 F; U# _& mconnection.setRequestMethod("POST");4 c3 d6 ~$ b; e- Z& T+ o# }
connection.setRequestProperty("Content-Type",
3 ^) H( y- ]3 ^- y"application/x-www-form-urlencoded");
! F$ ?4 }2 q/ c% u) S- G// 填入apikey到HTTP header
; ]& k& X+ P# @. Jconnection.setRequestProperty("apikey", "00821c9616e2386485b9aa6af40af172");
! C; j' E' }* E9 A% u7 |0 u8 B$ Wconnection.setDoOutput(true);/ q3 s" K. i, M* U) {# N
connection.getOutputStream().write(httpArg.getBytes("UTF-8"));7 G* _+ R! p! x; n" G" m
connection.connect();/ n0 I- c# f% j! G6 S+ g, }' a
InputStream is = connection.getInputStream();
5 N0 v9 Q5 x7 t; f+ t: Breader = new BufferedReader(new InputStreamReader(is, "UTF-8"));/ K/ s: R& ^; X
String strRead = null;$ s: s8 M3 U. j8 X
while ((strRead = reader.readLine()) != null) {
: m% e) l* L0 X+ Tsbf.append(strRead);
! J* k/ J$ H# ?sbf.append("\r\n");( n$ }( Q  Z  ^! C1 U8 }
}; D" ?$ ^- M, O. C* J2 ~( N$ a; s' s
reader.close();& x, t9 S: A, Z4 ]/ K
result = sbf.toString();$ l' R; U6 c! n  }3 H3 Y
} catch (Exception e) {
( m# L; I/ s7 \" [6 b( Oe.printStackTrace();$ {& n/ s# v& ~; {9 Q
}
' g( X( W, g8 ^9 [3 ireturn result;! I* b, v" Z% T
}* Z5 Q' E; O0 Q0 Y9 O+ ?

, o+ e2 \8 k5 O' K6 J2 A) a6 I8 h  U7 `7 C! b* H# ~, H  U+ }: K! L. S
}
: Q* }9 e7 Y! Y- F2 I1 d
2 Y  c5 S6 R2 e6 ^# V4 F
1 V) A- f! L* o6 @, h' [1 R; j+ A
6 J5 t* c2 z: q
0 u) P' Q9 z! X; S
( A. v! \7 w$ Z' F$ e+ iBASE64的代码也贴出来吧
3 ^) N  l/ w5 H9 V$ X" U
2 @' l" e& G) f. _) tpublic class Base64 {
. u" ^' N: s! L5 ?
6 K1 Q9 u, R$ }" N3 G/ F4 iprivate static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D',
1 s, ?+ }* p' w, }" q' K0 |'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
2 ~4 N7 U; ~4 }$ ^# q'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',9 S# H# z6 a& l) H; j2 V1 L
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
: q% o% A- J" D' f( C+ f/ I3 p7 [" g'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
' \# s9 I, G  a  |0 T; \'4', '5', '6', '7', '8', '9', '+', '/' };
% ~- a* k" t) i+ P; a1 q1 E# V% b: z
9 G9 k7 k: U* O2 zprivate static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1,! s4 k2 ^  B& ~3 h
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
: _, S5 d8 c" r7 R& {7 m-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
. e) f1 L+ O1 v3 [% ^* U. Z-1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59,- v/ b% s* m0 A; q" |: H! l0 H
60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  f" d: w& ~+ [5 U9 G% P* ~10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1,9 G6 B( h4 @' N: V
-1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
1 n0 O8 e* ]8 Q5 M38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1,
7 z* o$ g# c& {; g' n6 S-1, -1 };9 Z0 L! f0 L; C2 R, M9 x" H( f
( t8 b9 d+ y3 Y0 ?' j2 Q( t

/ e3 y- S- ?0 L5 `! Cpublic static String encode(byte[] data) {
4 q, X" y: E& r* T5 NStringBuffer sb = new StringBuffer();9 h$ N1 W" ]5 N, O
int len = data.length;
8 {! y- G! t, H% r$ |  ~* R  B/ }9 Cint i = 0;
. ]6 m2 t, A  e; B0 Q/ yint b1, b2, b3;  C8 H. z) T& F( c1 o
3 X: Y/ d, `8 V4 I0 V7 o5 e
while (i < len) {
: f  Y, i: H. y% q' s$ eb1 = data[i++] & 0xff;1 F3 C: T2 |) i
if (i == len) {6 v; m6 u1 S0 t1 Y- O
sb.append(base64EncodeChars[b1 >>> 2]);
9 V+ |. C( f8 f* Isb.append(base64EncodeChars[(b1 & 0x3) << 4]);# T6 C4 p& U9 B6 q
sb.append("==");
* ^6 m* B& t* ^/ D4 I0 @break;% ]& A: q* |2 X; t7 U
}
$ z) N0 a0 @- o" `- J7 K) Ab2 = data[i++] & 0xff;% {! Y0 p  J# a; J- z; T3 s# p  s
if (i == len) {
0 _* _& ~8 U  C! Wsb.append(base64EncodeChars[b1 >>> 2]);
" H: i0 h: S6 w+ M+ lsb.append(base64EncodeChars[((b1 & 0x03) << 4)
; }% c* j+ I% n, _; e( v; L, @4 b| ((b2 & 0xf0) >>> 4)]);  K4 \( L" O) `5 k" \) E/ P
sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);/ C8 u5 m/ }" d' ?& [, r
sb.append("=");* {5 {1 G/ a" h+ k7 ^5 i
break;
4 t, z. s) c' k7 Q) ^}! y8 V9 J" M- C2 O1 ~
b3 = data[i++] & 0xff;
8 |. Y: }7 d' G6 P+ zsb.append(base64EncodeChars[b1 >>> 2]);3 V+ \, |0 e4 h$ O
sb.append(base64EncodeChars[((b1 & 0x03) << 4)
, f( i% W. ^8 M2 H) s6 H8 O2 V| ((b2 & 0xf0) >>> 4)]);
1 I' L% A2 J3 I2 `1 a' a/ }% j7 }sb.append(base64EncodeChars[((b2 & 0x0f) << 2)2 D: p7 h; n5 A4 \
| ((b3 & 0xc0) >>> 6)]);
% Z5 R6 a, l% A) f, L* U5 J2 Lsb.append(base64EncodeChars[b3 & 0x3f]);' {6 u2 V/ y6 h: D3 F) Y1 y
}# L$ d4 ?4 c5 a
return sb.toString();1 u' E- ^' X! T- t( X
}& G. C6 f* M1 Z/ q8 C
6 n& K! f4 X+ ]& D/ J; v' y& O0 B# h
public static byte[] decode(String str) {& u5 E. _# Z! t
byte[] data = str.getBytes();
2 g& ~% T5 d' D8 Q* v. q* v% kint len = data.length;
% z5 [' |1 R6 P: [# ?ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
6 ^* P0 d' y8 X5 Uint i = 0;# m# F. v! ]5 k# W9 t+ Q; B
int b1, b2, b3, b4;
$ A( X9 S$ s9 p
% j: z6 e* j: C; fwhile (i < len) {
; j, h3 v+ i- b$ i* z' v3 @# A( B0 K. i0 S' l+ w8 n5 N
/* b1 */6 t  x, ^6 ]# h7 T
do {
' i7 E0 |" T3 t4 |/ _  e& _b1 = base64DecodeChars[data[i++]];6 {3 ^% o' Q: b# i- A. B' m
} while (i < len && b1 == -1);
* ?! r: ~. ?- U5 s) W0 Q& xif (b1 == -1) {
2 F/ d( o0 R6 k& {& jbreak;
) T: ?  U8 B; U- @1 o0 j" G2 M}
/ @$ |: ~: N9 N% E. H
3 Z" ^! k1 l1 S! C$ g9 D/* b2 */
, S* X% ^2 }8 c- P' A% ~4 rdo {
7 ?' \+ c7 _* m& o* E% bb2 = base64DecodeChars[data[i++]];" T0 }8 a( r0 q! m0 o
} while (i < len && b2 == -1);
6 E' [& A9 u/ p9 c& H2 j8 O2 ~' _if (b2 == -1) {3 C! y$ k5 o% |% E
break;# F8 n# g3 ]( c; \2 J
}0 ]8 H" A; ^; D  }, R0 _9 g
buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));8 @5 R' c3 C" g) a7 \
3 H* ^! e  _% U5 U- s2 S
/* b3 */, Z/ Z3 b% i7 b1 n2 m
do {
5 C+ ^6 N7 P9 A# X4 l9 tb3 = data[i++];  l( U, |; _. Q; n% w6 Z3 |  }
if (b3 == 61) {
5 Z& }' G5 `' x) E3 U3 c: wreturn buf.toByteArray();2 v2 c. v7 q1 i8 _8 Z2 w
}: X, Y. P  K* V9 w8 t: n
b3 = base64DecodeChars[b3];2 F% g  P/ D2 Z4 `) X) O* w) w
} while (i < len && b3 == -1);9 e  n6 _. s4 D5 L& X
if (b3 == -1) {1 e! K$ t" q, s, b7 }5 q
break;
- m1 F2 c7 n; b  K- Q3 B' P}7 z  V. @0 G0 z! K0 X
buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));! A/ X3 |* h3 v, ?( H% |7 r7 @5 q. J
* _7 @4 I$ M+ D4 ]8 j
/* b4 */2 F% r$ V8 \7 E
do {
& I2 K1 G3 z& v" ]2 Y: R, a) s+ vb4 = data[i++];; v3 J) c7 {# b9 X
if (b4 == 61) {
- i1 S2 O# m% Q/ K/ [. A( Y1 t% Hreturn buf.toByteArray();* K& m& o3 K$ C6 u! j+ U
}
5 ~: `+ e! e' e% E- P8 s+ ~6 Pb4 = base64DecodeChars[b4];
2 y/ {! M7 x- I* p. {( w} while (i < len && b4 == -1);
7 X5 Z4 t5 U. y* t/ Eif (b4 == -1) {
: y6 z, d9 a% y( M6 O- qbreak;
9 U/ }/ ~5 H  S% g( H}- C5 q' N) s$ u. R5 A3 H7 A0 C
buf.write((int) (((b3 & 0x03) << 6) | b4));8 L! y5 t& E' B) h/ G" x( @  W( Q( P
}
! L3 s# N+ Y" O: Yreturn buf.toByteArray();
6 v; r% M) f* z7 O9 a}
9 d) Y* M5 a) X- i: @8 r* x! C, i0 }; U7 y
public static void main(String[] args) {/ H" Q; J* b1 A$ C
Base64 base64 = new Base64();
3 }5 @9 z+ k  B5 P
7 [, |! Z% ]* G! O; C+ |String testStr = "{\"name\":\"vicken\",\"age\":20}";
5 X- O- l1 |$ Q& y% s1 G% I+ pSystem.out.println("加密前:" + testStr);5 b* q4 f/ Q0 y/ X" ~3 J

5 q+ h% V1 m5 X8 @- j. U7 _String encodeStr = base64.encode(testStr.getBytes());
( s# l4 J7 D7 U: c/ w: eSystem.out.println("加密数据:" + encodeStr);
/ Z5 f+ {3 \  K9 z1 ~; Z5 T; F1 ~3 O1 S! k
byte[] decodeStr = base64.decode(encodeStr);/ n" f* [6 ~( b/ u4 r
System.out.println("解密数据:" + new String(decodeStr));* ?. l, T3 v* b1 m5 H% z
}% t, U5 r9 s( {
5 B: y' W" K' e
}
6 t1 M6 {+ |( ]( q- F3 z, u3 {/ f7 b) F2 L
[/code]+ f, G8 p0 P( ^, F* C) [* k

$ Z& v4 K, T7 I' p4 U7 R
回复

使用道具 举报

0

主题

1

帖子

6

积分

新手上路

Rank: 1

积分
6
刘富强3399 发表于 2016-6-30 17:06:35 | 显示全部楼层
没有用啊
回复

使用道具 举报

1

主题

4

帖子

17

积分

新手上路

Rank: 1

积分
17
我想我很水 发表于 2016-7-11 15:25:01 | 显示全部楼层
这个传地址的话 在android中怎么控制图片大小啊 高像素的手机照的照片 肯定大啊 路径里面放的是原本的照片 不会修改啊
回复 支持 反对

使用道具 举报

0

主题

6

帖子

16

积分

新手上路

Rank: 1

积分
16
响亮的名字嗷呜 发表于 2016-7-14 16:21:05 | 显示全部楼层
!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖   |

本版积分规则

最新精华