什么是OCR?

粗暴点说就是图片文本识别!正规点的说法就是:(Optical Character Recognition,光学电子识别)

最近公司开展新项目,考虑到实名认证这方面,然后还要上传身份证正反面,这就会涉及到一个问题,就是填写的身份证号,跟图片的身份证号对不上,或者我的图片是瞎上传的那种,那应该怎么办?

那只能使用图片文本识别就是所谓的OCR!

有很多种方法可以实现,比如人民币玩家的可以接第三方:聚合、阿里、腾讯.......等等众多平台都有相关的方案,

平民玩家的,也有插件:tesseract 但是需要翻墙下载,我这两天翻不了墙,我就不试了,百度大把大把的教程,但是平民玩家会麻烦一点,这是肯定的,我思考了一下,还是用第三方的吧,简单粗暴点

我选择的是聚合数据OCR,https://www.juhe.cn/docs/api/id/287

步骤如下:

1)注册聚合数据账号

2)实名认证(我是拿公司的资料去认证的)

3)申请OCR(首次会有10次赠送)

4)获取图片转base64

5)请求一下接口就行了,就那么简单

直接上代码吧:

  1. /**
  2. * 获取网络图片
  3. * @param imageUrl 图片URL
  4. * @return
  5. * @throws Exception
  6. */
  7. public static String getURLImage(String imageUrl) throws Exception {
  8. //new一个URL对象
  9. URL url = new URL(imageUrl);
  10. //打开链接
  11. HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  12. //设置请求方式为"GET"
  13. conn.setRequestMethod("GET");
  14. //超时响应时间为30秒
  15. conn.setConnectTimeout(30 * 1000);
  16. //通过输入流获取图片数据
  17. InputStream inStream = conn.getInputStream();
  18. //得到图片的二进制数据,以二进制封装得到数据,具有通用性
  19. byte[] data = readInputStream(inStream);
  20. // 转码
  21. BASE64Encoder encode = new BASE64Encoder();
  22. String s = encode.encode(data);
  23. return s;
  24. }
  25.  
  26. /**
  27. * 已二进制去封装图片
  28. * @param inStream 数据流
  29. * @return
  30. * @throws Exception
  31. */
  32. private static byte[] readInputStream(InputStream inStream) throws Exception{
  33. ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  34. //创建一个Buffer字符串
  35. byte[] buffer = new byte[1024];
  36. //每次读取的字符串长度,如果为-1,代表全部读取完毕
  37. int len = 0;
  38. //使用一个输入流从buffer里把数据读取出来
  39. while( (len=inStream.read(buffer)) != -1 ){
  40. //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
  41. outStream.write(buffer, 0, len);
  42. }
  43. //关闭输入流
  44. inStream.close();
  45. //把outStream里的数据写入内存
  46. return outStream.toByteArray();
  47. }

以上代码,是用于获取图片并且转成base64的

测试代码

  1. public static void main(String[] args) throws Exception {
  2. // 获取图片base64
  3. String base64str = getURLImage("https://www.wobokeji.com/justgoFile/upload/image/1.jpg");
  4. // System.out.println(base64str);
  5. // 参数封装
  6. NutMap map = new NutMap();
  7. map.addv("key", "84f7e1be67db18c721fcfb0685720a11");
  8. map.addv("image", base64str);
  9. map.addv("side", "front");
  10. // 请求聚合接口
  11. String str = Http.post("http://apis.juhe.cn/idimage/verify", map, 20 * 1000);
  12. System.out.println(str);
  13. }

我用的框架是Nutz,这个框架都封装了一些Http请求的方法,我就直接拿来用了

看控制台打印,以下结果我都换了多张图片去测试,准确率满分,

注:昨晚就开始搞这个了,然后遇到了个异常,那时候没想出来是什么原因,就放了一下,回去之后,我在想,是不是转了base64之后就变成了200多万个字节的问题,是不是聚合那边不接受那么长的参数,如果不接收,那为什么需要转base64?后面仔细想了一下代码,猛地发现,是不是链接超时了?因为我的超时时间是 1000 毫秒,也就是 1 秒,那我想了一下,从我这里请求聚合 --》 聚合去识别这张图片并返回数据给我,这个过程需要多久?早上回来第一时间把连接时间改成20秒,然后整个世界都安静了,妈的,我就是个智障

还有一个点就是 转 base64 需要 sun.misc.base64decoder.jar 这个jar我找了一下,找不到maven的我就没照了,各位有人找到的话,给我留个言,哈哈哈哈

Java菜鸟浅谈OCR的更多相关文章

  1. 浅谈OCR之Onenote 2010

    原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...

  2. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. java多线程浅谈

    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 分这几种情况:    1.其他方法前是否加了synchronized关键字,如果没加,则能.    2 ...

  4. Java:浅谈InputStream的close方法

    原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...

  5. 【JAVA】浅谈java内部类

    一.什么是内部类? 到底什么是内部类呢?通俗的讲,就是在类内部定义的类,包括定义在一个类的方法外面.方法里面或者代码块中. 二.为什么要使用内部类? 为什么我们要不走寻常路,把一个类定义在另一个类的内 ...

  6. 【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  7. java - 异常浅谈

    java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户 ...

  8. 通过Java代码浅谈HTTP协议

    最近刚看了http协议,想写点东西加深一下理解,如果哪儿写错了,请指正. 1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(W ...

  9. java序列化浅谈

    首先大家进来第一个疑问肯定是"什么是序列化?为什么要使用序列化?怎么实现一个简单的序列化案例?" 1.序列化就是把对象以一种规范的二进制形式存在内存中,另一边以反序列化方式获取: ...

随机推荐

  1. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  2. spring-boot-devtools在Idea中热部署方法

    1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.sprin ...

  3. OS + CentOS / http_proxy / https_proxy / dalishangwang / repo

    s OS + Linux RedHat / redhat7 / redhat 7 / redhat 6 / redhat 5 https://lindows.iteye.com/blog/456637 ...

  4. 机器学习 - 损失计算-softmax_cross_entropy_with_logits

    tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None) 第一个参数logits:就是神经网络最后一层的输出 第二个参数la ...

  5. c# mvc 在控制器中动态解析cshtml文件并获取对应的html代码

    public static string GetViewHtml(ControllerContext context, string viewName, Object param) { if (str ...

  6. [Android] Android RxJava2+Retrofit2+OkHttp3 的使用

    [Android] Android RxJava2+Retrofit2+OkHttp3 简单介绍Retrofit.OKHttp和RxJava之间的关系: Retrofit:Retrofit是Squar ...

  7. [物理学与PDEs]第1章第2节 预备知识 2.2 Ampere-Biot-Savart 定律, 静磁场的散度与旋度

    1. 电流密度, 电荷守恒定律 (1) 电荷的定向移动形成电流. (2) 电流密度 ${\bf j}$, 是描述导体内一点在某一时刻电流流动情况的物理量, 用单位时间内通过垂直于电流方向的单位面积的电 ...

  8. Design Principles and Design Patterns

    设计原则解读. 设计原则是对设计模式的约束性要求,属于设计中基本的四项特征,不符合此四项特征的设计,不具有生命力. 设计模式也是在此四项设计原则上的具体化实例化衍生物. Martin原文: http: ...

  9. cpp智能指针

    weak_ptr<Cls1> wp1; { shared_ptr<Cls1> ptr1(new Cls1);//共享指针 wp1 = ptr1;//临时共享指针 std::co ...

  10. cvc-complex-type.2.4.a: Invalid content was found starting with element 'asy