注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路
本文的验证码网址如下,使用base64解码获得
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站
本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr
接上篇,使用了图像处理的方式处理小红书的旋转验证码之后,在其计算梯度之后仍然达不到想要的结果,本篇继续采用图像处理的方式去计算角度,采用特征点和图像直方图匹配的方式找到旋转角度,该方法成功率达95%,来看一下通过这种方法,得到后的结果图如下
可以看到,无论是古风图片还是卡通图,基本上都能找到正确角度,该方法不采用模型训练的方式,模型训练目前市面上大致都是360角度分类训练,该方法计算复杂度大,模型精度低,因为所有图像角度在细分成360度分类后,其模型很难泛化,本文方法其实不适用模型,其运行速度在高也能控制在几百毫秒以内,该速度取决于算法精度,使用计算的图像算法越复杂,图像精度越高,运行时间越长,从下图中可以看出,最长也能控制在大约300-400毫秒以内
下面来看具体步骤
核心直方图计算方法
img = cv2.imread(os.path.join("newangle", im))
tong = 512
# 使用更小的桶数
hist_size = [tong,tong,tong] # 每个维度 32 个桶
hist_range = [0, 256, 0, 256, 0, 256]
hist = cv2.calcHist([img], [0, 1, 2], None, hist_size, hist_range)
# 归一化直方图
hist = cv2.normalize(hist, hist).flatten()
allangleimg[im] = [img, hist]
核心角度计算方法
# 检测特征点和描述符
kp1, des1 = sift.detectAndCompute(que_result_yuan, None)
kp2, des2 = sift.detectAndCompute(trueangleimg, None)
# 使用KNN匹配器来匹配特征点
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
matches = bf.match(des1, des2)
# 提取匹配的点
src_pts = np.float32([kp1[m.queryIdx].pt for m in matches])
dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches])
这里放了大致的部分,将代码组装后,所有代码不到100行,注意,为了隐私和安全,这里不会放出全部代码,如果需要,找我本人联系获取,本文只提供大致思想,聪明的小伙伴可以自己去改写,条条大路通罗马。