uiautomator2 icon indicating copy to clipboard operation
uiautomator2 copied to clipboard

图像匹配错误

Open FhyTan opened this issue 4 years ago • 8 comments

uiautomator2的版本号:2.11.1

使用device.image.match时匹配错误

模版图像是: image

截图: image

匹配结果:{'similarity': 0.9961444735527039, 'point': [319, 673]}

直接使用findit模块测试也是这么高匹配度,估计是findit模块不给力,是否有更好的图像匹配算法呢

FhyTan avatar Aug 21 '20 01:08 FhyTan

你这个关机按钮被识别到了这里 image

因为转化成了灰度图去对比,所以颜色信息丢失了。

codeskyblue avatar Aug 24 '20 03:08 codeskyblue

我试着用opencv去做图像匹配,也是被识别到这里,看来目前比较无解

FhyTan avatar Aug 24 '20 03:08 FhyTan

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

可以直接用HSV的H通道来模板匹配。 H代表颜色通道

image = cv2.imread("image.png")
template = cv2.imread("tempalte.png")

himage = cv2.split(cv2.cvtColor(image, cv2.COLOR_BGR2HSV))[0]
htempl = cv2.split(cv2.cvtColor(template, cv2.COLOR_BGR2HSV))[0]
sim = match_template(himage, htempl) # 具体代码我不详细的写了

试了下,还可以

codeskyblue avatar Aug 24 '20 03:08 codeskyblue

十分感谢

FhyTan avatar Aug 24 '20 03:08 FhyTan

十分感谢

请问你解决了 吗?我还是有些不太明白,想和你交流交流,我的微信kimihasukida

liucong233 avatar Sep 04 '20 08:09 liucong233

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

可以直接用HSV的H通道来模板匹配。 H代表颜色通道

image = cv2.imread("image.png")
template = cv2.imread("tempalte.png")

himage = cv2.split(cv2.cvtColor(image, cv2.COLOR_BGR2HSV))[0]
htempl = cv2.split(cv2.cvtColor(template, cv2.COLOR_BGR2HSV))[0]
sim = match_template(himage, htempl) # 具体代码我不详细的写了

试了下,还可以

请问通过修改源码的哪一部分可以使用H通道,看起来应该是这一段代码 image

liucong233 avatar Sep 04 '20 09:09 liucong233

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html 可以直接用HSV的H通道来模板匹配。 H代表颜色通道

image = cv2.imread("image.png")
template = cv2.imread("tempalte.png")

himage = cv2.split(cv2.cvtColor(image, cv2.COLOR_BGR2HSV))[0]
htempl = cv2.split(cv2.cvtColor(template, cv2.COLOR_BGR2HSV))[0]
sim = match_template(himage, htempl) # 具体代码我不详细的写了

试了下,还可以

请问通过修改源码的哪一部分可以使用H通道,看起来应该是这一段代码 image

上面的代码我试了也不太行,虽然对于不匹配的截图similarity是低了,但是对于匹配的截图similarity也不高。。

目前是我参考这个stackoverflow,把匹配算法更换为cv2.TM_CCOEFF_NORMED

大致代码:

from findit import FindIt

# 更换匹配算法
fi = FindIt(
    engine_template_cv_method_name='cv2.TM_CCOEFF_NORMED'
)

# 加载关机按钮
fi.load_template(
    pic_name='template',
    pic_path='close.jpg',
)

# 匹配有关机按钮的截图
print(fi.find(
    target_pic_name='screenshot',
    target_pic_path='match.jpg',
))
>>>{'target_name': 'screenshot', 'target_path': 'match.jpg', 'data': {'template': {'TemplateEngine': {'target_point': [910, 557], 'target_sim': 0.9564827084541321, 'ok': True}, 'FeatureEngine': {'target_point': (-1, -1), 'ok': False}}}}

# 匹配没有关机按钮的截图
print(fi.find(
    target_pic_name='screenshot',
    target_pic_path='unmatch.jpg',
))
>>>{'target_name': 'screenshot', 'target_path': 'unmatch.jpg', 'data': {'template': {'TemplateEngine': {'target_point': [381, 2039], 'target_sim': 0.7069997191429138, 'ok': True}, 'FeatureEngine': {'target_point': (-1, -1), 'ok': False}}}}

FhyTan avatar Sep 09 '20 06:09 FhyTan

import cv2
import aircv as ac
def match(IMSRC, IMOBJ):#imgsrc=原始图像,imgobj=待查找的图片
        # 匹配图标位置
        imsrc = cv2.imread(IMSRC)
        imobj = cv2.imread(IMOBJ)
        pos = ac.find_all_template(imsrc, imobj, 0.8)
        
        if pos == None:
            print("最终没能匹配到:" + imsrc)
            return None
        else:
            return [p['result'] for p in pos]  #pos ==>[{'result': (975.0, 542.0), 'rectangle': ((939, 515), (939, 569), (1011, 515), (1011, 569)), 'confidence': 1.0}, {'result': (450.0, 542.0)....

好用

firmlyjin avatar Jan 14 '22 08:01 firmlyjin