opencv-python简单使用--识别滑动验证码缺口

bg.jpg

tb.png

结果.png

以上是需要是别的图片缺口,来自某东登录。
opencv是计算机视觉。

一、cv函数

1、imread:读取图片
imread(image_path, flag):
    images_path:图片路径,找不到不报错
   flag:
    1/cv2.IMREAD_COLOR:彩色图片,图片透明性会被忽略,默认参数
    0/cv2.IMREAD_GRAYSCALE:灰色图片
    -1/cv2.IMREAD_UNCHANGED:包括其alpha通道
2、imwrite
imwrite(img_path_name,img)
   img_path_name:保存的文件名
  img:文件对象
3、cvtColor
  cvtColor(img,code)
img: 图像对象
   code
    cv2.COLOR_RGB2GRAY: RGB转换到灰度模式
   cv2.COLOR_RGB2HSV: RGB转换到HSV模式(hue,saturation,Value)
4、matchTemplate
matchTemplate(img_path, bg_path, cv2.TM_CCOEFF_NORMED)
  img_path:对比图片
  bg_path:背景图片
  cv2.TM_CCOEFF_NORMED

以下源码

# encoding=utf8

import cv2
import numpy as np
def show(name):
    cv2.imshow('Show', name)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def main():
    otemp = './images/tb.png'
    oblk = './images/bg.jpg'
    target = cv2.imread(otemp, 0)
    template = cv2.imread(oblk, 0) # 读取到两个图片,进行灰值化处理
    w, h = target.shape[::-1]
    print(w, h)
    temp = './images/temp.jpg'
    targ = './images/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) # 通过np转化为数值,就是坐标
    # 展示圈出来的区域
    cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 2)
    show(template)
    return y, x

if __name__ == '__main__':
    main()

优化代码

import cv2
import numpy as np


def from_file_get_distanct(hx, bg):
    '''
    根据文件进行识别
    :param hx: 滑块图片的文件路径
    :param bg: 背景图片的文件路径
    :return:
    '''
    target = cv2.imread(hx)
    template = cv2.imread(bg, 0)  # 读取到两个图片,进行灰值化处理
    target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)  # 转化到灰度
    target = abs(255 - target)  # 返回绝对值
    target = cv2.cvtColor(target, cv2.COLOR_GRAY2RGB)  # 单通道转3通道
    template = cv2.cvtColor(template, cv2.COLOR_GRAY2RGB)
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)  # 进行匹配
    x, y = np.unravel_index(result.argmax(), result.shape)  # 通过np转化为数值,就是坐标
    return y, x


def from_buffer_get_distanct(hx, bg):
    '''
    根据二进制进行识别
    :param hx: 滑块图片的二进制
    :param bg: 背景图片的二进制
    :return:
    '''
    target = cv2.imdecode(np.frombuffer(hx, np.uint8), cv2.IMREAD_COLOR)
    template = cv2.imdecode(np.frombuffer(bg, np.uint8), cv2.IMREAD_COLOR) if type(bg) == bytes else cv2.cvtColor(
        np.asarray(bg), cv2.COLOR_RGB2BGR)  # 如果是PIL.images就换读取方式
    target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)  # 转化到灰度
    target = abs(255 - target)  # 返回绝对值
    target = cv2.cvtColor(target, cv2.COLOR_GRAY2RGB)  # 单通道转3通道
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)  # 进行匹配
    x, y = np.unravel_index(result.argmax(), result.shape)  # 通过np转化为数值,就是坐标
    return y, x

你可能感兴趣的:(opencv-python简单使用--识别滑动验证码缺口)