首页 > 其他分享 >滑块缺口位置识别

滑块缺口位置识别

时间:2023-03-01 09:35:55浏览次数:32  
标签:__ bg 滑块 img max self cv2 缺口 识别

1.基于图片对比计算缺口位置

 

 

 

# -*- coding: utf-8 -*-

from PIL import Image


class SlideCrack(object):
    def __init__(self, gap_img, bg):
        self.gap_img = gap_img
        self.bg = bg

    @staticmethod
    def pixel_is_equal(image1, image2, x, y):
        """
        判断两张图片的像素是否相等,不想等即为缺口位置
        :param image1:
        :param image2:
        :param x:  x坐标
        :param y: y 坐标
        :return:
        """
        # 取两个图片的像素点
        pixel1 = image1.load()[x, y]
        pixel2 = image2.load()[x, y]
        threshold = 60  # 像素色差
        if abs(pixel1[0]-pixel2[0]) < threshold and abs(pixel1[1]-pixel2[1]) < threshold and abs(pixel1[2]-pixel2[2]) <threshold:
            return True
        else:
            return False

    def get_gap(self, image1, image2):
        """
        获取缺口位置
        :param image1:完整图片
        :param image2: 带缺口的图片
        :return:
        """
        left = 60  # 设置一个起始量,因为验证码一般不可能在左边,加快识别速度
        for i in range(left, image1.size[0]):
            for j in range(image1.size[1]):
                if not self.pixel_is_equal(image1, image2, i, j):
                    left = i
                    return left
        return left

    def run(self):
        image1 = Image.open(self.bg)
        image2 = Image.open(self.gap_img)
        # 获取缺口的位置
        gap = self.get_gap(image1, image2)
        print(gap)


if __name__ == "__main__":
    img1 = "img/1_1.png"  # 带缺口的背景图
    img2 = "img/1_2.png"  # 不带缺口的背景图
    gt = SlideCrack(img1, img2)
    gt.run()

2.基于边界对比计算缺口位置

 

 

 

 

 

 

 

# -*- coding: utf-8 -*-

import cv2


class SlideCrack(object):
    def __init__(self, gap, bg, out):
        """
        init code
        :param gap: 缺口图片
        :param bg: 背景图片
        :param out: 输出图片
        """
        self.gap = gap
        self.bg = bg
        self.out = out

    @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)
        # 输出横坐标, 即 滑块在图片上的位置
        print(x)


if __name__ == "__main__":
    # 滑块图片
    image1 = "img/1_1.png"
    # 背景图片
    image2 = "img/1_2.png"

    # 处理结果图片,用红线标注
    image3 = "img/1_3.png"
    sc = SlideCrack(image1, image2, image3)
    sc.discern()

  

 

标签:__,bg,滑块,img,max,self,cv2,缺口,识别
From: https://www.cnblogs.com/yoyo1216/p/17166838.html

相关文章

  • 极验二代滑块验证码
    #-*-coding:utf-8-*-importosimportrandomimportreimportsslimporttimefromurllib.requestimporturlretrieveimportundetected_chromedriverasucf......
  • 自动化测试环境的搭建 及 识别元素的方法
    自动化测试环境的搭建:一、安装selenium:安装方式一:       pipinstall-Uselenium 安装方式二:   手动安装selenium:      ......
  • 华为LAB实验室-书本识别
    各位好,我是乾颐堂大堂子。领取完整实战指南可以私信我,关键词:实战指南0.1-实验简介*图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技......
  • 网页js版音频数字信号处理:H5录音+特定频率信号的特征分析和识别提取
    目录一、网页中的音频数据源二、FFT:时域转频域三、信号的特征分析四、信号的识别提取附录音频数字信号处理AudioDSP(DigitalSignalProcessing)是一个复杂又专业的话......
  • 识别目标机器上服务的指纹
    一、服务指纹为了确保有一个成功的渗透测试或网络设备监控,必须需要知道目标系统中服务的指纹信息。服务指纹信息包括服务端口、服务名和版本等通过分析目标向nmap发送的......
  • 基于 Haar 级联分类器进行人脸识别学习项目
    提前准备Haar级联分类器使用Haar识别人脸数据,Haar来源于Opencv官网:https://opencv.org/releases/。Windows直接下载安装即可,Linux参考其他教程。python......
  • 解决Pycharm不能识别selenium的部分提示代码
    这是解决前,pycharm没有提示相关的webelement的代码,例如:send_keys,click之类的  把鼠标指针放在 selenium 这个单词上就能看到这一串路径  然后找到这个路径......
  • 在Google的TPU上训练Fashion MNIST图像识别模型
    作者|张强今天我们要训练的模型是基于Keras框架,来训练FashionMNIST图像识别模型,该模型和MNIST是一样的分类数量。​​MNIST​​​的分类是0到9的十个数字​​​FashionMN......
  • tf.get_variable()不能识别已存在的变量
    withtf.variable_scope("conv",reuse=True):x=tf.get_variable("w",[1])这个代码不能识别已存在的变量,但是显然现有在打印出变量.name之前创建的,如:conv/w:0当使......
  • 基于BP神经网络的数字识别系统仿真,带GUI界面
    1.算法描述OCR(OpticalCharacterRecognition)即光学字符识别技术,是通过扫描仪把印刷体或手写体文稿扫描成图像,然后识别成相应的计算机可直接处理的字符。OCR是模式识别的一......