问答 这种带波浪线的图片验证码要怎么识别比较准确呢?

离是伞中仙 · 2024年08月16日 · 最后由 小黑子-祖国人 回复于 2024年08月20日 · 7978 次阅读

下面是 gpt 的一种方法,但是有些是准确的,要是波浪线和数字交叠的时候就会识别出错

import cv2
import numpy as np
import base64
from io import BytesIO
from PIL import Image
import pytesseract

def get_num_for_image(image_url):
# Base64 数据示例
data_url = image_url

# 提取 Base64 数据部分
base64_data = data_url.split(',')[1]

# 解码 Base64 数据
img_data = base64.b64decode(base64_data)

# 将解码后的数据转换为图像
img = Image.open(BytesIO(img_data))
img = np.array(img)

# 转换为 OpenCV 格式(从 RGB 转为 BGR)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

# 图像预处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.medianBlur(gray, 3)
_, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 曲线干扰处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
morph = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

# 轮廓检测和字符分割
contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# OCR 识别
text = pytesseract.image_to_string(morph, config='--psm 8')
print("识别验证码为:", text)
return text

共收到 14 条回复 时间 点赞

好像之前那个问题,评论区回答:不要硬刚😂

MT 回复

😂 我看到过那个问题

CmYzzZ 回复

因为这个图片是 data:的可能还要处理下,我下周回来试试。

我之前和开发沟通过,开发说不可以😔 让我去拉接口 token,但是这个过期了就要重新拉感觉有点麻烦。

验证码就是为了防止机器的,当你能准确的用机器识别,就证明他是不可靠的

思路打开,写一个定时任务定期去触发接口拉取 token,比如 token 有效期是 30 分钟,你就 30 分钟触发一次呗,这个应该也不会频繁过期

有时候,挺不理解为啥老是有人搞这玩意,我跳过不行么,非要纠结这么一个几乎没啥价值的大坑

就是开发嫌麻烦罢了

沫沫sir 回复

这个要先登录才有 token,开发意思是手动登录然后去抓接口 token

我认同你说的,毕竟我一开始的解决方法和你说的一样,只是无果才自己识别的

那祝你好运了
如果识别准确了,也没必要用到自动化测试这种小儿科场景,应该去搞抢购的脚本

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册