zoukankan      html  css  js  c++  java
  • Python cv2 滑块验证码

    import cv2
     
     
    class SlideCrack(object):
        def __init__(self, gap, bg):
            """
            init code
            :param gap: 缺口图片
            :param bg: 背景图片
            """
            self.gap = gap
            self.bg = bg
     
        @staticmethod
        def clear_white(img):
            # 清除图片的空白区域,这里主要清除滑块的空白
            img = cv2.imread(img)
            rows, cols, channel = img.shape
            min_x = 255
            min_y = 255
            max_x = 0
            max_y = 0
            for x in range(1, rows):
                for y in range(1, cols):
                    t = set(img[x, y])
                    if len(t) >= 2:
                        if x <= min_x:
                            min_x = x
                        elif x >= max_x:
                            max_x = x
     
                        if y <= min_y:
                            min_y = y
                        elif y >= max_y:
                            max_y = y
            img1 = img[min_x:max_x, min_y: max_y]
            return img1
     
        def template_match(self, tpl, target):
            th, tw = tpl.shape[:2]
            result = cv2.matchTemplate(target, tpl, cv2.TM_CCOEFF_NORMED)
            # 寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置
            min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
            tl = max_loc
            br = (tl[0] + tw, tl[1] + th)
            # 绘制矩形边框,将匹配区域标注出来
            # target:目标图像
            # tl:矩形定点
            # br:矩形的宽高
            # (0,0,255):矩形边框颜色
            # 1:矩形边框大小
            cv2.rectangle(target, tl, br, (0, 0, 255), 2)
            # 暂不输出
            # cv2.imwrite(self.out, target)
            return tl[0]
     
        @staticmethod
        def image_edge_detection(img):
            edges = cv2.Canny(img, 100, 200)
            return edges
     
        def discern(self):
            img1 = self.clear_white(self.gap)
            img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
            slide = self.image_edge_detection(img1)
     
            back = cv2.imread(self.bg, 0)
            back = self.image_edge_detection(back)
     
            slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB)
            back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB)
            x = self.template_match(slide_pic, back_pic)
            # 输出横坐标, 即 滑块在图片上的位置
            return x
     
     
    if __name__ == "__main__":
        # 滑块图片
        image1 = "./red_fg.png"
        # 背景图片
        image2 = "./red_bg.jpg"
        sc = SlideCrack(image1, image2)
        a=sc.discern()
        print(a)

    这个主要是针对可以获取到滑块图片和背景图片的情况,如果是客户端,滑块和背景没有分离的情况,由于滑块和背景没办法分离,且滑块图片无法获取,暂时没有好的办法,欢迎大家交流。

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    Java异常的深层次理解
    Java笔记1_java基础
    oracle怎么实现id自增和设置主键
    C51最小系统
    文本输入方式的pspice仿真步骤
    外部中断实验
    客户端测试
    定时器实验
    linklist template
    dfs:10元素取5个元素的组合数
  • 原文地址:https://www.cnblogs.com/zenghansen/p/15004434.html
Copyright © 2011-2022 走看看