• 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)

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

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    Jquery中的this指向的是哪个对象?
    需要重新编辑
    关于CSS选择器优先级无冲突样式设置的展示
    在 CSS 中,width 和 height 指的是内容区域的宽度和高度
    关于正则表达式中分组的一些误解勘正以及String的replaceAll方法误解勘正
    关于informatica的Dynamic Lookup组件使用中遇到的一个问题的思考
    【转】Informatica Update 机制详解
    维度表和事实表的含义
    今天看IO流,复制word遇到的一个小问题
    小试下新博客,一个列传行的SQL
  • 原文地址:https://www.cnblogs.com/zenghansen/p/15004434.html
Copyright © 2020-2023  润新知