Python圖片識別找坐標(appium通過識別圖片點擊坐標)


***如果只想了解圖片相似度識別,直接看第一步即可
***如果想了解appium根據圖片識別點擊坐標,需要看第一、二、三步
 
背景| 在做UI測試時,發現iOS自定義的UI控件,appium識別不到。所以考慮通過識別圖片找坐標,進而通過點擊坐標解決問題
 
依賴python包|opencv、numpy、aircv
 
 

第一步:查找圖片在原始圖片上的坐標點

import aircv as ac
def matchImg(imgsrc,imgobj,confidencevalue=0.5):#imgsrc=原始圖像,imgobj=待查找的圖片
    imsrc = ac.imread(imgsrc)
    imobj = ac.imread(imgobj)
 
    match_result = ac.find_template(imsrc,imobj,confidence)  # {'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)}
    if match_result is not None:
        match_result['shape']=(imsrc.shape[1],imsrc.shape[0])#0為高,1為寬

    return match_result
 
說明:通過aircv的find_template()方法,來返回匹配圖片的坐標結果
1.入參:
find_template(原始圖像imsrc,待查找的圖片imobj,最低相似度confidence)
 
2.返回結果:
{'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)
confidence:匹配相似率
rectangle:匹配圖片在原始圖像上四邊形的坐標
result:匹配圖片在原始圖片上的中心坐標點,也就是我們要找的點擊點
 
注意:如果結果匹配到的confidence小於入參傳遞的相似度confidence,則會返回None,不返回字典
 

第二步:將圖片匹配的坐標點,轉換為手機屏幕上實際的坐標點

因為截圖后在PC上的分辨率,和在手機上分辨率不一樣,而我們通過第一步求出的坐標點是PC上截圖的坐標點,一般比手機上大很多,所以需要轉換一下坐標
 
photo_position=self.driver.get_screenshot_as_file(imgfile)#截屏手機
 
x = self.driver.get_window_size()['width']
y = self.driver.get_window_size()['height']
size_width,size_height = x,y #獲得手機d的寬高尺寸
 
confidencevalue = 0.8  # 定義相似度
position = matchImg(imsrc,imobj,confidence)# 用第一步的方法,實際就是find_template()方法
 
if position != None:
    x, y = position['result']
    shape_x, shape_y = tuple(map(int,position['shape']))
    position_x,position_y=int(photo_position_x+(photo_width/shape_x*x)),int(photo_position_y+(photo_height/shape_y*y))

    self.driver.tap([(position_x, position_y)])
 
思路說明:
1.通過appium的方法driver.get_screenshot_as_file(filename)進行截圖
2.通過appium的get_window_size獲得寬高的字典,進而得到寬和高
3.在PC上通過截圖和獲取到的手機屏截圖做匹配,返回匹配結果坐標以及PC上原圖的尺寸
4.通過PC上截圖和手機上屏幕的寬高比,以及在PC上的實際坐標點,獲得手機上實際的坐標點
5.最后通過appium的方法對手機上的坐標進行點擊drive.tap([x,y])
 
注意:為了匹配結果的精准性,截圖最好在PC上原圖1:1下截圖,不要放大后截圖,否則相似度會差很多
 

第三步:優化,截取手機上部分區域圖片,進行相似度匹配,提高匹配精度

因為有些圖片太小了,如果在一張大圖上進行匹配,經常匹配不到。那如果知道圖片出現的大概位置,可以截圖那個區域再進行匹配
 
這里有兩種區域截圖方法:
1.根據appium定位到的元素進行截圖
driver.find_element(*element).screenshot(imgfile)
 
2.根據截圖矩形左上角坐標(百分比x,y)和寬高(百分比)截圖
Image.open(imgfile).crop((pc_location_x,pc_location_y,pc_location_x+pc_width,pc_location_y+pc_height)).save(imgfile)
 
先截取整個手機屏幕,然后根據百分比以及PC上截圖的寬高進行計算,通過PIL的crop()方法截圖,獲得截圖上的坐標
然后根據PC和手機上圖片的比例獲得手機上的坐標
 


免責聲明!

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



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