Python Opencv发现图像不';不存在于屏幕上
我尝试使用opencv在屏幕上搜索按钮的位置。若按钮存在于屏幕上,opencv工作完美,但它会返回一些=0 x,y,即使图像不存在。如何修复它Python Opencv发现图像不';不存在于屏幕上,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我尝试使用opencv在屏幕上搜索按钮的位置。若按钮存在于屏幕上,opencv工作完美,但它会返回一些=0 x,y,即使图像不存在。如何修复它 import cv2 def buttonlocation(image): im = ImageGrab.grab() im.save('screenshot.png') img = cv2.imread(image,0) img2 = img.copy() template = cv2.imread('scree
import cv2
def buttonlocation(image):
im = ImageGrab.grab()
im.save('screenshot.png')
img = cv2.imread(image,0)
img2 = img.copy()
template = cv2.imread('screenshot.png',0)
w,h = template.shape[::-1]
meth = 'cv2.TM_SQDIFF'
img = img2.copy()
method = eval(meth)
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
x,y = top_left
return x,y
有关模板匹配过程的两个步骤的详细信息
R=cv2.matchTemplate(I,T,method)
计算图像R
。该图像的每个像素x,y
表示一个标记,这取决于模板T
和I
的子图像之间的相似性,从x,y
开始。例如,如果应用方法cv.TM_SQDIFF
,则标记计算为:R[x,y]
为空,则子图像I[x:x+sxT,y:y+syT]
与模板T
完全相同。R[x,y]
越小,子图像越接近模板
cv2.minMaxLoc(R)
用于查找R
的最小值。与I
的任何其他子映像相比,I
的相应子映像更接近模板I
不包含模板,则与R
最小值对应的I
子图像可能与T
非常不同。但最小值反映了这一点事实上,R
上的阈值可以作为决定模板是否在图像中的一种方法。
为阈值选择值是一项棘手的任务。它可以是R
最大值的一小部分,也可以是R平均值的一小部分。模板大小的影响可以通过将R
除以sxT*syT
来讨论。例如,R
的最大值取决于模板大小和图像类型。例如,对于CV_8UC3(无符号字符,3个通道),R
的最大值为255*3*sxT*syT
以下是一个例子:
import cv2
img = cv2.imread('image.jpg',eval('cv2.CV_LOAD_IMAGE_COLOR'))
template = cv2.imread('template.jpg',eval('cv2.CV_LOAD_IMAGE_COLOR'))
cv2.imshow('image',img)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
meth = 'cv2.TM_SQDIFF'
method = eval(meth)
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
x,y = top_left
h,w,c=template.shape
print 'R='+str( min_val)
if min_val< h*w*3*(20*20):
cv2.rectangle(img,min_loc,(min_loc[0] + w,min_loc[1] + h),(0,255,0),3)
else:
print 'first template not found'
template = cv2.imread('template2.jpg',eval('cv2.CV_LOAD_IMAGE_COLOR'))
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
x,y = top_left
h,w,c=template.shape
print 'R='+str( min_val)
if min_val< h*w*3*(20*20):
cv2.rectangle(img,min_loc,(min_loc[0] + w,min_loc[1] + h),(0,0,255),3)
else:
print 'second template not found'
cv2.imwrite( "result.jpg", img);
cv2.namedWindow('res',0)
cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
导入cv2
img=cv2.imread('image.jpg',eval('cv2.CV\u LOAD\u image\u COLOR'))
template=cv2.imread('template.jpg',eval('cv2.CV\u LOAD\u IMAGE\u COLOR'))
cv2.imshow(“图像”,img)
#cv2.等待键(0)
#cv2.destroyAllWindows()
meth='cv2.TM_SQDIFF'
方法=评估(方法)
res=cv2.matchTemplate(img,模板,方法)
最小值,最大值,最小位置,最大位置=cv2。最小最大位置(res)
左上=最小位置
x、 y=左上方
h、 w,c=模板形状
打印“R=”+str(最小值)
如果最小值
图像:
可以找到第一个模板:
找不到第二个模板:
结果是:
A就好了。。。