python 滑块验证码计算距离三种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"""
 滑块图像距离计算
"""
import random
 
import cv2
import numpy as np
import requests
import ddddocr
 
def distance_cv(slice_url,bg_url):
    """
    :param slice_url: 滑块(缺口)图片地址
    :param bg_url: 背景图地址
    :return: distance
    :rtype:integer
    """
    slice_image = np.asarray(bytearray(requests.get(slice_url).content),dtype=np.uint8)
    slice_image = cv2.imdecode(slice_image,1)
    slice_image = cv2.Canny(slice_image,255,255)
 
    bg_image = np.asarray(bytearray(requests.get(bg_url).content), dtype=np.uint8)
    bg_image = cv2.imdecode(bg_image, 1)
    bg_image = cv2.pyrMeanShiftFiltering(bg_image,5,50)
    bg_image = cv2.Canny(bg_image, 255, 255)
 
    result = cv2.matchTemplate(bg_image,slice_image,cv2.TM_CCOEFF_NORMED)
 
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(result)
    return max_loc[0]
 
def distance_orc(bg_url,slice_url):
    slide = ddddocr.DdddOcr(det=False,ocr=False,show_ad=False)
    slide_image = requests.get(slice_url).content
    bg_image =  requests.get(bg_url).content
    result = slide.slide_match(slide_image, bg_image, simple_target=True)
    # 返回距离
    return result['target'][0]
 
def distance_puzzle(bg_img_path,puzzle_img_path):
    """
    根据背景图和缺口图,计算滑块距离
    :param bg_img_path:
    :param puzzle_img_path:
    :return:
    """
    img = cv2.imdecode(np.fromfile(bg_img_path,dtype=np.uint8),cv2.IMREAD_COLOR)
    tpl = cv2.imdecode(np.fromfile(puzzle_img_path,dtype=np.uint8),cv2.IMREAD_COLOR)
 
    img_gry = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    _,img_bw = cv2.threshold(img_gry,127,255,cv2.THRESH_BINARY)
 
    tpl = cv2.cvtColor(tpl,cv2.COLOR_BGR2GRAY)
    for row in range(tpl.shape[0]):
        for col in range(tpl.shape[1]):
            if tpl[row,col] == 0:
                tpl[row,col] = 96
    lower = np.array([96])
    upper = np.array([96])
    mask = cv2.inRange(tpl,lower,upper)
    tpl[mask == 0] = 0
    tpl[mask != 0] =255
 
    result =cv2.matchTemplate(img_bw,tpl,cv2.TM_CCOEFF_NORMED)
    _,_,_,max_loc = cv2.minMaxLoc(result)
    distance = int(max_loc[0] * 0.5833333333333333) + random.randint(0,2)
    return distance

  

posted @   离岸少年  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!
· DeepSeek-R1本地部署如何选择适合你的版本?看这里

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示