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