爬蟲滑塊計算圖片之間的距離更加精確


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

#移動前獲取滑塊那部分頁面上的圖片用selenium截圖的形式
driver.find_elements_by_xpath('//*[@class="yidun_bg-img"]')[1].screenshot('0.png')
bg_act = cv.imread('0.png')
bg_act_height, bg_act_width = bg_act.shape[0],bg_act.shape[1]
bg = cv.imread('bg_img.png')
bg_height, bg_width = bg.shape[0],bg.shape[1]
block = cv.imread('img.png', -1)
scale = bg_act_height * 1.0 / bg_height
scale1 = bg_act_width * 1.0 / bg_width
block_act = cv.resize(block, (0,0), fx = scale, fy=scale)

print('scale: ', scale, scale1)
x1,x2 =get_image_deviation(bg, block)
x1 = int(x1*scale)
print("x1x2=", x1, x2)


#部分代碼
ActionChains(滑塊元素).move_by_offset(xoffset= 移動上面生成的距離, yoffset=0).perform()

#第一次移動后二次識別部分代碼

driver.find_elements_by_xpath('//*[@class="yidun_bg-img"]')[1].screenshot('bg1.png')
bg_act1 = cv.imread('bg1.png')
x3,x4=get_image_deviation(bg_act1, block_act)


print("x3x4=", x3, x4)
time.sleep(5)
ActionChains(driver).move_by_offset(xoffset= x1-x3, yoffset=0).perform()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM