零蕾域、軟件功用和我使用背景
我需要操縱的app屏蔽了控件獲取接口买喧,因此直接用圖像識(shí)別來分辨出app的各個(gè)元素進(jìn)行操作搔啊。同時(shí)由于需要在各個(gè)設(shè)備上操縱此app,各設(shè)備圖像有所不同蘸拔,需要屏蔽掉這個(gè)影響师郑。
一、參考文獻(xiàn)及我的評(píng)判:
https://opencv.org/ opencv官網(wǎng)
二调窍、意外問題一覽
設(shè)備分辨率相關(guān)知識(shí):
px:Pixel
dpi:device pixels
ppi:pixel per inch
density:密度
嗯 當(dāng)然物理分辨率是沒法調(diào)的宝冕。我當(dāng)時(shí)是在一臺(tái)設(shè)備上,通過調(diào)整密度邓萨,設(shè)置給手機(jī)不同的顯示分辨率地梨。
三、基本流程命令
1)對(duì)目標(biāo)元素進(jìn)行截圖缔恳,保存作為樣板宝剖。
對(duì)當(dāng)前app進(jìn)行截圖,比對(duì)圖片歉甚,(在估測(cè)區(qū)域region)找到樣板万细。
kp1, des1 = sift.detectAndCompute(dst, None)
kp2, des2 = sift.detectAndCompute(src, None)
index_params = dict(algorithm=0, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=3)
matches是匹配的特征點(diǎn)集,是一個(gè)二維數(shù)組铃芦,由于提供的k為3故有3個(gè)雅镊。代表了三個(gè)可能匹配。我當(dāng)時(shí)使用的方法是刃滓,如果說三個(gè)集合里匹配的特征點(diǎn)都不到總特征點(diǎn)數(shù)量的一半,認(rèn)為兩圖并不匹配耸弄,即圖片中并不存在我需要尋找的元素咧虎。
可能存在失誤,但95%以上是正確的计呈,對(duì)我當(dāng)時(shí)需要的50%正確率是足夠了砰诵。
2)無需考慮分辨率構(gòu)成影響時(shí),簡(jiǎn)單方便很多捌显,matchtemplate搞定:
def find_dst_pos_val(src, dst, self_mask=False):
????""" 找到目標(biāo)在圖像中的對(duì)應(yīng)位置茁彭,并給出相似度 相似度比較方法為TM_SQDIFF,0為最優(yōu)匹配
????:param src: 源圖
????:param dst: 目標(biāo)圖(要求背景色為黑色(0,0,0)以排除干擾)
????:return: 匹配點(diǎn)位置(加目標(biāo)圖大小即匹配區(qū))扶歪,相似度 """
????res = cv2.matchTemplate(src, dst, cv2.TM_SQDIFF, mask=dst if self_mask else None)
????xl = len(res)
????yl = len(res[0])
????m = 100
????pos = None
????for x in range(0, xl - 1):
????????for y in range(0, yl - 1):
????????????if abs(res[x][y]) < m:
????????????????pos = x, y
????????????????m = abs(res[x][y])
posl = pos[1], pos[0] if pos else None
return posl, m
0為最優(yōu)匹配 超出100理肺,我判定為無匹配。
3)opencv? 可以講的實(shí)在太多了,嗯俺就給自己的用法做個(gè)小記錄得妹萨∧暾恚回頭再用再回顧。