利用方式
在利用方面主要根据场景不同而有所区别,以滑动验证码
为例
- 有完整的图像 and 缺口背景图像 -> 像素亦或的边缘识别 or 模板匹配
- 缺口背景图像 and 滑块图像 -> 模板匹配
- 滑块图像边缘 or 缺口边缘 具有可计算特征 -> 特征边缘识别 (案例)
- …
举例
P.S. 因为才开始学习,限于知识面,可能会有一些更方便快捷的方法而不知,请见谅。
以刚接触的数美来说,提供的是
缺口背景图像
and滑块图像
,所以利用模板匹配来尝试识别
实际上滑块图片为了方便与背景图缺口高度一致,上下采用的透明色,透明部分不处理可能会导致奇怪的匹配(灰度图下透明部分为黑)
为了减小透明部分在灰度下匹配可能产生的影响,第一步就需要对透明部分进行裁剪,有两种方法
边缘检测
和轮廓检测
,简单来说前者检验图形的外层边缘,而后者除了外层边缘还会勾画内层结构,两者对比如下边缘检测 Canny
轮廓检测 findContours
Canny + findContours
采用第三种方法获取轮廓后,我们需要需要对主体部分进行切割,最简单的的办法就是通过轮廓面积排序,获取最大的那个
maxContour = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
再通过
minAreaRect
方法获取最小外接矩形,再利用boxPoints
方法获取外接矩形的四个顶点坐标,这样就可以获取滑块的大致图像rect = cv2.minAreaRect(c) points = np.int0(cv2.boxPoints(rect))
模板匹配
matchTemplate
,每个像素点有一个匹配程度,可通过np.where
筛选阈值,但是经过测试,阈值是根据图像有所变化的,如果需要精确度的话可以通过二分法获取cv2.matchTemplate(image, templ, cv2.TM_CCOEFF_NORMED)
第三个参数是匹配算法,可查看此文档进行了解
最终效果,因最需要数据的是左边的x坐标,而缺口特征也比较明显,所以在裁剪时舍弃了部分滑块右侧凸图像
在最后获取x轴时,需要考虑裁剪时候所带来的误差
因为滑块内图像容易和边界颜色部分重合,否则可以考虑经过腐蚀、膨胀等手段优化边界检测