若问目前IT领域最炙手可热的技术方向,必属人工智能(简称AI)无疑。前有谷歌的阿法狗完胜围棋世界冠军柯洁,后有微软小冰出版了诗集《阳光失了玻璃窗》,一时间沸沸扬扬,似乎人工智能无所不能,从而掀起了人民大众了解和关注AI的大潮。

虽然人工智能看起来仿佛刚刚兴起,但是它的相关产品早已普遍应用,在工业制造领域,有越来越多的机器人用于自动化生产;在家庭生活领域,则有智能锁、扫地机器人等助力智能家居。这些智能产品的背后,离不开人工智能的几项基本技术,包括计算机视觉、自然语言处理、数据挖掘与分析等等。这几项技术的应用说明如下:
1、计算机视觉,包括图像识别,视频识别等技术,可应用于指纹识别、人脸识别、无人驾驶汽车等等;
2、自然语言处理,包括音频识别、语义分析等技术,可应用于机器翻译、语音速记、信息检索等等;
3、数据挖掘与分析,包括大数据的相关处理技术,可应用于商品推荐、天气预报、红绿灯优化等等;
上述的几个人工智能应用,看似牛逼,可是这跟Android开发有什么关系呢?其实手机App很早就用上了相关的智能技术,还记得12306网站的神奇验证码吧,买张热点地区的火车票一直是个老大难,常常在火车站售票窗口排了许久的队伍,终于排到你的时候却发现目的地的火车票卖光了。特别是春运的时候,即使不到售票窗口排队,而是到12306网站买票,也常常因为各种操作问题贻误下单,于是各种抢票插件应运而生,帮助用户自动登录、自动选择乘车日期和起止站点、自动下单抢票。抢票插件的核心功能之一,便是自动识别登录过程中的验证码图片,原本这个验证码图片是用来阻止程序自动登录的,然而道高一尺魔高一丈,任你采取图片验证码又如何,抢票插件照样能够识别出图片所呈现出来的形状。注意,这里提到的识别图片中的验证码,即为人工智能的一项初级应用。

验证码图片识别,最简单的是数字验证码,因为数字只有从0到9一共十个字符,并且每个数字的形状也比较简单,所以本文就从数字验证码的识别着手,拨开高大上的迷雾,谈谈人工智能的初级应用。
先来看看一张再普通不过的验证码图片:

这张验证码图片蕴含的数字串为8342,拿到该图片,接下来要进行以下步骤的处理:
首先对该图片进行裁剪操作,去掉外围的空白区域,把每个数字所处的区域单独抠出来。如下图所示,四个数字被红框圈出了四段图片:

然后对每个数字方块再做切割,一般是按照九宫格切为九块,分别是左上角、正上方、右上角、正左边、中央、正右边、左下角、正下方、右下角,切割后的效果如下图所示:

之所以把数字方块切成九块,是因为每个数字的形状在不同方位各有侧重点,比如数字3在正左边是空白的,而数字8的正左边有线条;又比如数字6在右上角空白、在右下角有线条,而数字9在右上角有线条、在右下角空白。分别判断九个方位上的线条像素,即可筛选符合条件的数字,进而推断出最可能的数字字符。

一般情况下,图片中的数字颜色较深,其它区域颜色较浅,通过判断每个方格上的像素点颜色深浅,就能得知该方格是否有线条经过。获取像素点的颜色深浅主要有以下几个步骤:
1、调用Bitmap对象的getPixel,获得指定xy坐标的像素点,代码如下:

Color color = bitmap.getPixel(x, y);

2、调用Integer类的toHexString方法,把Color对象转换为String对象,代码如下:

String colorStr = Integer.toHexString(color);

3、第2步得到的String对象是个长度为8的字符串,其中前两位表示透明度,3到4位表示红色浓度,5到6位表示绿色浓度,7到8位表示蓝色浓度,另外需要把16进制的颜色浓度转换为10进制的浓度数值,示例代码如下:

 public static int getRed(String colorStr) {return Integer.parseInt(colorStr.substring(2, 4), 16);}public static int getGreen(String colorStr) {return Integer.parseInt(colorStr.substring(4, 6), 16);}public static int getBlue(String colorStr) {return Integer.parseInt(colorStr.substring(6, 8), 16);}

下面列举几个识别验证码的效果图,第一张是浅色背景的验证码图片,由于数字整齐故而识别成功率很高:

第二张是深色背景的验证码图片,经过调节颜色的深浅对比度,识别成功率也很高:

最后一张的验证码图片不那么整齐了,每个数字都有三种对齐方式,分别是立正、向左倾斜、向右倾斜,此时数字识别难度加大,原先的算法识别成功率不高,需要加以优化:

点此查看Android开发笔记的完整目录

__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

Android开发笔记(一百五十)自动识别验证码图片相关推荐

  1. Android开发笔记(五十四)数据共享接口ContentProvider

    ContentProvider 前面几节介绍了进程间通信的几种方式,包括消息包级别的Messenger.接口调用级别的AIDL.启动页面/服务级别的Notification,还有就是本节这个数据库级别 ...

  2. Android开发笔记(五十二)通知推送Notification

    PendingIntent 准备工作复习一下PendingIntent,前面的博文< Android开发笔记(五十)定时器AlarmManager>已经提到了它.PendingIntent ...

  3. Android开发笔记(五十九)巧用传感器

    传感器Sensor 传感器是Android用来感知周围环境以及运动信息的工具.因为具体的感应信息依赖于相关硬件,所以虽然Android提供了众多的感应器,但不是每部手机都能支持这么多感应器,恰恰相反, ...

  4. Android开发笔记(五十八)铃声与震动

    拖动条SeekBar SeekBar继承自进度条ProcessBar,有关ProcessBar的介绍见<Android开发笔记(四十九)异步任务处理AsyncTask>.SeekBar与P ...

  5. Android开发笔记(五十六)摄像头拍照

    相机Camera Camera是直接操作摄像头硬件的工具类.常用的方法如下: getNumberOfCameras : 获取本机的摄像头数目 open : 打开摄像头,默认打开后置摄像头.如果有多个摄 ...

  6. Android开发笔记(五十五)手机设备基本操作

    获取手机基本信息 手机的基本信息分两类,一类是与电话有关的信息,另一类是设备自身的信息. 与电话有关的信息可由TelephonyManager类获得,常用的参数与对应的方法如下所示: 网络运营商名称 ...

  7. Android开发笔记(五十)定时器AlarmManager

    Timer和TimerTask Java中的定时器机制有现成的方案,就是Timer+TimerTask.其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,如何时启动.间 ...

  8. Android开发笔记(八十九)单例模式

    基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...

  9. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

  10. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

最新文章

  1. 阿里移动|《蚂蚁金服移动端高可用技术实践》
  2. 折纸计算机大全,神之折纸电脑版
  3. OSGi介绍及OSGi的Bundle应用
  4. ups一直响是什么原因_UPS的完整形式是什么?
  5. 唐门的竹林伪原创工具
  6. Leetcode算法题(C语言)5--存在重复
  7. JAVA基础知识总结:二十一
  8. linux 托盘两个输入法图标,linux mint12安装ibus之后,语言栏不跟随光标和系统托盘输入法图标不能显示问题解决...
  9. Nat模拟虚拟机无法ping通桥接模式虚拟机
  10. Java小案例--自助饮品消费系统
  11. CSR867x开发基础教学 - 新建CSR8675默认的sink工程
  12. Linux-SO_REUSEPORT特性
  13. 【CQBZOJ - 1205】因式分解问题
  14. 1234变4321[字符串反转]
  15. 《滚雪球:巴菲特和他的财富人生》(The Snowball:Warren Buffett and the Business of Life)[PDF] - VeryCD电驴大全...
  16. CentOS镜像下载(centos7、centos8)
  17. VINS-Mono 代码解读
  18. php 修改session 目录,php自定义session保存目录
  19. 拓嘉启远电商:什么是拼多多蓝海市场
  20. 随机生成数据字母混合的兑换码(优惠券码红包码)

热门文章

  1. 高通平台稳定性分析-CFI failure
  2. Spring 设置跨源资源共享(CORS)
  3. 2022年中国代码托管工具真实测评
  4. 微信支付的支付流程涉及哪些接口
  5. javaweb实验1和2---H5C3
  6. 微信支付原总经理吴毅:离开腾讯,如何再战蚂蚁金服?
  7. 折叠屏、5G手机频发背后:物联网时代的角色畅想
  8. Fibonacci数列C语言三种实现方法
  9. labview自定义控件
  10. QINQ 交换机配置