所以我从另一篇文章中找到了这段代码,它可以快速截图。当我第一次运行它时,它通常会在我想要的窗口上进行屏幕截图。第二次运行它时,它给出了与第一次相同的屏幕截图。每个屏幕截图都应覆盖其最后一个屏幕截图。
import cv2 as cv
import numpy as np
import pyautogui
import time
import pygetwindow as gw
import win32gui
import win32ui
import win32con
def background_screenshot(hwnd, width, height):
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, width, height)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(width, height) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, 'haystack.png')
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
windowname = 'My_Window'
hwnd = win32gui.FindWindow(None, windowname)
background_screenshot(hwnd, 1920, 1080)
haystack_image = cv.imread('haystack.png', cv.IMREAD_UNCHANGED)
needle_image = cv.imread('needle.png', cv.IMREAD_UNCHANGED)
needle_image = cv.cvtColor(needle_image, cv.COLOR_RGB2BGR)
result = cv.matchTemplate(haystack_image, needle_image, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
print('Best match top left position: %s' % str(max_loc))
print('Best match confidence: %s' % max_val)
threshold = 0.1
if max_val >= threshold:
print('Found needle.')
#get dimensions of the needle image
needle_w = needle_image.shape[1]
needle_h = needle_image.shape[0]
top_left = max_loc
bottom_right = (top_left[0] + needle_w, top_left[1] + needle_h)
cv.rectangle(haystack_image, top_left, bottom_right,
color=(0,255,0), thickness=2, lineType=cv.LINE_4)
cv.imshow('Result', haystack_image)
cv.waitKey()
else:
print('Needle not found.')
我希望这段代码每次运行它时都会给我一个不同的屏幕截图并覆盖最后一个。问题出在background_screenshot函数上,其余的代码并不重要。
这段代码似乎对我有用...虽然我无法找出问题所在,但如果问题仍然存在,建议首先尝试删除图像:
import cv2 as cv
import numpy as np
import time
import win32gui
import win32ui
import win32con
import os
def background_screenshot(hwnd, width, height):
try:
os.remove('haystack.png')
except:
print("File is already deleted.")
finally:
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, width, height)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(width, height) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, 'haystack.png')
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
windowname = 'My_Window'
hwnd = win32gui.FindWindow(None, windowname)
background_screenshot(hwnd, 1920, 1080)
需要明确的是,正如您指定的那样,只有功能很重要,这是我测试的唯一部分。