Tkinter Webcam Zugriff

Fragen zu Tkinter.
Antworten
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Hallo zusammen,
ich beschäftige mich seit zwei Wochen das erste Mal mit Python. Ich habe für ein Projekt an der Uni die Aufgabe, eine Benutzeroberfläche für ein Raspberry Pi Touch zu entwerfen. Ich habe schon eine Oberfläche mit Buttons und verschiedenen frames (Klick Button -> Neuer Frame) erstellt. Die nächste Aufgabe, die ich lösen will, ist es per Klick auf einen Button, ein Bild mit einer Webcam aufzunehmen und dieses unter einem bestimmten Pfad abzuspeichern. Da ich wirklich noch nicht viel über Python weiß, würde ich mich freuen, wenn mir jemand sagen kann, wie ich an die Sache herangehen soll zB benötige ich andere Module etc.?

Soweit wäre ich schon mal :)

Code: Alles auswählen

from tkinter import *

def raise_frame(frame):
    frame.tkraise()

root = Tk()
root.geometry('800x480')


f1 = Frame(root) #Main menu
f2 = Frame(root) #Automatic mode
f3 = Frame(root) #Manual mode
f4 = Frame(root) #Picture mode
f5 = Frame(root) #Copyright


image1 = PhotoImage(file='das.png')
bild1 = Label(f1,image=image1,background='white')
bild1.pack()

image2 = PhotoImage(file='Automatic_BG.png')
bild2 = Label(f2,image=image2,background='white')
bild2.pack()

image3 = PhotoImage(file='Manual_BG.png')
bild3 = Label(f3,image=image3,background='white')
bild3.pack()

image4 = PhotoImage(file='PICTURE_BG.png')
bild4 = Label(f4,image=image4,background='white')
bild4.pack()

image5 = PhotoImage(file='COPY_BG.png')
bild5 = Label(f5,image=image5,background='white')
bild5.pack()



for frame in (f1, f2, f3, f4, f5):
    frame.grid(row=0, column=0, sticky='news')
    

button1 = Button(f1,text='AUTOMATIC MODE',command=lambda:raise_frame(f2),activeforeground = 'grey',height = 1, width = 30)
button1.place(x='20',y='200')
button2 = Button(f2,text='Back',command=lambda:raise_frame(f1),activeforeground = 'grey',height = 1, width = 7)
button2.place(x='20',y='450')

button3 = Button(f1, text='MANUAL MODE', command=lambda:raise_frame(f3),activeforeground = 'grey',height = 1, width = 30)
button3.place(x='20',y='260')
button4 = Button(f3,text='Back',command=lambda:raise_frame(f1),activeforeground = 'grey',height = 1, width = 7)
button4.place(x='20',y='450')

button5 = Button(f1, text='PICTURE MODE', command=lambda:raise_frame(f4),activeforeground = 'grey',height = 1, width = 30)
button5.place(x='20',y='320')
button6 = Button(f4,text='Back',command=lambda:raise_frame(f1),activeforeground = 'grey',height = 1, width = 7)
button6.place(x='20',y='450')

button7 = Button(f1, text='Copyright 2017 - ADLight',command=lambda:raise_frame(f5),activeforeground = 'grey',height = 1, width = 30)
button7.place(x='20',y='450')
button8 = Button(f5,text='Back',command=lambda:raise_frame(f1),activeforeground = 'grey',height = 1, width = 7)
button8.place(x='20',y='450')

Copyright = Label(f5,text='Urherberrecht')
Copyright.place(x='400',y='150',anchor='center')



raise_frame(f1)
root.mainloop()
Zuletzt geändert von Anonymous am Mittwoch 28. Juni 2017, 11:26, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fuer touch halte ich tkinter fuer nicht so geeignet (auch wenn es technisch geht).

Benutz lieber gleich Kivy, und das kann laut Doku auch die Kamera ansprechen:

https://kivy.org/docs/examples/gen__cam ... n__py.html
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Hallo deets,
Danke für deinen Hinweis. Die Bildaufnahme ist nicht die einzige Funktion. Über den Touch sollen SMD-LEDs auf einer Platine mit verschiedenen Einstellmöglichkeiten (Intensität,Flickermodus etc) gesteuert werden, falls das als Information und für die Umsetzung mit tkinter wichtig sein sollte.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine angeschlossene Hardware hat damit nichts zu tun. Was auch immer fuer Code du schreibst, der das tut, laeuft prinizpiell unabhaengig von deinem GUI-Framework. Er muss ggf. unter Rueckgriff auf Timer geschrieben werden, aber das gilt fuer beide Frameworks. Kivy ist halt besser als Tkinter, weil es uA die GPU-Beschleunigung des PI benutzt, von vorneherein auf den PI und Touch zugeschnitten ist, aktiv entwickelt wird, etc....

Wenn du darauf bestehst, den Kram in Tkinter zu machen, musst du halt aus dem PiCamera Modul fallende Bilder zu PhotoImages machen. Ich bin mir recht sicher, dass google auch dafuer was zu bieten hat.
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Alles klar. Ich würde es gerne mal ausprobieren, um es mir nicht unnötig schwer zu machen. Ich habe schon zB bei Stackflow gesehen, dass viele von Packages reden, die installiert werden müssen. Gibt es irgendwo eine Quelle, in der man nachlesen kann, welche man für bestimmte Projekte benötigt wie in meinem Fall für Bilder und eventuell Videos (außer ich verwende Kivy)?
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht genau, was du ausprobieren willst, und was du schwer findest.

Unter der Annahme, dass du weiter mit tkinter arbeiten willst: da wirst du mindestens ein Paket installieren müssen, picamera. Ob das bei deiner distro schon dabei ist weiß ich nicht.

Und eine solche Zauberseite, die nach gewünschter Funktionalität Pakete zur Installation vorschlägt gibt es nicht.

Du musst schauen, was du programmieren musst (durch googeln von tkinter, picamera zB). Da kommt dann Code bei rum, und da stehts dann dabei, oder spätestens die importe sagen ja, was du brauchst.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Noch ein Nachtrag: ich sehe gerade, dass du generisch von Webcam und nicht der PiCam sprichst. Welches Modell hast du denn genau? Substantiell ändert das nicht so viel, statt picamera wäre dann zB pygame und verwenden.
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Habe eine Microsoft LifeCam HD-3000. Bin nun soweit, dass ich mit folgendem Code ein Bild abspeichern kann.

Code: Alles auswählen

import cv2
import time

camera_port = 0
camera = cv2.VideoCapture(camera_port)
time.sleep(0.1) 
return_value, image = camera.read()
cv2.imwrite("opencv.png", image)
del(camera) 
In meiner GUI gibt es einen Button, wenn ich diesen drücke, möchte ich ein Bild aufnehmen. Jetzt weiß ich nur nicht, wie diesen Ausschnitt in

Code: Alles auswählen

Snap = Button(f4, text='Capture',command="Code von oben")
Snap.place(x='20',y='320')
einbinden kann. Wäre für einen Tipp oder Lösung dankbar!
Lg
Zuletzt geändert von Anonymous am Freitag 30. Juni 2017, 20:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Deinen "Code von oben" bindest Du genau so und nicht anders ein, wie unter Button-Widgets im ersten Beispiel beschrieben, an Stelle von print "click!", denn Dein "Code von oben" sollte eigentlich ein funktions_name sein.

http://effbot.org/tkinterbook/button.htm
Philipp68
User
Beiträge: 34
Registriert: Freitag 23. Juni 2017, 10:14

Super, hat funktioniert, vielen Dank! :)
BlackJack

@Philipp68: Kleiner Hinweis zum Code: Das ``del(camera)`` macht keinen Sinn, das solltest Du entfernen.
Antworten