opencv python模板匹配_Python OpenCV模板匹配错误

I've been messing around with the OpenCV bindings for python for a while now and i wanted to try template 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

Anyone have any clues as to why this might be happening?

Source code:

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()

解决方案

Pay attention to the error message:

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

It means the data type of the image should be CV_8U or CV_32F, and it should have 3 or less channels.

If you don't know what CV_8U, CV_32F means, see this list.

Probably 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 pay attention that OpenCV expect CV_8U 8-bit data to be in the range 0..255 and CV_32F can be in any range.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值