# Wartet, um sicherzugehen, dass die Verbindung mit dem Videostream established ist.
time.sleep(2.0)
#Main Klasse in dem, die meiste Logik unseres Skripts abläuft
classMain:
#Initialisierung der benötigten Variablen für unser Skript
def__init__(self):
self.outputFrame=None
self.lock=threading.Lock()
self.wait_in_thread=None
self.streamThread=None
self.analysis_results=None
self.analysis_thread=None
self.speaking_thread=None# Verfolgt den aktuellen Sprech-Thread
self.main_time=0
self.last_chat_time=0# Zeitpunkt des letzten Sprechens API kosten beachten
self.currentclient=None
self.unacked_publish=set()
self.flag=False
self.selection=3
self.outputFrame=None# Outputframe für den Stream.
self.lock=threading.Lock()#Instanz der Threading.lock Klasse, welches ein primitives Lock object darstellt. Nur ein Thread kann auf dieses immer zugreifen und sperrt es für die anderen
self.streamThread=None#Variable für den Streamthread
self.analysis_results=None# Analysergebnisse
self.analysis_thread=None#Variable für den Analysethread
self.speaking_thread=None# Variable für den aktuellen Speakingthread
self.main_time=0# Zeitpunkt der letzten Gesichtsanalyse
self.last_chat_time=0# Zeitpunkt des letzten Sprechens - API kosten beachten
self.currentclient=None# Variable für den Mqtt client
self.unacked_publish=set()# Nicht rausgesendete MQTT Nachrichten
self.flag=False# Eine normale Flag für den Stream
self.selection=3#Variablen für die Logik des animierten Maskottchen
self.it=0
# Funktion für den Stream - öffnet eine Fastapi auf vorgegebenen IP und Port
}#Übermitteln des Autorisierungsschlüssels zur Identifikation des Clients
payload={
"providers":"openai",
"text":f"Die Person fühlt sich {emotion} an. Antworte auf Deutsch ohne Komma und in einem kurzen Satz. Motiviere die Person, erwähne die {emotion} Emotion. Du bist in einem Face detection Programm versuche immer Variation in neuen Sätzen zu bringen.",
frame=video_capture.read()# Einlesen des Camerafeeds
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#Konvertierung von dem echten Colorspace zu dem idealen für Computervision.Damit sollen die Ergebnisse genauer werden
faces=face_cascade.detectMultiScale(gray,scaleFactor=1.3,minNeighbors=5)#Erkennung der Gesichter anhand mehrerer Parameter
self.facial_analysis_thread(frame)# Ausführung der Gesichtsanalyse
analyze=self.analysis_results[0]ifself.analysis_resultselseNone#Schaut, ob Analyseergebnisse vorliegen
analysis_results_dict={"age":analyze.get("age","N/A"),"gender":analyze.get("dominant_gender","N/A"),"emotion":analyze.get("dominant_emotion","N/A")}#Analyseergebnisse in ein Dict für Konvertierung in JSON notwendig
self.sendMessage(mqttc=mqttc,topic="Topic1",message=json.dumps(analysis_results_dict))# Sendung der Ergebnisse durch MQTT