Python OpenCV断言与matchTemplate一起失败

Python OpenCV断言与matchTemplate一起失败,python,numpy,opencv,pywin32,Python,Numpy,Opencv,Pywin32,我是python新手,我尝试跟踪对象检测,但我调用find(调用cv.matchTemplate)的代码出现以下错误: import cv2 as cv import numpy as np from time import time from random import randint from windowcapture import WindowCapture from vision import Vision #points = get_click_points('img2.jpg'

我是python新手,我尝试跟踪对象检测,但我调用find(调用cv.matchTemplate)的代码出现以下错误:

import cv2 as cv
import numpy as np
from time import time
from random import randint
from windowcapture import WindowCapture
from vision import Vision


#points = get_click_points('img2.jpg', 'copper.jpg', threshold=0.55, debug_mode=True)

wincap = WindowCapture('OSBuddy - takeawayeoc')
vision_ore = Vision('orefixed.png')

loop_time = time()
while (True):
    screenshot = wincap.capture_window()

    #cv.imshow('Computer Vision', screenshot)
    vision_ore.find(screenshot, 0.6, 'rectangles')
    print('FPS{}'.format(1 / (time() - loop_time)))
    loop_time = time()

    if(cv.waitKey(1) == ord('q')):
        cv.destroyAllWindows()
        break


File "c:\Users\Daniel\Documents\Projects\bottests\vision.py", line 28, in find
    result = cv.matchTemplate(haystack_img, self.needle_img, self.method)
cv2.error: OpenCV(4.4.0) 
C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-h4wtvo23\opencv\modules\imgproc\src\templmatch.cpp:1163: error: (-215:Assertion failed)
 (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function 'cv::matchTemplate'
这是窗口捕获功能的代码:

def capture_window(self):
    #hwnd = None
    #get the window image data
    wDC = win32gui.GetWindowDC(self.hwnd)
    dcObj = win32ui.CreateDCFromHandle(wDC)
    cDC = dcObj.CreateCompatibleDC()
    dataBitMap = win32ui.CreateBitmap()
    dataBitMap.CreateCompatibleBitmap(dcObj, self.w, self.h)
    cDC.SelectObject(dataBitMap)
    cDC.BitBlt((0, 0), (self.w, self.h), dcObj, (0,0), win32con.SRCCOPY)

    # convert the raw data into a format opencv can read
    #dataBitMap.SaveBitmapFile(cDC, 'debug.bmp')
    signedIntsArray = dataBitMap.GetBitmapBits(True)
    img = np.fromstring(signedIntsArray, dtype='uint8')
    img.shape = (self.h, self.w, 4)

    # free resources
    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(self.hwnd, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())

    # drop the alpha channel
    img = img[:,:,:3]
    # make image C_CONTIGUOUS
    img = np.ascontiguousarray(img)
    print('IMG DIMS: ', img.shape) #returns 'IMG DIMS: (28, 160, 3) then my error
    return img

我走对了吗?如何让matchTemplate从视频源读取我的屏幕截图?

在我的构造函数中,我设置了
self.needle\u img=self.needle\u img[…,:3]
在运行cv.imread到图像后,它似乎可以工作。如果有更好的解决办法,请告诉我。
def capture_window(self):
    #hwnd = None
    #get the window image data
    wDC = win32gui.GetWindowDC(self.hwnd)
    dcObj = win32ui.CreateDCFromHandle(wDC)
    cDC = dcObj.CreateCompatibleDC()
    dataBitMap = win32ui.CreateBitmap()
    dataBitMap.CreateCompatibleBitmap(dcObj, self.w, self.h)
    cDC.SelectObject(dataBitMap)
    cDC.BitBlt((0, 0), (self.w, self.h), dcObj, (0,0), win32con.SRCCOPY)

    # convert the raw data into a format opencv can read
    #dataBitMap.SaveBitmapFile(cDC, 'debug.bmp')
    signedIntsArray = dataBitMap.GetBitmapBits(True)
    img = np.fromstring(signedIntsArray, dtype='uint8')
    img.shape = (self.h, self.w, 4)

    # free resources
    dcObj.DeleteDC()
    cDC.DeleteDC()
    win32gui.ReleaseDC(self.hwnd, wDC)
    win32gui.DeleteObject(dataBitMap.GetHandle())

    # drop the alpha channel
    img = img[:,:,:3]
    # make image C_CONTIGUOUS
    img = np.ascontiguousarray(img)
    print('IMG DIMS: ', img.shape) #returns 'IMG DIMS: (28, 160, 3) then my error
    return img