作者:码王吴彦祖

某RED书旋转验证码识别(二)

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路
本文的验证码网址如下,使用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行,注意,为了隐私和安全,这里不会放出全部代码,如果需要,找我本人联系获取,本文只提供大致思想,聪明的小伙伴可以自己去改写,条条大路通罗马。
在这里插入图片描述