Kivy Picture Input

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
PooggaTo
User
Beiträge: 4
Registriert: Freitag 17. November 2017, 22:16

Hallo Zusammen :)

Also ich hab folgendes Projekt am laufen: Ich baue mir eine Türsprechanlage und es läuft auch alles so weit, außer eine "Kleinigkeit".
Ich habe mit das alles mit Kivy und einem Touchpanel am Raspberry Pi realisiert und ich möchte über eine Outdoor-Webcam das Video anzeigen lassen.
Ich hab mir es so gedacht, dass ich jede Sek ein Bild von der Webcam hole und mir am Bildschirm ausgebe. Das mit dem holen funktioniert auch einwandfrei :D
Leider musste ich feststellen das die Ausgabe nicht so funktioniert wie sie soll... zuerst wollt ich die Datei einfach immer überschreiben, aber ich musste feststellen das Kivy das Bild "zwischenspeichert" und dann immer das "zwischengespeicherte" Bild ausgibt und nicht das aktuelle.
Dann hab ich versucht einfach immer das aktuelle Bild selbst zwischen zu speichern nur mit anderem Namen, so dass Kivy die neue Datei holen muss. Das hat auch funktioniert, aber nur bis ca 11 Bild, dann gibt es mir nur noch ein "schwarzes" Bild aus :?:
Vll weiß jemand von euch woran es liegt :D
Mein Code und dieser wird immer nach z.b. 1 Sek von der Clock aufgerufen:

Code: Alles auswählen

def Cam_Update(self, dt):
		global bild_counter, var_pfad_alt
		
		if os.path.isfile('/home/***/code/tuerklingel/Bilder/livecam.jpg'):
			var = str(bild_counter)
			print "var:", var
			var_pfad = '/home/***/code/tuerklingel/Bilder/livecam_' + var + '.jpg'
			print "var_pfad:",  var_pfad
			os.popen('cp /home/***/code/tuerklingel/Bilder/livecam.jpg ' + var_pfad)
			self.Bild = var_pfad
			
			if var_pfad_alt != 'NULL':
				os.remove(var_pfad_alt)
			
			var_pfad_alt = var_pfad
		
			bild_counter += 1
			
und der Zugehörige .kv Code:

Code: Alles auswählen

<Hauptfenster>:
	BoxLayout:
		BoxLayout:
			orientation: "vertical"
			Image:
				id: Bild
				source: root.Bild
				size_hint_x: 1
				size_hint_y: 1
Falls ihr noch weitere Informationen braucht, schreibt mir einfach :wink:

Viele Grüße
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt es einen Grund warum du nicht die in Kivy vorhandene Kamera Darstellung benutzt?

Und dein Problem dürfte sein, das Kivy aggressiv auf der GPU zwischen speichert, aus performance Gründen. Schau mal hier

https://kivy.org/docs/api-kivy.core.image.html

und speil damit - da gibt es auch ein nocache Attribut.

Dein Ansatz immer neue Bilder zu schreiben ist in jedem Fall Mist, weil es dir irgendwann die SD-Karte zerschießt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@PooggaTo: neben dem, das es ungeschickt ist, ständig Bilder zu speichern (man könnte ja auch die RAM-Disk nehmen) ist am Code noch einiges unschön. Eingerückt wird generell mit 4 Leerzeichen pro Ebene, nicht 3; wenn man Code aus anderen Projekten übernimmt, hat man immer Einrückprobleme.

`global` sollte nicht verwendet werden, zumal Du ja einscheinend schon eine Klasse hast. Du hast drei mal den Pfad zum Livebild geschrieben, wenn Du den ändern willst (z.B. zur RAM-Disk), mußt Du alle Stellen finden und ersetzen. Definiere den Pfad als Konstante am Anfang des Programms. Strings stückelt man nicht mit + zusammen, sondern nimmt `.format`. Du benutzt `os.popen`, wartest dann aber nicht auf das Ende des Programms. Das Bild wird also gelesen, bevor es vollständig geschrieben ist; wenn Du ein externes Programm aufrufen willst, nimm eine passende Funktion aus dem subprocess-Modul; hier gibt es aber mit shutils.copyfile schon eine Python-Funktion, die das selbe macht; aber das Kopieren ist auch völlig überflüssig, es würde das Umbenennen mit `os.rename` reichen. Die Namen `var` oder `var_path` sagen nicht wirklich aus, für was die Variable steht.
Für „fehlenden“ Inhalt gibt es `None`, den String 'NULL' zu verwenden, könnte irgendwo Probleme geben.

Code: Alles auswählen

LIVECAM_PATH = '/dev/shm'
LIVECAM_IMAGE = os.path.join(LIVECAM_PATH, 'livecam.jpg')

    def Cam_Update(self, dt):
        if os.path.isfile(LIVECAM_IMAGE):
            image_filename = os.path.join(LIVECAM_PATH, 'livecam_{}.jpg'.format(self.bild_counter)
            os.rename(LIVECAM_IMAGE, image_filename)
            self.bild = image_filename
            if self.old_image_filename is not None:
                os.remove(self.old_image_filename)
            self.old_image_filename = image_filename
            self.bild_counter += 1
Aber auf jeden Fall sollte man das Nutzen, was Kivy schon von sich aus mitbringt.
Antworten