我想从屏幕截图(使用mss)
进行matchTemplate
from mss import mss
import cv2
import numpy
with mss() as sct:
screenshot_numpy = numpy.array(sct.shot())
template = cv2.imread('./templates/player.png')
result = cv2.matchTemplate(screenshot_numpy,template,cv2.TM_CCOEFF_NORMED)
错误讯息:
Traceback (most recent call last):
File "main.py", line 14, in <module>
result = cv2.matchTemplate(screenshot_numpy,template,cv2.TM_CCOEFF_NORMED)
TypeError: image data type = 18 is not supported
答案 0 :(得分:1)
img = numpy.array(sct.grab(monitor))
所以在这里我们可以看到.grab()
方法从图像中获取原始像素数据。在这种情况下,sct.grab()
会返回PIL Image
,numpy.array(Image)
会将PIL Image
对象转换为numpy ndarray
。
转换后检查numpy ndarray dtype
;例如如果您的代码为ndarray_img = numpy.array(sct.grab())
,请检查ndarray_img.dtype
。如果它是np.uint8
那么你已经完成了。如果是np.uint16
,那么您必须除以256并使用np.uint8
转换为ndarray_img = (ndarray_img/255).astype(np.uint8)
。
再往下看,你会看到另一个翻转图像R和B通道的例子:
cv2.imshow(title, cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
除了这实际上是倒退。它真的没关系,因为它只是交换第一个和第三个通道,所以BGR2RGB
和RGB2BGR
完成相同的事情,但PIL(和其他库)在你需要时给你RGB顺序BGR命令用OpenCV显示,所以从技术上来说应该是
cv2.imshow(title, cv2.cvtColor(img, cv2.COLOR_RGB2BGR))