openCV不接受numpy数组?

时间:2017-08-26 04:13:51

标签: python opencv numpy

我想从屏幕截图(使用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

1 个答案:

答案 0 :(得分:1)

来自mss examples page

  

img = numpy.array(sct.grab(monitor))

所以在这里我们可以看到.grab()方法从图像中获取原始像素数据。在这种情况下,sct.grab()会返回PIL Imagenumpy.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))

除了这实际上是倒退。它真的没关系,因为它只是交换第一个和第三个通道,所以BGR2RGBRGB2BGR完成相同的事情,但PIL(和其他库)在你需要时给你RGB顺序BGR命令用OpenCV显示,所以从技术上来说应该是

  

cv2.imshow(title, cv2.cvtColor(img, cv2.COLOR_RGB2BGR))