提示!本文章仅供学习交流,严禁用于非法用途,文章如有不当可联系本人删除!

前排提示:这是一篇水文

一. 目标网址

aHR0cHM6Ly93d3cuZGluZ3hpYW5nLWluYy5jb20vYnVzaW5lc3MvY2FwdGNoYQ==

二. 长什么样

image-20230911142644981

三. 解析

  • 这里用到的sift算法对两张图片进行相似度对比,代码如下:

    def cover_sift(img1, img2):
        img1 = cv2.cvtColor(np.asarray(img1), cv2.IMREAD_GRAYSCALE)
        img2 = cv2.cvtColor(np.asarray(img2), cv2.IMREAD_GRAYSCALE)
    
        # 创建SIFT对象
        sift = cv2.xfeatures2d.SIFT_create()
    
        # 寻找关键点和特征向量
        kp1, des1 = sift.detectAndCompute(img1, None)
        kp2, des2 = sift.detectAndCompute(img2, None)
    
        # 创建FLANN匹配器对象
        flann = cv2.FlannBasedMatcher({'algorithm': 0, 'trees': 5}, {'checks': 50})
    
        # 使用KNN算法匹配特征向量
        matches = flann.knnMatch(des1, des2, k=2)
    
        # 筛选出最佳匹配
        goodMatches = []
        for m, n in matches:
            if m.distance < 0.7 * n.distance:
                goodMatches.append(m)
    
        # 输出匹配结果
        # print(len(goodMatches))
        return len(goodMatches)
  • 坐标定位部分用到了ddddocr

    ocr = ddddocr.DdddOcr(det=True)
  • 将大图部分抠下来准备和小图作对比

    def cut_big(binary, position):
        _big = dict()
        img = cv2.imdecode(np.array(bytearray(binary), dtype='uint8'), cv2.IMREAD_UNCHANGED)
        for loc in position:
            _img = img[loc[1]:loc[3], loc[0]:loc[2]]
            _img = cv2.resize(_img, (120, 120))
            _big[str(loc)] = _img
        return _big

    这里注意下,大图resize成了和小图一样的尺寸

四. 测试与总结

这里小测一下,正确率一般,综合下来的话7成应该都没有,所以明白为啥开头说是水文了吧,哈哈

image-20230911143649772

我看了下,如果要提高正确率,可以重新自己做下定位模型,sift算法还可以继续沿用。

下载链接

感谢阅读,下次再会~

最后修改:2023 年 11 月 27 日
如果觉得我的文章对你有用,请随意赞赏