有很多“程序猿”自己写验证码识别模块,他们自己写的时候是这样的,当然不一定大家都这样写,肯定有更好的算法。
1、遍历所有像素点(像PHP就是先getimagesize,获取i和j,然后用imagecolorat进行两重循环,就可以得到所有像素点的RGB值数据),然后二值化【比如判断RGB值小于#FFFFFF的(即非白色)时候标记为1,大于等于#FFFFFF(即白色)的标记为0,存进二维数组】,最后得到一个19*7的二维数组;
2、删除干扰的点、线(干扰像素的特点是不连续,占用的像素点少,可以很容易地设计算法容易过滤,如果干扰像素采用了和验证码正文明显不同的颜色,则可以在第一步二值化中直接去掉。这个例子里没有干扰点、干扰线)
3、把数组里连续的字符切割成一个个独立的字符(像下面这个,最右边一列都是0,就可以判断是图像边缘,然后切开,最后可以得到三个类似这样的6*6二维数组。实际切开的话,最右边一列是没有整列都是0的情况的,这里是我特地加上的。)如果字符有旋转的,还得根据边缘把它再给摆直
4、然后直接循环匹配已有的所有的同字体的数据(同样是二值化数据,这些数据是哪里来的呢?一般是先作完前面3步,然后把那些二值化数据一个个全部复制下来,多刷新十几次获取样本,运气好的话[A-Z],[0-9]就都有了),达到一定的相似度(不要求完全匹配),就认定这个验证码的其中这个字符是2。除了这种比较外,还有根据概率、机器学习等等大量方法来做这最后一步。现在验证码的设计难点主要是放在防止字符被切割上。
返回结果
<div "="" style="margin: 0px; padding: 0px; list-style-type: none; line-height: 21.6000003814697px; font-family: helvetica, arial, verdana, sans-serif; font-size: 15px;">
1、遍历所有像素点(像PHP就是先getimagesize,获取i和j,然后用imagecolorat进行两重循环,就可以得到所有像素点的RGB值数据),然后二值化【比如判断RGB值小于#FFFFFF的(即非白色)时候标记为1,大于等于#FFFFFF(即白色)的标记为0,存进二维数组】,最后得到一个19*7的二维数组;
2、删除干扰的点、线(干扰像素的特点是不连续,占用的像素点少,可以很容易地设计算法容易过滤,如果干扰像素采用了和验证码正文明显不同的颜色,则可以在第一步二值化中直接去掉。这个例子里没有干扰点、干扰线)
3、把数组里连续的字符切割成一个个独立的字符(像下面这个,最右边一列都是0,就可以判断是图像边缘,然后切开,最后可以得到三个类似这样的6*6二维数组。实际切开的话,最右边一列是没有整列都是0的情况的,这里是我特地加上的。)如果字符有旋转的,还得根据边缘把它再给摆直
4、然后直接循环匹配已有的所有的同字体的数据(同样是二值化数据,这些数据是哪里来的呢?一般是先作完前面3步,然后把那些二值化数据一个个全部复制下来,多刷新十几次获取样本,运气好的话[A-Z],[0-9]就都有了),达到一定的相似度(不要求完全匹配),就认定这个验证码的其中这个字符是2。除了这种比较外,还有根据概率、机器学习等等大量方法来做这最后一步。现在验证码的设计难点主要是放在防止字符被切割上。
有些“程序猿”可能自己不会写验证码识别技术模块,他们就会要找像答题吧验证码识别这样的平台来进行对接,以便于更好的完成这项工作。具体如下:
对接这个接口具体的注意事项如下:
注意事项
1.开发时需要修改HTTP请求默认超时时间,具体数值需要大于任务超时的timeout参数。
2.特殊题如:中文、选择、类型较难完成的请把任务超时(timeout参数)设置大于100秒,以便满足任务重新分配机制。
3.网络环境中HTTP劫持会影响使用结果。
4.任务执行中切勿断拨或切断网络,否则无法接收结果。
正确返回
JSON:{"Result":"答题结果","id":"题目Id(报错使用)"}
错误返回
文本消息
开发建议推荐各开发者JSON方式为数据返回,为了代码运行更加健壮数据返回后先判断Result和Id两个分支是否存在,如果返回数据没有这两个分支就完全可以当错误返回处理。