我一直在尝试使用OpenCvs匹配模板功能在屏幕上简单地应用遮罩来定位模板,该模板只是一个正方形。目的是找到该框,然后忽略其中的内容。
模板如下:
1
我的方法是简单地对该模板进行二值化和反转,并使用它作为掩码来输入matchTemplate(),但是我一直遇到难以解释的错误。
这是我的代码:
import cv2
import numpy as np
template = cv2.imread(path + 'tile_outline_pink.png')
image = cv2.imread(path + 'test_screenshot.png')
w, h = template.shape[:-1]
#data = np.zeros((h, w, 3), dtype=np.uint8)
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
#cv2.imwrite("imghatGray.png", imghatGray)
ret, mask = cv2.threshold(templateGray, 200, 255, cv2.THRESH_BINARY)
#cv2.imwrite("orig_mask.png", orig_mask)
mask_inv = cv2.bitwise_not(mask)
#mask_inv = cv2.cvtColor(mask_inv,cv2.COLOR_GRAY2RGB)
print(image.shape, image.dtype)
print(template.shape, template.dtype)
print(mask_inv.shape, mask_inv.dtype)
method = cv2.TM_SQDIFF
result = cv2.matchTemplate(template, image, method, None, mask=mask_inv)
输出如下:
(674,969,3)uint8 (41、45、3)uint8 (41,45)uint8
错误回溯(最近一次通话) 在 31方法= cv2.TM_SQDIFF 32 ---> 33结果= cv2.matchTemplate(模板,图像,方法,无,mask = mask_inv) 34 35
错误:OpenCV(4.1.0)C:\ projects \ opencv-python \ opencv \ modules \ core \ src \ matrix.cpp:235:错误:(-215:断言失败)s> = 0在函数' cv :: setSize'
我也尝试过将模板图像转换为RGBA图像,但这也没有用,我不确定如何进行
感谢您的帮助
答案 0 :(得分:0)
我意识到犯了一个非常愚蠢的错误,
我无意间切换了图像,并在matchTemplate()中切换了模板参数
同样,遮罩和模板都必须是RGB或完全相同的尺寸。
因此,对于那些想要一个简单的模板与蒙版匹配的示例的人,此代码对我有用:
import cv2
import numpy as np
template = cv2.imread(path + 'tile_outline_pink.png')
image = cv2.imread(path + 'test_screenshot.png')
w, h = template.shape[:-1]
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(templateGray, 200, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
mask_inv = cv2.cvtColor(mask_inv,cv2.COLOR_GRAY2RGB)
print(image.shape, image.dtype)
print(template.shape, template.dtype)
print(mask_inv.shape, mask_inv.dtype)
method = cv2.TM_SQDIFF
result = cv2.matchTemplate(image, template, method, None, mask=mask_inv)