Seite 1 von 1

PyQt variable Framefarben in einen Grid

Verfasst: Dienstag 29. Oktober 2019, 17:12
von Noises1g
Guten Tag,

ich habe ein Grid aus Frames welche die Farben ändern sollen durch den Input von Variablen (Mittelwert von Pixelwerten eines Videocaptures).
Also wenn sich die Pixel in einen bereich ändern sollen sich die Farbe eines Frames ändern.
Das Funktionier auch soweit für einzelne Frames (ohne Grid).

Meine Frage ist jetzt wie ich auf die im Grid erstellen Frames einzeln "zugreife".
Und vielleicht noch wie ich einen Pushbutton außerhalb des Grids erstelle der ist im Moment immer dahinter oder verändert die Größe einer Zeile.

Die Kommentierte Zeile ist die nicht funktionierende.
"#frames.setStyleSheet("QWidget { background-color: %s}" % CL1.name())"

Vielen Dank im Voraus für die Hilfe.

Code: Alles auswählen

import sys
import cv2
import numpy as np

from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QFrame, QPushButton
from PyQt5.QtGui import QColor

class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.button = QPushButton("START", self)
        self.button.move(200, 200)
        self.button.clicked.connect(self.VideoCaptcher)

        red = 130
        CL1 = QColor(red, 0, 0)
        grid = QGridLayout()
        self.setGeometry(350, 350, 500, 500) 
  
        for i in range(12):
            for j in range(12):
                frames = QFrame(self)
                frames.setStyleSheet("QWidget { background-color: %s}" % CL1.name())
                grid.addWidget(frames, j, i)
        
        self.setLayout(grid)

    def VideoCaptcher(self):
        cap = cv2.VideoCapture(0)
        
        cap.set(cv2.CAP_PROP_BRIGHTNESS, 0.5)
        cap.set(cv2.CAP_PROP_CONTRAST, 0.5)
        cap.set(cv2.CAP_PROP_FPS, 10)
        cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)
        cap.set(cv2.CAP_PROP_EXPOSURE, 0.0002)
        cap.set(3, 320)
        cap.set(4, 240)

        while True:
            _, faser = cap.read()

            L1 = (faser[97:104, 85:92].mean())

            CL1 = QColor(L1, 0, 0)
            #frames.setStyleSheet("QWidget { background-color: %s}" % CL1.name())

            print (L1)
            
            cv2.imshow('FASER', faser)
                
            if cv2.waitKey(1) & 0xFF == ord('q'):
                    break

        cap.release()
        cv2.destroyAllWindows()
        
                
App = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(App.exec())

Re: PyQt variable Framefarben in einen Grid

Verfasst: Dienstag 29. Oktober 2019, 17:52
von __deets__
Du merkst dir die QFrame-Objekte einfach in einer geeigneten Datenstruktur. ZB einem Woerterbuch, bei dem (i, j) den Schluessel bilden.

Ansonsten kann ich mir nicht vorstellen, dass dein Programm wirklich wie gewuenscht funktioniert. Denn die while-Schleife wird Probleme in der Interaktion mit dem Qt-Kram machen. Stattdessen musst du einen QTimer anlegen, der dir mit der gewuenschten Frame-Rate einen Frame abholt.

Re: PyQt variable Framefarben in einen Grid

Verfasst: Donnerstag 31. Oktober 2019, 11:22
von Noises1g
Kannst du mir bitte kurz ein Codebeispiel geben?
Die Whileschleife hat kein Problem gemacht.

Re: PyQt variable Framefarben in einen Grid

Verfasst: Donnerstag 31. Oktober 2019, 12:40
von __blackjack__
@Noises1g: Nur ein paar kleine Anmerkungen: Bei `cap.set()` die ”magischen” Werte 3 und 4 sollten wie bei den anderen Aufrufen durch die entsprechenden Konstanten ersetzt werden.

Und `faser` kann auch `None` sein, womit Dein Code nicht klar kommt.

Woher weisst Du, dass sich `cv.imshow()` und `cv2.waitKey()` mit der Qt-Hauptschleife vertragen?

Edit: `move()` und `setGeometry()` sollte man nicht verwenden und Namen wie `CL1` und `L1` gehen gar nicht.