目标介绍
验证码来自某招聘网站企业版登录入口
大概长这样:
我把上面的图叫做src,下面的图叫做query,要做的就是根据src,找到query中相应的位置
src:
query:
项目地址在这
一些方法的封装:
1 | # coding=utf-8 |
模板匹配
多刷新几次你会发现 src的文字在图片中的位置都是固定的
那处理起来就很方便了,灰度化之后直接按像素分割
1 | src1 = cv2.imread(resPath + '/src1.png', cv2.COLOR_BGR2BGRA) |
query更简单,灰度化处理一下
1 | query_gray = cv2.cvtColor(query, cv2.COLOR_BGR2GRAY) |
然后就可以开始匹配了
1 | def template_match(src, query): |
结果:
上面写的也太水了吧,没有困难我们就创造困难。。比如人家把字体大小、分辨率给改了,那么模板匹配很可能就不行了
OCR文字识别
大体思路就是分割src,通过谷歌的tesseract转换成文字,再把query中的文字一个个抓出来识别,因为query中字体位置无规律,一整张放进去也无法识别。
src:
src的处理就不多说了,二值化之后固定分割,甚至可以不处理直接分割,然后再识别即可主要看query的处理。
query:
二值化:
1 | gray_query = cv2.cvtColor(query, cv2.COLOR_BGR2GRAY) |
由于字体是黑色的,所以我们要通过腐蚀操作处理一下(其实可以先膨胀去除右边的小黑点再腐蚀的),让下面轮廓识别提取坐标更准确一些:
1 | erode_query = erode_img(binary_query) |
注意到轮廓识别是在黑色背景中,识别白色轮廓,所以要做个颜色翻转,再识别:
1 | # 翻转颜色来查找轮廓 |
在原图上把轮廓画出来,如下
然后处理一下轮廓数据,去掉一些轮廓siez明显不符合的,以及把轮廓整成矩形的
1 | coorList = [] |
有了每个文字的坐标,就可以抠出这些文字来进行ocr了
1 | # 根据形状来切割每个字符 并进行ocr识别 |
识别出来的word如下:
第一个看来轮廓没处理好,但是也不碍事~