[python] Webpage verification code image gap distance calculation method code

import cv2
import numpy as np
import os

#匹配拼图与原图
def show(name):
 cv2.imshow('Show', name)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

def main():
    otemp = 'little_img.png'
    oblk = 'code_img.png'
    target = cv2.imread(otemp, 0)
    template = cv2.imread(oblk, 0)
    w, h = target.shape[::-1]#w是模板的x
    q, j = template.shape[::-1]#q是原图的x
    temp = 'temp.jpg'
    targ = 'targ.jpg'
    cv2.imwrite(temp, template)
    cv2.imwrite(targ, target)
    target = cv2.imread(targ)
    target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)
    target = abs(255 - target)
    cv2.imwrite(targ, target)
    target = cv2.imread(targ)
    template = cv2.imread(temp)
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)
    x, y = np.unravel_index(result.argmax(), result.shape)
    # 展示圈出来的区域
    cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 2)
    #show(template)
    os.remove('temp.jpg')
    os.remove('targ.jpg')
    return y*(278)//(q) #返回滑块应该偏移的距离

if __name__ == '__main__':
    print(main())

The second seems to be more accurate

# coding=utf-8
import cv2
import numpy as np
from PIL import Image

def get_element_slide_distance():
    otemp = 'code_img.png'
    oblk = 'little_img.png'
    target = cv2.imread(otemp, 0)  # 读取进行色度图片,转换为numpy中的数组类型数据
    template = cv2.imread(oblk, 0)
    width, height = target.shape[::-1]  # 获取缺口图数组的形状 -->缺口图的宽和高
    temp = 'temp.jpg'  # 将处理之后的图片另存
    targ = 'targ.jpg'
    cv2.imwrite(temp, template)
    cv2.imwrite(targ, target)
    target = cv2.imread(targ)  # 读取另存的滑块图
    target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)  # 进行色彩转换
    # 去除白色部分 获取滑块正常大小
    target = target[target.any(1)]

    target = abs(255 - target)  # 获取色差的绝对值
    cv2.imwrite(targ, target)  # 保存图片
    target = cv2.imread(targ)  # 读取滑块
    template = cv2.imread(temp)  # 读取背景图
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)  # 比较两张图的重叠区域
    top, left = np.unravel_index(result.argmax(), result.shape)  # 获取图片的缺口位置
    # 缺口位置
    print((left, top, left + width, top + height))  # 背景图中的图片缺口坐标位置

    # 调用PIL Image 做测试
    image = Image.open("code_img.png")
    rectangle = (left + 3, top + 3, left + width - 3, top + height - 3)  # 去掉白色块的影响(上面去掉白色部分的功能并没有真的起作用)
    # 切割
    imagecrop = image.crop(rectangle)
    # 保存切割的缺口
    imagecrop.save("new_image.png")
    return left*280//width# 滑动距离误差校正,返回一个正确的滑动距离

if __name__ == "__main__":
    distance = get_element_slide_distance()

The third kind seems pretty accurate

import cv2

def identify_gap():
    '''
    bg: 背景图片
    tp: 缺口图片
    out:输出图片
    '''
    # 读取背景图片和缺口图片
    bg = "./code_img.png"
    tp = "./little_img.png"
    #out = "output.png"
    bg_img = cv2.imread(bg, 0)  # 背景图片
    tp_img = cv2.imread(tp, 0)  # 缺口图片
    height, long = bg_img.shape[::-1]
    print(height)
    # 识别图片边缘
    bg_edge = cv2.Canny(bg_img, 100, 200)
    tp_edge = cv2.Canny(tp_img, 100, 200)

    # 转换图片格式
    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)

    # 缺口匹配
    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配

    # 绘制方框
    th, tw = tp_pic.shape[:2]
    tl = max_loc  # 左上角点的坐标
    br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标
    #cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形
    #cv2.imwrite(out, bg_img)  # 保存在本地
    #print(tl[0])
    # 返回缺口的X坐标
    return tl[0] * 280 / height

Guess you like

Origin blog.csdn.net/Sgmple/article/details/112279036