Почему ПИЛ.Изображение.захват определенного окна не работает должным образом?

#python #python-imaging-library #imagegrab

Вопрос:

Я пытаюсь захватить определенные окна и отобразить их ImageGrab с помощью следующего кода:

 import cv2
import numpy as np
from PIL import ImageGrab
import pygetwindow
import pyautogui

titles = pygetwindow.getAllTitles()

while(1):
    cars = pygetwindow.getWindowsWithTitle('car - Google Search - Google Chrome')[0]
    print(cars.left, cars.top ,cars.width, cars.height)
    img = ImageGrab.grab(bbox=(int(cars.left),int(cars.top),cars.width,cars.height)) #x, y, w, h
    img_np = np.array(img)
    frame = cv2.cvtColor(img_np, cv2.CV_8U)
    cv2.waitKey(1)
    cv2.imshow("frame", frame)
cv2.destroyAllWindows()
 

Он каким-то образом может отображать Chrome и следить за окном, но я заметил, что, если ось x и y bbox больше ширины и высоты, будет ошибка. Кроме того, всякий раз, когда я пытаюсь переместить браузер Chrome, клавиша высоты и ширины рамки настраивается сама. Есть какие-нибудь идеи о том, как решить эти проблемы?

Ответ №1:

Проблема возникла из-за вашего ImageGrab.grab звонка. К сожалению, это не упоминается в самой документации, но из исходного кода вы видите, что это:

 ImageGrab.grab(bbox=(left, top, right, bottom))
 

Итак, вы должны рассчитать right и bottom соответственно. Этот код отлично работает для меня:

 import cv2
import numpy as np
from PIL import ImageGrab
import pygetwindow

titles = pygetwindow.getAllTitles()

while True:
    cars = pygetwindow.getWindowsWithTitle('car - Google Search - Google Chrome')[0]
    print(cars.left, cars.top, cars.width, cars.height)
    img = ImageGrab.grab(bbox=(int(cars.left),
                               int(cars.top),
                               int(cars.left   cars.width),
                               int(cars.top   cars.height)))
    frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    cv2.waitKey(1)
    cv2.imshow('frame', frame)
 

Пожалуйста, обратите внимание, я также исправил ваш cv2.cvtColor звонок, чтобы отображались правильные цвета.

 ----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.19041-SP0
Python:        3.9.1
PyCharm:       2021.1.3
NumPy:         1.20.3
OpenCV:        4.5.2
Pillow:        8.3.0
pygetwindow:   0.0.9
----------------------------------------