OpenCV(python版)识别滑块验证中的缺⼝
前⾔
验证码往往是爬⾍路上的⼀只拦路虎,⽽其花样也是层出不穷:图⽚验证、滑块验证、交互式验证、⾏为验证等。随着OCR技术的成熟,图⽚验证已经渐渐淡出主流,⽽「滑块验证」越来越多地出现在⼤众视野。“这么厉害,这⼩⼦长啥样呢?”没错,它就长这损sai:
解决它的⽅法也很直观,⾸先到缺⼝的位置(通常只需要X轴的位置),然后拖动滑块即可。今天kimol君将带领⼤家⽤python识别出滑块验证中的缺⼝位置。
⼀、缺⼝识别
识别图⽚中的缺⼝,主要是利⽤python中的图像处理库cv2,其安装⽅法如下:
pip install opencv-python
以上⽅式可能安装失败,可以尝试以下⽅式:
python -m pip install opencv-python -i pypi.douban/simple/ --trusted-host pypi.douban
注:这⾥并不是“pip install cv2”哦~
1.读取图⽚
滑块验证的图⽚分为两部分,⼀个是背景图⽚:
另⼀个是缺⼝图⽚:
利⽤imread函数将其读取:
# 读取背景图⽚和缺⼝图⽚
bg_img = cv2.imread('bg.jpg') # 背景图⽚
tp_img = cv2.imread('tp.png') # 缺⼝图⽚
2.识别图⽚边缘
为了更好地将缺⼝与背景匹配,我们⾸先得识别出图⽚的边缘:
# 识别图⽚边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
这⼀步很关键!否则缺⼝匹配将不准确。
这⾥得到了图⽚边缘的灰度图,进⼀步将其图⽚格式转为RGB格式:
# 转换图⽚格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
转换后的背景图为:
转换后的缺⼝图为:
3.缺⼝匹配
利⽤cv2中的matchTemplate函数,可以在背景图⽚中搜索对应的缺⼝,具体代码如下:
# 缺⼝匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
res为每个位置的匹配结果,代表了匹配的概率,选出其中「概率最⾼」的点,即为缺⼝匹配的位置:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻最优匹配
min_val,max_val,min_loc,max_loc分别为匹配的最⼩值、匹配的最⼤值、最⼩值的位置、最⼤值的位置。ps.当然,这⾥完全可以⾃⼰写⼀个循环来实现,但是有现成的函数为什么不⽤呢?
⾄此,我们已经有了缺⼝的位置,其X轴坐标为:
X = max_loc[0]
为了更直观地展⽰缺⼝的位置,我们将缺⼝⽤矩形框标注出来:
# 绘制⽅框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上⾓点的坐标
br = (tl[0]+tw,tl[1]+th) # 右下⾓点的坐标
cv2.imwrite('out.jpg', bg_img) # 保存在本地
结果如下:
完美~ 收⼯
⼆、完整代码
为了在实际应⽤中更⽅便的使⽤,我们将代码封装为⼀个函数:
def identify_gap(bg,tp,out):
'''
bg: 背景图⽚
tp: 缺⼝图⽚
out:输出图⽚
'''
# 读取背景图⽚和缺⼝图⽚
bg_img = cv2.imread(bg) # 背景图⽚
tp_img = cv2.imread(tp) # 缺⼝图⽚
# 识别图⽚边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 转换图⽚格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺⼝匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻最优匹配
# 绘制⽅框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上⾓点的坐标
rectangle函数opencv
br = (tl[0]+tw,tl[1]+th) # 右下⾓点的坐标
cv2.imwrite(out, bg_img) # 保存在本地
# 返回缺⼝的X坐标
return tl[0]
这⾥选择了读取本地图⽚⽂件,在爬⾍过程中其实不是特别⽅便。如果有感兴趣的⼩伙伴,可以⾃⼰改动⼀下,将输⼊改为图⽚流即可。写在最后
本⽂⾄此便告于段落了,如果需要完整源码或者有任何建议都欢迎在评论区留⾔或私信。最后,感谢各位⼩伙伴的耐⼼阅读,咋们下次再会~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。