PyQt variable Framefarben in einen Grid

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Noises1g
User
Beiträge: 6
Registriert: Dienstag 29. Oktober 2019, 16:29

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())
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Noises1g
User
Beiträge: 6
Registriert: Dienstag 29. Oktober 2019, 16:29

Kannst du mir bitte kurz ein Codebeispiel geben?
Die Whileschleife hat kein Problem gemacht.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten