Python OpenCV pattern matching error

I have been dealing with OpenCV bindings for python for a long time, and I wanted to try pattern matching, I get this error, and I have no idea why

C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\templmatch.cpp:910: error: (-215) (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function cv::matchTemplate 

Does anyone have any clues why this might happen?

Source:

 import win32gui from PIL import ImageGrab import win32api, win32con import numpy deckVar = "deck.png" # Temporary def click(x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) margin = 10 def OOO(): # Order Of Operations print None def main(): deck = "test" img = ImageGrab.grab() HWNDHandle = win32gui.FindWindow(None, "Hearthstone"); x,y,x2,y2 = win32gui.GetWindowRect(HWNDHandle) print x,y,x2,y2 l = x2-x h = y2-y print l,h img_recog(img,"imgs/my_collection.png") def img_recog(img,templ): import cv2 import numpy as np from matplotlib import pyplot as plt img2 = numpy.array(img.getdata()).reshape(img.size[0], img.size[1], 3) template = cv2.imread(templ,0) w, h = template.shape[::-1] # All the 6 methods for comparison in a list methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] img = img2.copy() method = eval(methods[1]) # Apply template Matching try: res = cv2.matchTemplate(img,template,method) except Exception as e: print str(e) raw_input() min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: top_left = min_loc else: top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) return cv2.rectangle(img,top_left, bottom_right, 255, 2) main() 
+7
python opencv
source share
1 answer

Note the error message:

error: (-215) (depth == CV_8U || depth == CV_32F) && & & type == _templ.type () && & _img.dims () <= 2 in the cv :: matchTemplate function

This means that the image data type must be CV_8U or CV_32F, and it must have 3 or less channels.

If you do not know what CV_8U, CV_32F means, see this list .

Perhaps you are passing numpy objects other than np.uint8 or np.float32. you can easily convert numpy dtype to 8-bit or 32-bit using:

 img.astype(np.float32) img.astype(np.uint8) 

Just note that OpenCV expects 8-bit CV_8U data to be in the range 0..255, and CV_32F can be in any range.

+10
source share

All Articles