Как выделять объекты поверх всех окон? PyQT5 Python
У меня есть нейросеть на YOLO, которая определяет объекты и их координаты. Мне нужно, чтобы я мог выделять эти объекты на экране при запуске программы поверх всех окон(к примеру, я могу запустить видео с объектами на рабочем столе и программа должна будет рисовать контур этих объектов)
Я пробовал действовать через pyqt5, но никак не могу сообразить, как сделать так, чтобы прямоугольник был не один в кадре, а можно было рисовать их помногу, и самое главное, как их потом удалять в зависимости от изменения действия на экране(объекты на экране могут быть не статичные, а постоянно меняться или исчезать вовсе).
Вот мой код:
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import Qt, QCoreApplication, QTimer
from ultralytics import YOLO
import cv2
import pyautogui
model = YOLO("way/to/model/model.pt")
class TransparentWindow(QMainWindow):
def __init__(
self,
x: int,
y: int,
width: int,
height: int,
pen_color: str,
pen_size: int):
super().__init__()
self.highlight_x = x
self.highlight_y = y
self.highlight_width = width
self.highlight_height = height
self.pen_color = pen_color
self.pen_size = pen_size
self.initUI()
def initUI(self):
self.setGeometry(
self.highlight_x,
self.highlight_y,
self.highlight_width + self.pen_size,
self.highlight_height + self.pen_size)
self.setStyleSheet('background: transparent')
self.setWindowFlag(Qt.FramelessWindowHint)
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
painter.setPen(QPen(QColor(self.pen_color), self.pen_size))
painter.drawRect(
self.pen_size - 1,
self.pen_size - 1,
self.width() - 2 * self.pen_size,
self. height() - 2 * self.pen_size)
painter.end()
def highlight_on_screen(
x: int,
y: int,
width: int,
height: int,
pen_color: str = '#aaaa00',
pen_size: int = 2,
timeout: int = 0):
app = QApplication([])
window = TransparentWindow(x, y, width, height, pen_color, pen_size)
window.show()
QTimer.singleShot(timeout, QCoreApplication.quit)
app.exec_()
while True:
screenshot = pyautogui.screenshot()
results = model(screenshot, conf=0.25, save=True)
boxes_new = results[0].boxes.xyxy.numpy()
for box in range(len(boxes_new)):
x1, y1, x2, y2 = int(boxes_new[box][0]), int(boxes_new[box][1]), int(boxes_new[box][2]), int(boxes_new[box][3])
highlight_on_screen(x1, y1, x2-x1, y2-y1)