Python-Opencv 识别滑块验证码缺口位置(一)

Python-Opencv 识别滑块验证码缺口位置

本篇主要围绕opencv中的两个部分:边缘检测和轮廓提取

首先看一下我的验证码类型,此款验证码非常的简单,背景单一,没有太多的噪音,加上灰度滑块也比较清晰,所以直接用opencv中的边缘检测加上轮廓提取轻易就能实现。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以下是代码和结果,这里主要就是几个点需要注意,我首先转了灰度图,但是实际上,不用转灰度图效果也不差,然后用了高斯模糊,这是为了去除背景的一些干扰,针对上述滑块图片效果良好,再然后就是Canny边缘检测和cv2的轮廓提取了,在轮廓的循环中,去掉了一些不可能的小轮廓与大轮廓,做了一些筛选。

import cv2
import base64
import numpy as np

def cv_show(img): # 展示图片
    cv2.imshow("img", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread("slider.png")
img = cv2.resize(img, (500,200)) # 转换图片尺寸
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图片

img2 = cv2.GaussianBlur(gray, (5,5), 0) # 高斯模糊
v1 = cv2.Canny(img2,20, 80)  # 边缘检测, 20和80分别为两个阈值
#cv_show(v1)

counts, _ = cv2.findContours(v1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) # 轮廓检测
  
result = img.copy()
color = (0, 255, 0)
for c in counts:
    area = cv2.contourArea(c, True)
    x, y, w, h = cv2.boundingRect(c) # 计算x,y,宽,高
    if x < 50:continue  # 去掉最左边的滑块
    if w < 50:continue  # 去掉太小的轮廓
    if h < 30:continue  # 去掉太小的轮廓
    print(x,y,w,h)
    #print(area)
    #if w > 55 or w < 30 or h > 55 or h < 30:
        #continue
    cv2.rectangle(result, (x, y), (x + w, y + h), color, 1) # 画出矩形框

    
cv_show(result) # 展示最终结果图

这是绘制成果,基本上只需要改一下图片尺寸,一些阈值的大小,就能够得出一般的滑块验证码,太复杂的除外,太复杂的会在后续文章中介绍

Python-Opencv 识别滑块验证码缺口位置(一)_第1张图片

你可能感兴趣的:(opencv,图像处理,opencv,python,计算机视觉)