1.思路 原先圖片匹配一般都是缺口匹配全圖 優化點: 1.缺口圖片匹配缺口所在圖片那一行圖片可以提高他識別率 2.移動後再進行2次匹配計算距離 2.代碼 def get_image_deviation(): ##讀取滑塊圖 block = cv.imread("img.png", -1) #完整圖片 ...
1.思路
原先圖片匹配一般都是缺口匹配全圖
優化點:
1.缺口圖片匹配缺口所在圖片那一行圖片可以提高他識別率
2.移動後再進行2次匹配計算距離
2.代碼
def get_image_deviation():
##讀取滑塊圖
block = cv.imread("img.png", -1) #完整圖片有個缺口
backimg = cv.imread("bg_img.png") #缺口圖片
# block = cv.resize(block, (240, 480))
# backimg = cv.resize(block, (240, 480))
##灰度化
gray_backimg = cv.cvtColor(backimg, cv.COLOR_RGB2GRAY)
blockWidth, blockHeight = block.shape[1], block.shape[0]
##識別滑塊圖前景
###由於滑塊圖為帶透明的png,可根據透明通道來判斷前景位置
##識別物體框,生成blockmask
left = blockWidth
right = 0
top = blockHeight
bottom = 0
for i in range(0, blockHeight):
for j in range(0, blockWidth):
if block[i, j, 3] > 0:
if j <= left:
left = j
if j >= right:
right = j
if i <= top:
top = i
if i >= bottom:
bottom = i
blockBox = block[top:bottom, left:right]
blockBox_width, blockBox_height = blockBox.shape[1], blockBox.shape[0]
print(blockBox_width)
blockMask = np.zeros([blockBox_height, blockBox_width], np.uint8)
for i in range(0, blockBox_height):
for j in range(0, blockBox_width):
if blockBox[i, j, 3] > 0:
blockMask[i, j] = 255
blockBox = cv.cvtColor(blockBox, cv.COLOR_RGBA2GRAY)
##由於邊界點存在光照影響,為了避免邊界點對匹配的影響,進行腐蝕操作
kernel = np.ones((3, 3), np.uint8)
blockMask = cv.erode(blockMask, kernel, iterations=1).astype(np.float32)
backgroundROI = gray_backimg[top:bottom, :]
##將backgroundROI、blockBox都轉化成float型
blockBox = (blockBox * 1.0).astype(np.float32)
backgroundROI = (backgroundROI * 1.0).astype(np.float32)
##使用cv的
res = cv.matchTemplate(backgroundROI, blockBox, cv.TM_CCORR_NORMED, mask=blockMask)
loc = cv.minMaxLoc(res)
print("loc==", loc[3][0])
locs = (loc[3][0])
return locs