Android开发笔记(一百五十)自动识别验证码图片
若问目前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开发笔记(一百五十)自动识别验证码图片相关推荐
- Android开发笔记(五十四)数据共享接口ContentProvider
ContentProvider 前面几节介绍了进程间通信的几种方式,包括消息包级别的Messenger.接口调用级别的AIDL.启动页面/服务级别的Notification,还有就是本节这个数据库级别 ...
- Android开发笔记(五十二)通知推送Notification
PendingIntent 准备工作复习一下PendingIntent,前面的博文< Android开发笔记(五十)定时器AlarmManager>已经提到了它.PendingIntent ...
- Android开发笔记(五十九)巧用传感器
传感器Sensor 传感器是Android用来感知周围环境以及运动信息的工具.因为具体的感应信息依赖于相关硬件,所以虽然Android提供了众多的感应器,但不是每部手机都能支持这么多感应器,恰恰相反, ...
- Android开发笔记(五十八)铃声与震动
拖动条SeekBar SeekBar继承自进度条ProcessBar,有关ProcessBar的介绍见<Android开发笔记(四十九)异步任务处理AsyncTask>.SeekBar与P ...
- Android开发笔记(五十六)摄像头拍照
相机Camera Camera是直接操作摄像头硬件的工具类.常用的方法如下: getNumberOfCameras : 获取本机的摄像头数目 open : 打开摄像头,默认打开后置摄像头.如果有多个摄 ...
- Android开发笔记(五十五)手机设备基本操作
获取手机基本信息 手机的基本信息分两类,一类是与电话有关的信息,另一类是设备自身的信息. 与电话有关的信息可由TelephonyManager类获得,常用的参数与对应的方法如下所示: 网络运营商名称 ...
- Android开发笔记(五十)定时器AlarmManager
Timer和TimerTask Java中的定时器机制有现成的方案,就是Timer+TimerTask.其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,如何时启动.间 ...
- Android开发笔记(八十九)单例模式
基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...
- Android开发笔记(八十六)几个特殊的类
接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...
- Android开发笔记(七十九)资源与权限校验
硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...
最新文章
- 阿里移动|《蚂蚁金服移动端高可用技术实践》
- 折纸计算机大全,神之折纸电脑版
- OSGi介绍及OSGi的Bundle应用
- ups一直响是什么原因_UPS的完整形式是什么?
- 唐门的竹林伪原创工具
- Leetcode算法题(C语言)5--存在重复
- JAVA基础知识总结:二十一
- linux 托盘两个输入法图标,linux mint12安装ibus之后,语言栏不跟随光标和系统托盘输入法图标不能显示问题解决...
- Nat模拟虚拟机无法ping通桥接模式虚拟机
- Java小案例--自助饮品消费系统
- CSR867x开发基础教学 - 新建CSR8675默认的sink工程
- Linux-SO_REUSEPORT特性
- 【CQBZOJ - 1205】因式分解问题
- 1234变4321[字符串反转]
- 《滚雪球:巴菲特和他的财富人生》(The Snowball:Warren Buffett and the Business of Life)[PDF] - VeryCD电驴大全...
- CentOS镜像下载(centos7、centos8)
- VINS-Mono 代码解读
- php 修改session 目录,php自定义session保存目录
- 拓嘉启远电商:什么是拼多多蓝海市场
- 随机生成数据字母混合的兑换码(优惠券码红包码)