欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

微信跳一跳python輔助軟件思路及圖像識(shí)別源碼解析

 更新時(shí)間:2018年01月04日 15:03:43   作者:cvMat_  
這篇文章主要介紹了微信跳一跳python輔助軟件思路及圖像識(shí)別源碼解析,需要的朋友可以參考下

本文將梳理github上最火的wechat_jump_game的實(shí)現(xiàn)思路,并解析其圖像處理部分源碼

首先廢話少說(shuō)先看效果

核心思想

獲取棋子到下一個(gè)方塊的中心點(diǎn)的距離
計(jì)算觸摸屏幕的時(shí)間
點(diǎn)擊屏幕

重要方法

計(jì)算棋子到下一個(gè)方塊中心點(diǎn)的距離

  • 使用 adb shell screencap -p 命令獲取手機(jī)當(dāng)前屏幕畫(huà)面
  • 再通過(guò)圖像上的信息找出棋子的坐標(biāo)和下一個(gè)方塊中心點(diǎn)的坐標(biāo)
  • 然后通過(guò)兩點(diǎn)間距離公式計(jì)算出距離

計(jì)算觸摸屏幕的時(shí)間

T=A * S

其中S為上步算出的像素距離,T為按壓時(shí)間(ms),A為一個(gè)系數(shù)這個(gè)系數(shù)會(huì)隨著屏幕分辨率的變化而變化,在1920*1080的屏幕下這個(gè)系數(shù)為1.35,在2560*1440的屏幕下這個(gè)系數(shù)為1.475

點(diǎn)擊屏幕

adb shell input swipe x y x y time(ms)

這條命令能夠點(diǎn)擊手機(jī)屏幕x,y位置time(ms)

圖像處理部分源碼解析

圖像處理部分代碼都在 find_piece_and_board(im) 方法中

通過(guò)輸入的圖像im計(jì)算出棋子的坐標(biāo)點(diǎn)以及下一個(gè)方塊中心的坐標(biāo)點(diǎn)

在find_piece_and_board的方法中一進(jìn)來(lái)就是下面的兩個(gè)嵌套在一起的for循環(huán):

 for i in range(int(h / 3), int(h * 2 / 3), 50):
    last_pixel = im_pixel[0, i]
    for j in range(1, w):
      pixel = im_pixel[j, i]
      # 不是純色的線,則記錄 scan_start_y 的值,準(zhǔn)備跳出循環(huán)
      if pixel[0] != last_pixel[0] or pixel[1] != last_pixel[1] or pixel[2] != last_pixel[2]:
        scan_start_y = i - 50
        break
    if scan_start_y:
      break

這段代碼的作用就是從屏幕2/3的位置向下尋找不是純色的線。并將找到位置的縱坐標(biāo)-50作為,尋找棋子和方塊的起始坐標(biāo)。這樣可以簡(jiǎn)化以后搜索的工作量,因?yàn)樵谶@個(gè)橫坐標(biāo)以上是沒(méi)有東西的。

接下來(lái)是查找棋子坐標(biāo)的代碼

# 查找棋子坐標(biāo)
  # piece_x_sum 橫坐標(biāo)總量 piece_x_c 點(diǎn)的個(gè)數(shù) piece_y_max 縱坐標(biāo)最大值
  # 從 scan_start_y 開(kāi)始往下掃描,棋子應(yīng)位于屏幕上半部分,這里暫定不超過(guò) 2/3
  for i in range(scan_start_y, int(h * 2 / 3)):
    for j in range(scan_x_border, w - scan_x_border): # 橫坐標(biāo)方面也減少了一部分掃描開(kāi)銷(xiāo)
      pixel = im_pixel[j, i]
      # 根據(jù)棋子的最低行的顏色判斷,找最后一行那些點(diǎn)的平均值,這個(gè)顏色這樣應(yīng)該 OK,暫時(shí)不提出來(lái)
      if (50 < pixel[0] < 60) and (53 < pixel[1] < 63) and (95 < pixel[2] < 110):
        piece_x_sum += j
        piece_x_c += 1
        piece_y_max = max(i, piece_y_max)

  if not all((piece_x_sum, piece_x_c)):
    return 0, 0, 0, 0
  # 平均橫坐標(biāo)
  piece_x = int(piece_x_sum / piece_x_c)
  # 縱坐標(biāo)最大值-底座一半的高度
  piece_y = piece_y_max - piece_base_height_1_2 # 上移棋子底盤(pán)高度的一半

查找棋子的重要依據(jù)就是棋子的顏色較為單一并且和方塊的顏色有較大差距。如果一個(gè)像素點(diǎn)的RGB像素值在B(50, 60), G(53, 63), R(95, 110)范圍內(nèi)那么就認(rèn)為這個(gè)像素點(diǎn)是屬于棋子的。根據(jù)以上信息就能計(jì)算出棋子的平均橫坐標(biāo),以及最大的縱坐標(biāo)值。

所以不難計(jì)算出棋子坐標(biāo)(棋子平均橫坐標(biāo), 棋子最大縱坐標(biāo) - 底座一半的高度)其中底座一半的高度因手機(jī)分辨率而異。需要提前配置好。

最后是查找下一個(gè)方塊中心點(diǎn)的坐標(biāo)的代碼

# 尋找最高的棋盤(pán)
  # 棋盤(pán)不會(huì)和棋子在同一側(cè)
  # 限制棋盤(pán)掃描的橫坐標(biāo),避免音符 bug
  if piece_x < w / 2:
    board_x_start = piece_x
    board_x_end = w
  else:
    board_x_start = 0
    board_x_end = piece_x
  for i in range(int(h / 3), int(h * 2 / 3)):
    last_pixel = im_pixel[0, i]
    if board_x or board_y:
      break
    board_x_sum = 0
    board_x_c = 0
    for j in range(int(board_x_start), int(board_x_end)):
      pixel = im_pixel[j, i]
      # 下一個(gè)棋盤(pán)緊貼著棋子
      # 修掉腦袋比下一個(gè)小格子還高的情況的 bug
      if abs(j - piece_x) < piece_body_width:
        continue
      # 修掉圓頂?shù)臅r(shí)候一條線導(dǎo)致的小 bug,這個(gè)顏色判斷應(yīng)該 OK,暫時(shí)不提出來(lái)
      if abs(pixel[0] - last_pixel[0]) + abs(pixel[1] - last_pixel[1]) + abs(pixel[2] - last_pixel[2]) > 10:
        board_x_sum += j
        board_x_c += 1
    if board_x_sum:
      # 最高棋盤(pán)的平均橫坐標(biāo)
      board_x = board_x_sum / board_x_c
  last_pixel = im_pixel[board_x, i]

代碼開(kāi)頭通過(guò)棋子所在的屏幕位置限制搜索的寬度,如果棋子在屏幕左邊那么就在屏幕右邊搜索方塊,反之亦然。因?yàn)榉綁K和棋子不會(huì)在屏幕同一側(cè)。

然后就是自上而下得搜索方塊的上頂點(diǎn)。

方塊上頂點(diǎn)坐標(biāo)( 平均橫坐標(biāo),當(dāng)前行的縱坐標(biāo))

然后再往下縱坐標(biāo)+247的位置開(kāi)始向上找顏色與上頂點(diǎn)一樣的點(diǎn),為下頂點(diǎn)。
當(dāng)然此方法有一點(diǎn)局限性對(duì)于純色的平面效果很好但是對(duì)于非純色的平面??赡軙?huì)判斷出錯(cuò)。

如果上一跳命中中間,則下個(gè)目標(biāo)中心會(huì)出現(xiàn) r245 g245 b245 的點(diǎn),利用這個(gè)屬性彌補(bǔ)上一段代碼可能存在的判斷錯(cuò)誤
若上一跳由于某種原因沒(méi)有跳到正中間,而下一跳恰好有無(wú)法正確識(shí)別花紋,則有可能游戲失敗,由于花紋面積通常比較大,失敗概率較低

可改進(jìn)方案

首先是目前方案對(duì)于多分辨率需要多個(gè)配置文件來(lái)記錄不同分辨率下的系數(shù)以及棋子底盤(pán)一半的高度。隨機(jī)測(cè)試了6臺(tái)手機(jī)其中有兩臺(tái)手機(jī)因沒(méi)有配飾而無(wú)法正常運(yùn)作

首先是系數(shù)A,觀察方程T=A * S,A就是一個(gè)可訓(xùn)練量,利用機(jī)器學(xué)習(xí)框架比如TensorFlow,對(duì)這個(gè)一元一次方程進(jìn)行擬合。

觀察棋子底盤(pán)一半的高度在代碼中的作用。不難發(fā)現(xiàn)是為了求出棋子底盤(pán)中心的縱坐標(biāo)。而棋子底盤(pán)中心的位置恰恰是棋子最寬的地方。所以可以通過(guò)找出棋子最寬處的縱坐標(biāo)的方式找到棋子底盤(pán)中心的縱坐標(biāo)。這樣就擺脫了對(duì)配置文件的依賴,能讓代碼在任何手機(jī)上正常運(yùn)行。

其次是對(duì)于方塊中心坐標(biāo)位置的判斷方法出錯(cuò)率較高,雖然有中心白點(diǎn)可以彌補(bǔ)但是在大量跳躍的過(guò)程中還是會(huì)出現(xiàn)錯(cuò)誤。3太手機(jī)不停運(yùn)行了一下午,最高分只有2009分。

現(xiàn)方法出錯(cuò)率高的原因是使用純顏色方法判斷,但是在實(shí)際游戲中顏色豐富的方塊也不少。如果想改變就不能依賴顏色方法判斷,而應(yīng)該通過(guò)幾何圖像的形狀來(lái)計(jì)算方塊的位置。不難發(fā)現(xiàn)游戲中方塊只有棱形和圓形兩種形狀。

首先通過(guò)canny或其他輪廓查找算子提取出圖像的輪廓,然后通過(guò)霍夫變換提取出圓形和棱形的中心坐標(biāo)。

總結(jié)

以上所述是小編給大家介紹的微信跳一跳python輔助軟件思路及圖像識(shí)別源碼解析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 什么是python的列表推導(dǎo)式

    什么是python的列表推導(dǎo)式

    在本篇文章里小編給大家分享了關(guān)于python列表推導(dǎo)式的含義及用法,需要的朋友們可以參考下。
    2020-05-05
  • Django admin 實(shí)現(xiàn)search_fields精確查詢實(shí)例

    Django admin 實(shí)現(xiàn)search_fields精確查詢實(shí)例

    這篇文章主要介紹了Django admin 實(shí)現(xiàn)search_fields精確查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python字符串對(duì)齊、刪除字符串不需要的內(nèi)容以及格式化打印字符

    Python字符串對(duì)齊、刪除字符串不需要的內(nèi)容以及格式化打印字符

    這篇文章主要給大家介紹了關(guān)于Python字符串對(duì)齊、刪除字符串不需要的內(nèi)容以及格式化打印字符的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python3實(shí)現(xiàn)二叉樹(shù)的最大深度

    Python3實(shí)現(xiàn)二叉樹(shù)的最大深度

    這篇文章主要介紹了Python3實(shí)現(xiàn)二叉樹(shù)的最大深度, 文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python pygame實(shí)現(xiàn)方向鍵控制小球

    python pygame實(shí)現(xiàn)方向鍵控制小球

    這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)方向鍵控制小球,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python中的HTTP請(qǐng)求庫(kù)Requests的具體使用

    Python中的HTTP請(qǐng)求庫(kù)Requests的具體使用

    Python作為一種功能強(qiáng)大且易于學(xué)習(xí)的編程語(yǔ)言,提供了許多用于處理HTTP請(qǐng)求的庫(kù),其中,Requests庫(kù)是最受歡迎的選擇之一,本文主要介紹了Python中的HTTP請(qǐng)求庫(kù)Requests的具體使用,感興趣的可以了解一下
    2023-12-12
  • Python中讀取文件名中的數(shù)字的實(shí)例詳解

    Python中讀取文件名中的數(shù)字的實(shí)例詳解

    在本篇文章里小編給大家整理了一篇關(guān)于Python中讀取文件名中的數(shù)字的實(shí)例詳解內(nèi)容,有興趣的朋友們可以參考下。
    2020-12-12
  • Python如何調(diào)用JS文件中的函數(shù)

    Python如何調(diào)用JS文件中的函數(shù)

    這篇文章主要介紹了Python如何調(diào)用JS文件中的函數(shù)的相關(guān)知識(shí)點(diǎn)總結(jié),有興趣的朋友們跟著學(xué)習(xí)下。
    2019-08-08
  • python實(shí)現(xiàn)百度語(yǔ)音識(shí)別api

    python實(shí)現(xiàn)百度語(yǔ)音識(shí)別api

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)百度語(yǔ)音識(shí)別api,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python中hasattr()、getattr()、setattr()函數(shù)的使用

    python中hasattr()、getattr()、setattr()函數(shù)的使用

    這篇文章主要介紹了python中hasattr()、getattr()、setattr()函數(shù)的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論