Python OpenCV断言与matchTemplate一起失败
我是python新手,我尝试跟踪对象检测,但我调用find(调用cv.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'
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