weixin_46132012 2024-11-05 17:26 采纳率: 50%
浏览 38
已结题

python验证码滑块图像识别

我在用win11,python 3.10,写一个滑块验证码的自动化程序。我需要一个opencv的函数,能准确的计算,在这同一张图片上,滑块形状和缺口形状的坐标位置及两个形状之间在X轴上的距离。
请不要JS逆向的解决方案。直接上opencv的识别函数代码,悬赏给能最先出正确结果的。后面的朋友,如果有更优化的代码,我会额外给打赏(请注意,没有单独的滑块图片,而是滑块和缺口都在同一张图片上,没有分开)
补充:并不存在滑块和背景两张图,滑块和缺口都在一张图上。不能用额外的滑块图片匹配,而是要在一张图上,找出两个形状一样的图,并计算坐标距离
附,验证码图片样式。

img

img

  • 写回答

23条回答 默认 最新

  • 凌霜残雪 2024-11-06 08:02
    关注

    具体来说,我们需要从一张图片中找到滑块形状和缺口形状的坐标位置,并计算它们之间的X轴距离。

    以下是一个完整的Python脚本示例,使用OpenCV来实现这一功能:

    import cv2
    import numpy as np
    
    def find_slider_and_gap(image_path):
        # 读取图片
        image = cv2.imread(image_path)
        if image is None:
            raise ValueError("Image not found or unable to read")
    
        # 转换为灰度图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
        # 使用高斯模糊减少噪声
        blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    
        # 使用Canny边缘检测
        edges = cv2.Canny(blurred, 50, 150)
    
        # 使用轮廓检测找到滑块和缺口
        contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
        # 找到最大的两个轮廓(假设滑块和缺口是最明显的两个轮廓)
        contours = sorted(contours, key=cv2.contourArea, reverse=True)[:2]
    
        if len(contours) < 2:
            raise ValueError("Not enough contours found")
    
        # 计算轮廓的边界框
        slider_box = cv2.boundingRect(contours[0])
        gap_box = cv2.boundingRect(contours[1])
    
        # 计算滑块和缺口的中心点
        slider_center = (slider_box[0] + slider_box[2] // 2, slider_box[1] + slider_box[3] // 2)
        gap_center = (gap_box[0] + gap_box[2] // 2, gap_box[1] + gap_box[3] // 2)
    
        # 计算滑块和缺口在X轴上的距离
        distance_x = abs(slider_center[0] - gap_center[0])
    
        # 绘制边界框和中心点
        cv2.rectangle(image, slider_box, (0, 255, 0), 2)
        cv2.rectangle(image, gap_box, (0, 0, 255), 2)
        cv2.circle(image, slider_center, 5, (0, 255, 0), -1)
        cv2.circle(image, gap_center, 5, (0, 0, 255), -1)
    
        # 显示结果图像
        cv2.imshow('Result', image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
        return slider_center, gap_center, distance_x
    
    # 示例使用
    image_path = 'path_to_your_image.png'
    slider_center, gap_center, distance_x = find_slider_and_gap(image_path)
    print(f"滑块中心坐标: {slider_center}")
    print(f"缺口中心坐标: {gap_center}")
    print(f"滑块和缺口在X轴上的距离: {distance_x}")
    
    

    解释
    1、读取图片:使用 cv2.imread 读取图片。
    2、灰度转换:将图片转换为灰度图像,便于后续处理。
    3、高斯模糊:使用高斯模糊减少噪声,提高边缘检测的准确性。
    4、Canny边缘检测:使用Canny算法检测图像中的边缘。
    5、轮廓检测:使用 cv2.findContours 找到图像中的轮廓。
    6、排序轮廓:按轮廓面积从大到小排序,假设滑块和缺口是最明显的两个轮廓。
    7、计算边界框:使用 cv2.boundingRect 计算轮廓的边界框。
    8、计算中心点:计算滑块和缺口的中心点。
    9、计算X轴距离:计算滑块和缺口在X轴上的距离。
    10、绘制结果:在原图上绘制边界框和中心点,并显示结果图像。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(22条)

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 修改了问题 11月5日
  • 修改了问题 11月5日
  • 展开全部

悬赏问题

  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥20 小规模孤立词识别系统设计
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端
  • ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么
  • ¥15 基于51单片机的交通灯系统,找改程序有点急