以上是需要是别的图片缺口,来自某东登录。
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