问题描述
我有一个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()
都是您的朋友。)