首页 > 解决方案 > OpenCv 窗口在单击时层叠屏幕

问题描述

我编写了这段代码,通过第二次截屏来捕获屏幕画面,但是当单击 OpenCv 窗口时,它会层叠屏幕。

在此处输入图像描述

当您将鼠标悬停在 Opencv 窗口上时,它会显示没有一百个重复的屏幕。究竟是什么错误?图片:

在此处输入图像描述

在此处输入图像描述

使用我制作的类的代码:

from window_capture import Window_Capture
from time import time
import cv2 as cv
import numpy

loop_time = time()

wincap = Window_Capture()

while True:
    screenshot = wincap.screenshare()

    cv.imshow('Screen', screenshot)

    print("FPS {}".format(round(1 / (time() - loop_time))))
    loop_time = time()

    if cv.waitKey(1) == ord('q'):
        print("Capture Ended")
        cv.destroyWindow(screenshot)

截屏类:

import pyautogui
import numpy
import cv2 as cv
from time import time
from PIL import ImageGrab
import win32gui, win32ui, win32con
from win32api import GetSystemMetrics
import time


class Window_Capture:
    w = 0
    h = 0
    hwnd = None

    def __init__(self, window_name=None):
        # checking is windowname exists

        if window_name is None:
            print("No window set to capture: Setting to active Window")
            time.sleep(3)
            self.hwnd = win32gui.GetDesktopWindow()
            print(win32gui.GetWindowText(win32gui.GetDesktopWindow()))
        else:
            # self.hwnd = win32gui.FindWindow(None, window_name)
            self.hwnd = win32gui.FindWindow(None, window_name)
            print("Window Found: Setting to preferred Window")

        # define monitor height and width and hwnd
        self.w = GetSystemMetrics(0)
        self.h = GetSystemMetrics(1)

    def screenshare(self):

        wDC = win32gui.GetWindowDC(self.hwnd)
        dcObj = win32ui.CreateDCFromHandle(wDC)
        cDC = dcObj.CreateCompatibleDC()
        dataBitMap = win32ui.CreateBitmap()
        dataBitMap.CreateCompatibleBitmap(dcObj, self.w, self.h)
        cDC.SelectObject(dataBitMap)
        cDC.BitBlt((0, 0), (self.w, self.h), dcObj, (0, 0), win32con.SRCCOPY)

        signedIntsArray = dataBitMap.GetBitmapBits(True)
        img = numpy.frombuffer(signedIntsArray, dtype='uint8')
        img.shape = (self.h, self.w, 4)

        dcObj.DeleteDC()
        cDC.DeleteDC()
        win32gui.ReleaseDC(self.hwnd, wDC)
        win32gui.DeleteObject(dataBitMap.GetHandle())

        img = img[..., :3]
        img = numpy.ascontiguousarray(img)

        return img

这个错误阻止我进入图像检测项目的下一部分。

标签: pythonpython-3.xopencvpywin32

解决方案


您会看到一个级联,因为您反复截取窗口本身的屏幕截图。

就像站在两面镜子之间。


推荐阅读