我们可以借用opencv来解决这个问题,主要步骤:
- 读取图片
- 高斯模糊处理
- Canny边缘检测
- 轮廓检测
- 获取位置
opencv 是什么?
OpenCV(Open Source Computer Vision Library)是开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法,可用于开发实时的图像处理、计算机视觉以及模式识别程序。
安装
pip install opencv-python
代码
import cv2 as cv
image_path = 'captcha01.jpg'
image = cv.imread(image_path)
cv.imshow("image", image)
# 高斯模糊
blurred = cv.GaussianBlur(image, (5, 5), 0)
cv.imshow("blurred", blurred)
# 边缘检测
canny = cv.Canny(blurred, 200, 400)
cv.imshow("canny", canny)
# 轮廓识别
def contour_discern_all():
contours, hierarchy = cv.findContours(canny, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
for contour in contours: # 所有轮廓
x, y, w, h = cv.boundingRect(contour)
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.imshow('contour_all', image)
# 添加限制
def contour_discern():
contours, hierarchy = cv.findContours(canny, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
for contour in contours: # 所有轮廓
print('轮廓面积:', cv.contourArea(contour), '轮廓周长:', cv.arcLength(contour, True))
# 对周长和面积添加限制(以下数值仅作用于当前案例)
if 35 > cv.contourArea(contour) > 20 and 470 > cv.arcLength(contour, True) > 460:
x, y, w, h = cv.boundingRect(contour)
print(x, y, w, h) # 坐标和大小
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.imshow('contour', image)
contour_discern()
contour_discern_all()
cv.waitKey()
cv.destroyAllWindows()
效果图
如上就找到了目标位置,剩下的工作可以使用selenium或其他工具,将滑块移动到指定位置即可。