python2定点找色_Python实现按键精灵(二)-找图找色
一、實(shí)現(xiàn)功能
判斷在指定坐標(biāo)范圍內(nèi),是否存在相似度大于n的圖片,并返回坐標(biāo)。
二、基本思路
A=你需要尋找的圖片
B=截取當(dāng)前頁面中指定范圍的圖片
利用opencv 判斷A在B中的位置,
在該位置截取與A圖同大小的圖片C
對(duì)比圖片C與圖片A的相似度
三、實(shí)現(xiàn)的代碼段
1、安裝所需要的庫
pip install opencv-python
pip install pywin32
2、截取指定坐標(biāo)的圖片
參數(shù)說明
filename:保存的文件名
hwnd:窗口句柄 請(qǐng)想辦法獲取
pos:坐標(biāo)位置 [x1,y1,x2,y2]。x1,y1 是左上角坐標(biāo)、x2,y2 指右下角坐標(biāo)。
該功能可以返回不在最頂層程序的截圖。
def window_capture(filename,hwnd=0,pos=None):
hwnd= hwnd #窗口的編號(hào),0號(hào)表示當(dāng)前活躍窗口
#根據(jù)窗口句柄獲取窗口的設(shè)備上下文DC(Divice Context)
hwndDC =win32gui.GetWindowDC(hwnd)#根據(jù)窗口的DC獲取mfcDC
mfcDC =win32ui.CreateDCFromHandle(hwndDC)#mfcDC創(chuàng)建可兼容的DC
saveDC =mfcDC.CreateCompatibleDC()#創(chuàng)建bigmap準(zhǔn)備保存圖片
saveBitMap =win32ui.CreateBitmap()#獲取監(jiān)控器信息
MoniterDev =win32api.EnumDisplayMonitors(None, None)if pos==None:
x1=0
y1=0
w= MoniterDev[0][2][2]
h= MoniterDev[0][2][3]else:
x1=pos[0]
y1=pos[1]
w=pos[2]-pos[0]
h=pos[3]-pos[1]#print w,h #圖片大小
#為bitmap開辟空間
saveBitMap.CreateCompatibleBitmap(mfcDC, MoniterDev[0][2][2], MoniterDev[0][2][3])#高度saveDC,將截圖保存到saveBitmap中
saveDC.SelectObject(saveBitMap)#截取從左上角(0,0)長寬為(w,h)的圖片
saveDC.BitBlt((x1, y1), (w, h), mfcDC, (x1, y1), win32con.SRCCOPY)
saveBitMap.SaveBitmapFile(saveDC, filename)
#清楚圖片數(shù)據(jù),防止內(nèi)存泄露win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
3、利用opencv 判斷A在B中的位置
參數(shù)說明
target:cv2.imread(“圖片B”)
template:cv2.imread(“圖片A”)
deffind_picture(target,template):#獲得模板圖片的高寬尺寸
theight, twidth = template.shape[:2]#執(zhí)行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
result =cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)#歸一化處理
cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1)#尋找矩陣(一維數(shù)組當(dāng)做向量,用Mat定義)中的最大值和最小值的匹配結(jié)果及其位置
min_val, max_val, min_loc, max_loc =cv2.minMaxLoc(result)#匹配值轉(zhuǎn)換為字符串
#對(duì)于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趨近與0匹配度越好,匹配位置取min_loc
#對(duì)于其他方法max_val越趨近于1匹配度越好,匹配位置取max_loc
strmin_val =str(min_val)#繪制矩形邊框,將匹配區(qū)域標(biāo)注出來
#min_loc:矩形定點(diǎn)
#(min_loc[0]+twidth,min_loc[1]+theight):矩形的寬高
#(0,0,225):矩形的邊框顏色;2:矩形邊框?qū)挾?/p>
cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)#顯示結(jié)果,并將匹配值顯示在標(biāo)題欄上
#cv2.imshow("MatchResult----MatchingValue="+strmin_val,target)
#cv2.waitKey()
#cv2.destroyAllWindows()
x=min_loc[0]
y=min_loc[1]return X,Y
4、返回指定圖片的指定位置指定坐標(biāo)
#target原始圖片#x,y 起始坐標(biāo)#w,h 返回的寬長
defget_pic_from_pic(x,y,w,h,target):
region= target[y:y+h,x:x+w]
retrun region
5、比較兩個(gè)圖片的相似度
defcompare_picture( imageA, imageB):#灰度圖片比較
grayA =cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB=cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
(score, diff)= compare_ssim(grayA, grayB, full=True)return float(score)
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python2定点找色_Python实现按键精灵(二)-找图找色的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv 画矩形_图像处理之Open
- 下一篇: nginx 配置静态文件目录_nginx