查看: 12174|回复: 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]
% R2 Y  [3 Z# F2 `# a
8 T" y0 K4 u; Y: o6 E5 n昨天搞了N久不能用代码上传,不能返回正确的OCR信息
7 P5 S$ P4 a7 L9 Q今天问了百度的技术支持,感觉百度的技术支持蛮好的,哈哈" G7 k" E6 A9 m+ M* i7 M# t1 ]! y

; ^3 R6 k* [" p/ S只能说百度的文档给的不全面,所以才会导致我们的各种问题。) t" Z2 a% |0 _# [& l
[color=#ff0000]我现在做的是android上的OCR识别,拍照之后,照片肯定要处理的(像素特别高的手机)[/color]" W# T1 g. h7 Y* P2 n. ?& w7 k3 Z
[color=#ff0000]文档上说图片大小不能大于300KB,所以对图片质量压缩。[/color]" n8 v1 H# o8 J
/ P5 R: c0 C- [: A+ I1 j
[color=#ff0000]一般android高分辨的拍照之后,虽然图片质量压缩了,但是图片的宽高依然很大,这也会导致图片上传无法识别,[/color]
4 {& z% l- z- t! H- q[color=#ff0000]所以建议图片压缩宽高到800*800(个人尝试的结果,你们可以自己去实验,取你们觉得合适的高宽)[/color]
' I3 G( w( V3 t* N4 V3 J4 \[color=#ff0000]- P# K( ^( Z2 a5 u- @' v0 Q5 _
[/color]
3 ]: i: k* V& L3 P; k' k[color=#ff0000]文档上说要对图片BASE64编码,但是这个编码有问题的,还要再Unicode编码一次。[/color]
+ l! \9 b& \* G6 N$ y6 ?& ^$ ?+ \) m
  K0 b' H* n1 B* u/ w3 sUnicode编码是个啥啊,因为BASE64编码之后返回的是个String- B& e& R& {" W( N
同事告诉我,是 urlencode 不是 unicode吧..............,其实就是url编码啦
  E1 g& g' c/ q1 f! [$ C) b# H2 L+ E, ^3 k7 p0 K
下面是我从手机上截图的处理的照片,然后电脑上Java测试的代码,返回的是正确的识别,代码如下. _+ f9 h! ?0 p

. s  k/ i! F, L
* _( r2 w2 G& W' X" a" l& J[code]
; I# p1 P5 ^  w3 y9 N9 E  h0 Z
' M* l0 A" u% t" D4 c( A- Kpublic class FFFFF {
. Y. @+ v4 U1 a* l; ^) x0 |static Object mp;2 Q( m3 N+ z) a1 L+ H. [
/**, A9 D5 d3 v) P6 n
* @param args ‪C:\Users\lenovo\Desktop\vvv.png
+ ~: f3 t: I8 v( P6 X% Q*/
! g0 S3 r! x6 s  kpublic static void main(String[] args) { 9 _, M" Z9 ~/ G* f/ q
String httpUrl = "http://apis.baidu.com/idl_baidu/baiduocrpay/idlocrpaid";
% d3 b- l: }, s+ J* c% b. HString httpArg = "fromdevice=android&clientip=10.10.10.0&detecttype=LocateRecognize&languagetype=CHN_ENG&imagetype=1&image=";# ]; o4 _3 [* a; E) w
Base64 base64 = new Base64();
1 [8 [4 n" E, G' Q! p- ?httpArg=httpArg+URLEncoder.encode(base64.encode(getBytes("C:\\Users\\lenovo\\Desktop\\temp_cropped.jpg")));/ W( l. @1 T& U% K; Q) J
& A: d& L, ^9 |2 I; a
System.out.println(URLEncoder.encode(base64.encode(getBytes("C:\\Users\\lenovo\\Desktop\\temp_cropped.jpg"))));
8 v) D  M0 S' W# i* `String jsonResult = request(httpUrl, httpArg);
3 |4 ?! p' [* vSystem.out.println(jsonResult); . D& _3 V/ |- E: @( S
}& E/ v# P: v! @( l0 E$ [

/ i: d: f/ K' {% [* h, Vpublic static byte[] getBytes(String filePath){ $ Y; ^# Q$ w! @- D  s
byte[] buffer = null;
& H4 ^/ {& B. `$ g( C) ytry {
- i+ c5 b* D; i; B) lFile file = new File(filePath); 8 p% ?0 `  h% k' z' p
FileInputStream fis = new FileInputStream(file);
2 C+ ]  J7 H3 M8 v+ [ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
8 ^$ \/ ]# D' h4 a7 H! |6 ibyte[] b = new byte[1000]; + }$ J7 r* ^! z4 W0 ~6 a. `
int n;
# E; j% Z+ z2 \* X0 X( z6 @( nwhile ((n = fis.read(b)) != -1) { : S  Y* C$ |% C6 z1 J
bos.write(b, 0, n); 3 x# Q0 _% l, c* d
} 1 J' K) J" g4 M' H0 r5 \
fis.close(); $ u8 d2 v7 @8 r0 x
bos.close(); . c. Q- \! E- J5 j/ f- I2 j& t0 A0 \
buffer = bos.toByteArray();
- W# B% i; K9 @* n6 }7 F( B} catch (FileNotFoundException e) { / u* V: s9 S, b: W
e.printStackTrace(); " W; t; @' |9 f5 x0 n# `8 D8 T
} catch (IOException e) { * b9 ^1 H. n4 F7 N4 i" ~8 f" I; K
e.printStackTrace();
8 Y+ J( k# n8 h0 Q5 j: I7 a- C}
7 g- L8 {) ]% ~+ B! g& Zreturn buffer; % Y4 b( g8 [4 n0 I8 z/ Q6 S
} + {% w0 B) m( V: p! r* K. e

9 d) F% U- |" ?# Y+ V' u1 s" a. t& O6 y- g# K0 n# V* X/ n3 x- r9 H
/**
$ O$ ]- n% z8 i9 K. R" i# S* @param urlAll" r7 H6 S  |5 f  I
* :请求接口1 i3 @5 j# f2 O4 U% j* p( L- A
* @param httpArg
; F* Y! m. M6 s* :参数5 ]# g7 V: U  b) L
* @return 返回结果
' M: @; {4 v! K8 s*/
" P/ X# G& o" B& Xpublic static String request(String httpUrl, String httpArg) {6 p2 c( F! r7 Y& Y9 W: G
BufferedReader reader = null;
) {  M+ K- h) [) k! A8 t. R0 J$ NString result = null;
) J$ s* z# n9 @4 G9 c7 mStringBuffer sbf = new StringBuffer();0 p* G' |" `4 w# c7 Z

9 l1 S" i. E6 s( K( U3 Stry {
6 m* T) {$ T4 ]7 |URL url = new URL(httpUrl);
! }* p) O7 R- [0 ], rHttpURLConnection connection = (HttpURLConnection) url9 `' t* x6 a: w
.openConnection();
2 @' t% R* _4 v8 A8 A) Rconnection.setRequestMethod("POST");: J6 `, t9 A/ U+ m* g) _# K1 @. K
connection.setRequestProperty("Content-Type",  K3 v* n: `+ O$ u
"application/x-www-form-urlencoded");
3 O7 ^4 o1 r% d+ j# e# M// 填入apikey到HTTP header
' t/ O" l, u0 G: vconnection.setRequestProperty("apikey", "00821c9616e2386485b9aa6af40af172");
: a0 z0 v3 o- ?9 j# P' [0 mconnection.setDoOutput(true);
# s* b& c: K! ]4 i$ x. Cconnection.getOutputStream().write(httpArg.getBytes("UTF-8"));
; W4 ~+ t! n; S# g2 o1 O3 Aconnection.connect();
) a' X" _9 N* M- P8 B* ]InputStream is = connection.getInputStream();
  u( `: ^( l4 o% O1 treader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  m# e8 s! j4 GString strRead = null;3 [7 C  F" L8 }. V, u4 s
while ((strRead = reader.readLine()) != null) {
1 B  M3 q( g3 z* k& e# J! Zsbf.append(strRead);
- {- W$ f7 N  N; d( q/ p) `& R: Asbf.append("\r\n");# V6 [$ y9 |& T
}$ m% L' ?: V) \7 [5 X
reader.close();# G' W5 ~1 G+ A% l) ~% i5 C8 U
result = sbf.toString();: L  t7 K8 Y- V' R  i  x
} catch (Exception e) {
" O* ]- {2 e2 V- G, B% N  Qe.printStackTrace();. B- L* e3 e. b4 |
}
/ J  v- f/ _6 \" {* }9 }% Jreturn result;
0 Y0 A, p+ l4 e# d8 q}
) J* c- v8 V& H. k, h' ]+ {
& N, Z; j2 f) F) f. Z- y
3 h& S! O7 x  @6 p' e}
$ T; b1 @2 Z; [' q- p& o9 k
! K$ _) m; H- \! n0 _0 r! @" |) U# \" r2 r
% ]- Z. ~5 x# C) L1 L/ r$ P; t

5 U  r. C7 d5 W: D+ b  u' w- [' P5 N* @9 i: f/ j: M+ H
BASE64的代码也贴出来吧
$ `+ t( c* C: s! b) c7 d% I
" |  S) Q. O3 }7 v; L9 ]- G- Spublic class Base64 {
+ i* K3 d  _. p% D6 ^* I% v
- e3 Q- m! Z* w  [& yprivate static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D',, E7 K, I- v+ j" R& w2 |
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
# q/ r5 Z! i9 z+ T0 ?; H( N'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',( `  k0 ^% s+ Q
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
% E) ]& e1 V: l8 ?% M'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',4 ~7 N0 N( q9 s# A" R& j' W
'4', '5', '6', '7', '8', '9', '+', '/' };- h: G% G' Z/ ^
# x; L# B, I; s5 ^
private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1,2 \8 }3 A" n- D" Z. ]
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,3 h$ B" Y+ y" D4 r# U+ K
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ x( Y1 b! N/ K' l$ P2 i5 r: x6 n-1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59,9 x' t+ W+ O  h/ f
60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
% c; `1 |- F5 q6 @. g- k10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1,
. {3 D: q2 R# S( a# i! ?2 v-1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,) l+ [% t8 B1 [+ p2 ?: B" s! t  n! ?
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1,8 X" M: f9 v, K. n5 T
-1, -1 };$ j0 l/ H3 p8 Z9 Q8 L. H7 D

& C$ ^3 s+ u8 t: W+ b9 m0 m  b& o$ n5 B7 P# q, F& @$ C
public static String encode(byte[] data) {+ K; V7 M& o2 @$ k) U7 w4 w
StringBuffer sb = new StringBuffer();
3 M+ d5 ]/ ^/ Q( ^7 Mint len = data.length;  P( n' c9 i& x/ B
int i = 0;; V6 S/ ]( \8 r' L0 S4 m" r
int b1, b2, b3;
, i3 k! R* y3 y* u' G+ y2 l- R
" C+ ?9 g( A; T+ Owhile (i < len) {1 b6 ^: `- {' C
b1 = data[i++] & 0xff;
& V7 P! E7 |: n. j+ A5 `8 I- hif (i == len) {
2 i6 O0 K& b" q5 h5 Msb.append(base64EncodeChars[b1 >>> 2]);
( n7 x. k3 O0 F$ X: X( n' jsb.append(base64EncodeChars[(b1 & 0x3) << 4]);, r8 p% d4 T% b* C; Y5 S$ g" o
sb.append("==");+ a. C  `- r8 `3 F5 l1 |5 ?
break;
1 N) u$ G' O. |, S% q* a% G}' O* k6 _) V2 {7 x* S
b2 = data[i++] & 0xff;
2 k! O- u5 L' Q( ]if (i == len) {3 ]  Z! R% ^; i& n+ ?* L6 f
sb.append(base64EncodeChars[b1 >>> 2]);
, w5 a2 ?: y8 f/ e5 \sb.append(base64EncodeChars[((b1 & 0x03) << 4)
8 d3 `, w) J) h/ [, [0 x| ((b2 & 0xf0) >>> 4)]);
" N( i! K, u0 S+ osb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
+ q( K; a$ {" Dsb.append("=");! k$ l! a2 ^, Z7 m# b3 n
break;
$ p# I- k- w8 j+ U; v}
8 t( P) L3 u% t8 Z2 H% }b3 = data[i++] & 0xff;
4 U3 N/ h. N2 B! t/ X* N2 u: A; E* Rsb.append(base64EncodeChars[b1 >>> 2]);) ]  ^  H3 x* |6 X+ {: |
sb.append(base64EncodeChars[((b1 & 0x03) << 4)
! M1 s) \1 Q  R& r8 d| ((b2 & 0xf0) >>> 4)]);/ q1 u& c, R# \) x" t/ y1 F+ h
sb.append(base64EncodeChars[((b2 & 0x0f) << 2)3 V$ P( o: J: m, ]8 `
| ((b3 & 0xc0) >>> 6)]);
7 q  Q1 j3 g3 `! E  R$ {1 C/ Jsb.append(base64EncodeChars[b3 & 0x3f]);
2 E# ]# d: _9 c% y}6 L* N# Y  @4 _' K1 h
return sb.toString();
: i2 H: _$ s: c& [6 T}
) O* X1 m5 D! i5 ^, A
  D( w4 |$ M3 Opublic static byte[] decode(String str) {5 c) D) N& k) m& Z, Y
byte[] data = str.getBytes();
2 C+ x! h3 ^6 Z- B2 V* }4 eint len = data.length;4 P5 Q4 z# B  z" G) y  X
ByteArrayOutputStream buf = new ByteArrayOutputStream(len);3 R' A0 o* d; N3 A8 m9 M
int i = 0;
! W1 M1 d9 o+ r$ a* _int b1, b2, b3, b4;* W0 n0 L( t- l- f

; G9 O( z  }$ l% ?while (i < len) {
% T2 G* G( J2 n+ H2 a
( e2 R- N* O" f( c- p" Z. @( \3 n/* b1 */
/ Y$ |9 N. D% _do {( }$ w* L, v, \8 _
b1 = base64DecodeChars[data[i++]];
- {1 J; r3 H0 t0 h8 H; [} while (i < len && b1 == -1);: o5 e: p0 F3 L+ T- \, ~2 X
if (b1 == -1) {  D2 h) Y9 e+ g+ m$ l, b3 l
break;
& S* r- ^8 P, M, ]. ]1 q}( e# l- C& K  q/ J+ g* \

7 ^# [9 k* {; D4 s0 |/* b2 */
, \+ H/ e; C/ i) F% _+ qdo {
5 e4 k2 K* i1 r0 ]: Y. U) u7 Ob2 = base64DecodeChars[data[i++]];+ E) \  k1 J7 t3 k! t
} while (i < len && b2 == -1);9 L. ?# @" ~, B  C5 w7 W( b0 M9 e
if (b2 == -1) {
) S" e3 S. |$ ?" g: c8 l; S' P1 gbreak;6 j6 g, h; G( e- N# J( ~
}- E$ b5 O: S; k# J9 a7 j
buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));
6 r& ?8 T. p) D" S5 a& ]8 K" `
$ s2 p: m4 i- V- T/* b3 */
7 M- q8 I- i! r( F4 Z7 A0 Bdo {
  E' i, `  i% Hb3 = data[i++];
4 v" a+ r/ I- M$ Z- Eif (b3 == 61) {
) r- T0 ~# ?) z& Nreturn buf.toByteArray();- ^5 E  W0 O! @; I
}
) ~" N% W  I  Ob3 = base64DecodeChars[b3];
5 h$ w# A) J& L" ]( ?! R} while (i < len && b3 == -1);% W( \) O" q( d9 L
if (b3 == -1) {
( m2 w! Z5 `  K  e* }; N# Wbreak;
/ ~0 s, z4 y8 y6 T}; j, d% Z; I' |& {
buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));
9 a8 g  `- J7 y. t& Q) V/ m9 ~
. ~0 C- l* y5 r; ^' Y* X9 ]: z/* b4 */& i+ R& t- q* f- I! x
do {
1 @* M% ]) K+ p# N8 ^9 sb4 = data[i++];
3 W' G4 i: u+ I# P1 t5 |if (b4 == 61) {
& J; L/ A; q& h: `: {5 D' Treturn buf.toByteArray();; m+ B7 C$ j8 M7 _6 J2 k
}
# `! @+ Z% `4 @0 p0 T! A2 n4 Eb4 = base64DecodeChars[b4];0 O9 X: z8 g& C( x7 F" h
} while (i < len && b4 == -1);
' D; R& ]3 O( C% j+ I, ~if (b4 == -1) {
( @% c. S7 z* lbreak;, \* s4 {. v# Z/ I
}3 f+ T- H) a0 u9 T
buf.write((int) (((b3 & 0x03) << 6) | b4));
9 H4 x% c9 y$ R: m$ C}
. ~6 [" C* Y0 U! f0 Y* sreturn buf.toByteArray();! B, }( v" K4 l# g
}
+ @8 l5 B+ A' P: D+ d$ Y
7 }" R& M- T. B" a8 cpublic static void main(String[] args) {
; r8 l2 p$ S% ?! U& nBase64 base64 = new Base64();/ d8 G- v5 q# {! E* f
% G! p" q; T( l
String testStr = "{\"name\":\"vicken\",\"age\":20}";* H: i7 M( q7 u( K7 a7 G
System.out.println("加密前:" + testStr);
) G/ `' @$ j) ^/ X
& l4 @' `% B8 C+ U( T; D$ oString encodeStr = base64.encode(testStr.getBytes());
# E* g% B+ K0 }" H/ ~) VSystem.out.println("加密数据:" + encodeStr);8 r& W3 I3 b; A" K8 \( I
9 R4 `- e6 Y( k7 p* A
byte[] decodeStr = base64.decode(encodeStr);# c1 E" E; ^( p$ ?
System.out.println("解密数据:" + new String(decodeStr));
) \3 n/ W6 H9 i" u% d4 t# U}
) A' K1 b7 J9 H( c9 F! c2 C
% v, G* v$ }- L% h" C}
' m. e, b% `5 O9 k9 Y) k* b3 ]: E3 r# W4 V( |  v
[/code]
- W, _2 g4 ]( T* i9 J! d
  J7 R$ t/ w" h' ~
回复

使用道具 举报

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 | 显示全部楼层
!!!!!!!!!!!
回复

使用道具 举报

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

本版积分规则

最新精华