Python實現按鍵精靈(二)-找圖找色


 

一、實現功能

  判斷在指定坐標范圍內,是否存在相似度大於n的圖片,並返回坐標。

二、基本思路

  A=你需要尋找的圖片

  B=截取當前頁面中指定范圍的圖片

  利用opencv 判斷A在B中的位置,

  在該位置截取與A圖同大小的圖片C

  對比圖片C與圖片A的相似度

三、實現的代碼段

  1、安裝所需要的庫

pip install opencv-python
pip install pywin32

  2、截取指定坐標的圖片

    參數說明

    filename:保存的文件名

    hwnd:窗口句柄 請想辦法獲取

    pos:坐標位置 [x1,y1,x2,y2]。x1,y1 是左上角坐標、x2,y2 指右下角坐標。

    該功能可以返回不在最頂層程序的截圖。

def window_capture(filename,hwnd=0,pos=None):
    hwnd = hwnd  # 窗口的編號,0號表示當前活躍窗口
    # 根據窗口句柄獲取窗口的設備上下文DC(Divice Context)
    hwndDC = win32gui.GetWindowDC(hwnd)
    # 根據窗口的DC獲取mfcDC
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)
    # mfcDC創建可兼容的DC
    saveDC = mfcDC.CreateCompatibleDC()
    # 創建bigmap准備保存圖片
    saveBitMap = win32ui.CreateBitmap()
    # 獲取監控器信息
    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)
   #清楚圖片數據,防止內存泄露
  
win32gui.DeleteObject(saveBitMap.GetHandle())
   saveDC.DeleteDC()
 

  3、利用opencv 判斷A在B中的位置

    參數說明

    target:cv2.imread(“圖片B”)
    template:cv2.imread(“圖片A”)
def find_picture(target,template):
    #獲得模板圖片的高寬尺寸
    theight, twidth = template.shape[:2]
    #執行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
    result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
    #歸一化處理
    cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
    #尋找矩陣(一維數組當做向量,用Mat定義)中的最大值和最小值的匹配結果及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    #匹配值轉換為字符串
    #對於cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趨近與0匹配度越好,匹配位置取min_loc
    #對於其他方法max_val越趨近於1匹配度越好,匹配位置取max_loc
    strmin_val = str(min_val)
    #繪制矩形邊框,將匹配區域標注出來
    #min_loc:矩形定點
    #(min_loc[0]+twidth,min_loc[1]+theight):矩形的寬高
    #(0,0,225):矩形的邊框顏色;2:矩形邊框寬度
    cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
    #顯示結果,並將匹配值顯示在標題欄上
    # cv2.imshow("MatchResult----MatchingValue="+strmin_val,target)
    # cv2.waitKey()
    # cv2.destroyAllWindows()
    x=min_loc[0]
    y=min_loc[1]

    return X,Y

  4、返回指定圖片的指定位置指定坐標

#target原始圖片
#x,y 起始坐標
#w,h 返回的寬長
def get_pic_from_pic(x,y,w,h,target):
    region = target[y:y+h,x:x+w]
    retrun region

  5、比較兩個圖片的相似度

def compare_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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM