吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1155|回复: 6
收起左侧

[求助] python验证码识别问题请教

[复制链接]
Zhili.An 发表于 2022-5-14 21:56
最近在对一个验证滑块进行验证测试,但发现这个测试一直不对。所以请教一下大家;验证块类型如下
3d91d01e98bbf1bc69c98475b10ac4b.jpg
参照网上的滑块代码如下:
[Python] 纯文本查看 复制代码
import cv2
import numpy as np

def caculate_distance():
    otemp = 'captureImg.png' #滑块
    oblk = 'backImg.png' #大图
    # otemp,oblk = oblk,otemp # 这两个路径要是不清楚的话 可以替换一下再尝试
    target = cv2.imread(otemp,0) # 使用灰度图方式加载滑块
    template = cv2.imread(oblk,0) # 使用灰度图方式加载大图
    w, h = target.shape[::-1] #读取滑块的分辨率及宽度与高度
    w1, h1 = template.shape[::-1] #读取大图的分辨率及宽度与高度
    print('w is {},h is {}'.format(w,h))
    print('w1 is {},h1 is {}'.format(w1,h1))
    temp = 'temp.jpg'
    targ = 'targ.jpg'
    cv2.imwrite(temp, template) #第一个是要存图像的文件名,第二个是要保存的图像
    cv2.imwrite(targ, target)
    target = cv2.imread(targ)
    target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY) #颜色空间转换函数(需要转换的图片,格式 将BGR格式转换成灰度图片)
    target = abs(255 - target) #返回数字的绝对值
    cv2.imwrite(targ, target)
    target = cv2.imread(targ)
    template = cv2.imread(temp)
    #matchTemplate输入图像 模板图像 模板匹配方法
    result = cv2.matchTemplate(target, template, cv2.TM_SQDIFF)
    x, y = np.unravel_index(result.argmax(), result.shape)
    #获取一个/组int类型的索引值在一个多维数组中的位置。
    #展示圈出来的区域
    cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 2)
    #画图(图片,长方形框左上角坐标,长方形框右下角坐标,字体颜色,字体粗细)
    print('x is {},y is {}'.format(x, y))
    show(template)
    return x, y

def show(name):
    cv2.imshow('Show', name)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

caculate_distance()


但是 测试下来 结果一直不好;
image.png
image.png
image.png
cv2.matchTemplate(target, template, cv2.TM_SQDIFF)代码中的TM_SQDIFF更改的话,就很无语,改的话,一个验证码行另一个不行。

backImg.png captureImg.png 这个是测试第一组
backImg.png captureImg.png 这个是测试第二组
backImg.png captureImg.png 这个是测试第三组


希望大佬能给个建议或者方法,谢谢





发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Zhili.An 发表于 2022-5-14 21:57
不知道为啥有logo哎
 楼主| Zhili.An 发表于 2022-5-14 22:00
图片文件       链接: https://pan.baidu.com/s/13io-34uxvjxXlPF3c3SoAw?pwd=7t4r 提取码: 7t4r 复制这段内容后打开百度网盘手机App,操作更方便哦
幽溪左畔 发表于 2022-5-14 22:29
 楼主| Zhili.An 发表于 2022-5-15 08:44

已经解决了 但是采用的是形状监测
 楼主| Zhili.An 发表于 2022-5-15 08:45
[Python] 纯文本查看 复制代码
#边缘检测
import cv2
import numpy as np

#定义形状检测函数
def ShapeDetection(img):
    contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)  #寻找轮廓点
    for obj in contours:
        area = cv2.contourArea(obj)  #计算轮廓内区域的面积
        if area>=5:
            cv2.drawContours(imgContour, obj, -1, (255, 0, 0), 4)  #绘制轮廓线
            perimeter = cv2.arcLength(obj,True)  #计算轮廓周长
            approx = cv2.approxPolyDP(obj,0.02*perimeter,True)  #获取轮廓角点坐标
            CornerNum = len(approx)   #轮廓角点的数量
            x, y, w, h = cv2.boundingRect(approx)  #获取坐标值和宽度、高度
            if w>200 and h>200:
                if CornerNum == 4:
                    if w==h:
                        objType= "Square"
                else:objType="N"
                print(str(x)+" "+str(y))
                cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,0,255),2)  #绘制边界框
                cv2.putText(imgContour,objType,(x+(w//2),y+(h//2)),cv2.FONT_HERSHEY_COMPLEX,0.6,(0,0,0),1)  #绘制文字

oblk = 'backImg.png' #大图
template = cv2.imread(oblk) # 使用灰度图方式加载大图
img_1 = cv2.resize(template,(1000,500))
cv2.imwrite('backImg.png', img_1)
path = 'backImg.png'
img = cv2.imread(path)
imgContour = img.copy()

imgGray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)  #转灰度图
imgBlur = cv2.GaussianBlur(imgGray,(5,5),1)  #高斯模糊
imgCanny = cv2.Canny(imgBlur,60,60)  #Canny算子边缘检测
ShapeDetection(imgCanny)  #形状检测


cv2.imshow("shape Detection", imgContour)

cv2.waitKey(0)

deepgo 发表于 2022-5-15 23:28
进来学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 13:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表