我在用win11,python 3.10,写一个滑块验证码的自动化程序。我需要一个opencv的函数,能准确的计算,在这同一张图片上,滑块形状和缺口形状的坐标位置及两个形状之间在X轴上的距离。
请不要JS逆向的解决方案。直接上opencv的识别函数代码,悬赏给能最先出正确结果的。后面的朋友,如果有更优化的代码,我会额外给打赏(请注意,没有单独的滑块图片,而是滑块和缺口都在同一张图片上,没有分开)
补充:并不存在滑块和背景两张图,滑块和缺口都在一张图上。不能用额外的滑块图片匹配,而是要在一张图上,找出两个形状一样的图,并计算坐标距离
附,验证码图片样式。
python验证码滑块图像识别
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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、绘制结果:在原图上绘制边界框和中心点,并显示结果图像。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥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单片机的交通灯系统,找改程序有点急