圖像對比檢測

在Android Automation時,特別時使用uiautomator庫,經常遇到頁面控制項元素無法被hierarchyviewer捕捉到的問題。比如下面的輸入鍵盤,控制項信息是無法被識別出來的。那麼問題來了,如果需要自動化測試該輸入鍵盤中的語音等菜單,那需要怎麼操作呢?

準備工作

1. 安裝依賴庫

pip安裝opencv-python庫和pandas等庫,摳圖必備。

當然,Android開發環境應該早已裝好了吧(確保adb devices能找得到設備)。

2. adb截圖

通過adb截圖,來獲取想摳下來元素所在的界面,比如上述那張手機??截圖。

def screenshot(serial, filename): png = os.path.basename(filename) if serial: shell(adb -s %s shell screencap /sdcard/%s % (serial, png)) #截圖到sd卡 shell(adb -s %s pull /sdcard/%s %s % (serial, png, filename)) #將截圖pull到電腦 else: shell(adb shell screencap /sdcard/%s % png) shell(adb pull /sdcard/%s %s % (png, filename)) return True

開始摳圖

1. 讀取圖像

雖然不是視覺演算法工程師,但是cv2的庫還是極力推薦,簡單的圖像處理等操作都可以比較輕鬆地解決。

import cv2img = cv2.imread(filename) #filename為圖片完整存儲地址cv2.imshow(input,img) #input為圖像窗口名稱,img為上一步imread的圖像k = 0xFF & cv2.waitKey(1) #waitKey表示圖像的顯示時間

2. 圖像處理

首先定義滑鼠畫筆事件,同時獲取rect。

def onmouse(event,x,y,flags,param): global img,img2,drawing,value,mask,rectangle,rect,rect_or_mask,ix,iy,rect_over if event == cv2.EVENT_LBUTTONDOWN: #滑鼠左鍵點擊事件 滑鼠左鍵點擊下之後,獲取滑鼠起始坐標(ix,iy) rectangle = True ix,iy = x,y elif event == cv2.EVENT_MOUSEMOVE: #滑鼠左鍵移動事件 滑鼠左鍵開始移動之後,獲取滑鼠起始坐標(ix,iy) if rectangle == True: img = img2.copy() cv2.rectangle(img,(ix,iy),(x,y),BLUE,2) #img是圖像窗口,(ix,iy)是起始坐標,(x,y)是結束坐標,BLUE線顏色,2表示線寬 rect = (ix,iy,abs(ix-x),abs(iy-y)) rect_or_mask = 0 elif event == cv2.EVENT_LBUTTONUP: #滑鼠左鍵釋放事件 rectangle = False rect_over = True cv2.rectangle(img,(ix,iy),(x,y),BLUE,2) rect = (ix,iy,abs(ix-x),abs(iy-y)) rect_or_mask = 0

onmouse函數獲取的rect,即感興趣區域的坐標(ix,iy,abs(ix-x),abs(iy-y))。ix為起始橫坐標,iy為起始縱坐標,abs(ix-x)為寬,abs(iy-y)為高。

cv2.namedWindow(input,0)cv2.setMouseCallback(input,onmouse)cv2.moveWindow(input,img.shape[1]+10,90) #輸出窗口註冊滑鼠事件

  • namedWindow函數的作用是,通過指定的名字,創建一個可以作為圖像和進度條的容器窗口,此處即創建一個『input』的圖像窗口。
  • setMouseCallback函數,輸出窗口註冊滑鼠事件,通過對『input』的圖像窗口,執行onmouse的滑鼠畫筆操作。
  • cv2.moveWindow函數是改變圖像位置,讓input窗口在指定位置顯示。

運行時input窗口顯示如下:

選好感興趣區域後,對感興趣的區域即ROI區域進行提取,並進行保存。

im = im[rect[1]:(rect[1]+rect[3],rect[0]:(rect[0]+rect[2]] #提取ROI區域cv2.imwrite(out.png,im) #輸出圖像

摳出來的圖如下,到這一步,摳圖部分就算完成了。

圖像對比

先貼代碼:

if self._device.find(sys.path[0] + "\ResourceFile"+"\PicComparison\"+"voice_icon.png"): self._logger.debug("Success to find voice icon!")

sys.path[0] + "\ResourceFile"+"\PicComparison"+"viewFullScreen.png"為上一步所摳圖的存儲位置,uiautomator自帶的find函數可以在整個界面查找與之匹配的圖片,實現匹配。


推薦閱讀:

【小林的OpenCV基礎課 番外】極簡邊緣運算元基礎知識
元旦贈書 | 18本紙質書:OpenCV、Python和機器學習,總有一本適合你
如何在unity里使用opencv?
【opencv學習筆記六】圖像的ROI區域選擇與複製
[1]OpenCV4Android機器視覺應用入門-JNI編寫HelloWorld

TAG:OpenCV | Python | Android |