OpenCV匹配模板-阈值永远不等于1

问题描述

我有一个HTML 5 Web应用程序,它使用Canvas元素绘制了一个丰富的UI,为此我需要编写一些自动化测试。

由于没有公开的API可以让我们知道Canvas元素上已渲染的内容,所以我决定使用OpenCV在浏览器中连续扫描渲染的内容,以找出何时绘制了内容。

因此,我使用以下类:

class IMGLocator:

    def __init__(self,path):
        self.reference = cv.imread(path)

    def find(self,image):
        ref  = cv.cvtColor(self.reference,cv.COLOR_BGR2GRAY)
        nparr = numpy.frombuffer(image,numpy.uint8)
        sourceRGB = cv.imdecode(nparr,cv.IMREAD_UNCHANGED)
        sourceGRAY = cv.cvtColor(sourceRGB,cv.COLOR_BGR2GRAY)
        w,h = ref.shape[::-1]
        res = cv.matchTemplate(sourceGRAY,ref,cv.TM_CCOEFF_NORMED)
        threshold = 0.98
        loc = numpy.where(res >= threshold)

        return cv.rectangle(sourceRGB,(loc[1][0],loc[0][0]),(loc[1][0] + w,loc[0][0] + h),(255,0),2)

当前,该类在匹配的区域上绘制一个蓝色矩形。

这是脚本的主要入口点。

if __name__ == "__main__":
    driver = webdriver.Firefox()
    driver.get(BACKOFFICE_URI)
    locator = IMGLocator("REF.AUTHENTICATION.jpg")

    time.sleep(5)
    data = locator.find(driver.get_screenshot_as_png())

我想要一个精确匹配,因此我尝试将阈值设置为1,但是此时没有结果。

那怎么可能,有没有水可以返回完全匹配?

解决方法

https://docs.opencv.org/master/df/dfb/group__imgproc__object.html

中显示了各种模板匹配模式使用的公式。

请注意_NORMED分母的平方根。假设像素确实是相同的,您可能会看到误差的伪影,因为该平方根的浮点中实数的不精确表示导致了误差。因此,如果您决定使用两种_NORMED模式之一,则将遇到使用阈值的问题。或者,考虑使用cv2.TM_SQDIFF并寻找最小值。 (无论哪种方式,cv2.minMaxLoc()都是您的朋友。)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...