airtest源碼分析--圖像識別整體流程

從一個touch方法說起

這個分析我們從IDE的touch方法說起柒桑,拷貝IDE的腳本到pycharm里面伏钠,逐行跟蹤這個touch方法是怎樣執(zhí)行的

# -*- encoding=utf8 -*-
__author__ = "cloudhuan"

from airtest.core.api import *

auto_setup(__file__)

touch(Template(r"tpl1591349971573.png", record_pos=(0.116, -0.266), resolution=(1080, 2340)))

touch方法定義在core/api里面,提供通用的核心api定義

@logwrap
def touch(v, times=1, **kwargs):
    """
    Perform the touch action on the device screen

    :param v: target to touch, either a Template instance or absolute coordinates (x, y)
    :param times: how many touches to be performed
    :param kwargs: platform specific `kwargs`, please refer to corresponding docs
    :return: finial position to be clicked
    :platforms: Android, Windows, iOS
    """
    print(">>>>>>>from local source!!!<<<<<<<<<");
    if isinstance(v, Template):
        pos = loop_find(v, timeout=ST.FIND_TIMEOUT)
    else:
        try_log_screen()
        pos = v
    for _ in range(times):
        G.DEVICE.touch(pos, **kwargs)
        time.sleep(0.05)
    delay_after_operation()
    return pos

click = touch  # click is alias of touch

所以閱讀代碼可知airtest的touch方法都是最終轉(zhuǎn)為坐標點谒府,然后調(diào)用G.DEVICE.touch(pos, **kwargs)方法進行操作屏幕的号阿,所以要分析圖像識別写妥,繼續(xù)跟蹤pos = loop_find(v, timeout=ST.FIND_TIMEOUT)這行語句

查找圖像

loop_find方法在core/cv.py里面,Airtest圖像識別專用

@logwrap
def loop_find(query, timeout=ST.FIND_TIMEOUT, threshold=None, interval=0.5, intervalfunc=None):
    """
    Search for image template in the screen until timeout

    Args:
        query: image template to be found in screenshot
        timeout: time interval how long to look for the image template
        threshold: default is None
        interval: sleep interval before next attempt to find the image template
        intervalfunc: function that is executed after unsuccessful attempt to find the image template

    Raises:
        TargetNotFoundError: when image template is not found in screenshot

    Returns:
        TargetNotFoundError if image template not found, otherwise returns the position where the image template has
        been found in screenshot

    """
    G.LOGGING.info("Try finding:\n%s", query)
    start_time = time.time()
    while True:
        screen = G.DEVICE.snapshot(filename=None, quality=ST.SNAPSHOT_QUALITY)

        if screen is None:
            G.LOGGING.warning("Screen is None, may be locked")
        else:
            if threshold:
                query.threshold = threshold
            match_pos = query.match_in(screen)
            if match_pos:
                try_log_screen(screen)
                return match_pos

        if intervalfunc is not None:
            intervalfunc()

        # 超時則raise,未超時則進行下次循環(huán):
        if (time.time() - start_time) > timeout:
            try_log_screen(screen)
            raise TargetNotFoundError('Picture %s not found in screen' % query)
        else:
            time.sleep(interval)

這個方法大概做了如下兩部操作

  1. 先調(diào)用設備方法截圖
  2. 調(diào)用Template對象的match_in方法囤踩,傳入截圖旨椒,返回坐標點

繼續(xù)深入

要知道具體怎么查找的,我們需要繼續(xù)研究cv.py里面的Template對象堵漱,這個對象作為airtest的核心到底是怎么實現(xiàn)圖像查找封裝的综慎,源碼定義同樣在cv.py里面

這個class暴露的只有兩個公開方法,前者是查找單個圖片勤庐,后者支持查找多個圖片示惊,返回值都是坐標點

def match_in(self, screen):
    pass
def match_all_in(self, screen):
    pass
match_in

方法調(diào)用如下_cv_match-->_try_match

_cv_match方法是讀取core/setting.py里面默認定義的圖像識別算法,列表是有優(yōu)先級的愉镰。匹配到之后就會直接返回結(jié)果

CVSTRATEGY = ["surf", "tpl", "brisk"]  # keypoint matching: kaze/brisk/akaze/orb, contrib: sift/surf/brief

這三個默認識別算法的默認映射到cv.py的頂部字典定義

MATCHING_METHODS = {
    "tpl": TemplateMatching,
    "kaze": KAZEMatching,
    "brisk": BRISKMatching,
    "akaze": AKAZEMatching,
    "orb": ORBMatching,
    "sift": SIFTMatching,
    "surf": SURFMatching,
    "brief": BRIEFMatching,
}

那么也就是說這個字典對應的文件才是圖像算法的真正目錄米罚,對應目錄是aircv目錄,具體實現(xiàn)文件是aircv.keypoint_matching.py和aircv.keypoint_matching_contrib.py

_try_match方法就是執(zhí)行這些方法對象的find_best_result方法丈探,返回結(jié)果

match_all_in

這個方法匹配的是多個录择,調(diào)用_find_all_template-->TemplateMatching.py
和匹配單個的不同,多個匹配直接用模板匹配算法碗降,單個匹配的分析模板匹配默認優(yōu)先級是第二的隘竭。

最終調(diào)用的都是find_all_results方法,進行算法匹配讼渊,返回結(jié)果

總結(jié)

那么圖像識別的基本流程就分析完了动看,從core/api.py的touch方法,跟蹤到cv.py精偿,提供單個和多個的圖像識別方法弧圆,以及默認的setting.py配置項,最終到aircv里面封裝的keypoint_xxxx具體圖像算法笔咽,那么有空再繼續(xù)分析下具體的識別和參數(shù)吧

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搔预,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叶组,更是在濱河造成了極大的恐慌拯田,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甩十,死亡現(xiàn)場離奇詭異船庇,居然都是意外死亡,警方通過查閱死者的電腦和手機侣监,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門鸭轮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橄霉,你說我怎么就攤上這事窃爷。” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵按厘,是天一觀的道長医吊。 經(jīng)常有香客問我,道長逮京,這世上最難降的妖魔是什么卿堂? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮懒棉,結(jié)果婚禮上草描,老公的妹妹穿的比我還像新娘。我一直安慰自己漓藕,他們只是感情好陶珠,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著享钞,像睡著了一般揍诽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栗竖,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天暑脆,我揣著相機與錄音,去河邊找鬼狐肢。 笑死添吗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的份名。 我是一名探鬼主播碟联,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼僵腺!你這毒婦竟也來了鲤孵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤辰如,失蹤者是張志新(化名)和其女友劉穎普监,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉兜,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凯正,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豌蟋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廊散。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梧疲,靈堂內(nèi)的尸體忽然破棺而出奸汇,到底是詐尸還是另有隱情施符,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布擂找,位于F島的核電站,受9級特大地震影響浩销,放射性物質(zhì)發(fā)生泄漏贯涎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一慢洋、第九天 我趴在偏房一處隱蔽的房頂上張望塘雳。 院中可真熱鬧,春花似錦普筹、人聲如沸败明。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妻顶。三九已至,卻和暖如春蜒车,著一層夾襖步出監(jiān)牢的瞬間讳嘱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工酿愧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沥潭,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓嬉挡,卻偏偏與公主長得像钝鸽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庞钢,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361