Fadenkreuz auf kamerabild

Fragen zu Tkinter.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Hallo

Kann mir jemand helfen wie ich auf das Picamera live Bild ein Fadenkreuz bekomme?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eines auf eine Folie malen, und die vor die Kamera halten?

Im Ernst: wenn du Hilfe moechtest, musst du uns schon den Code zeigen, den du benutzt (mit Code-Tags posten!), und ein bisschen weiter ausholen, was genau du machst und was du erreichen willst.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Einfach erst mal Picamera starten
Die Kamera Einstellungen hab ich jetzt mal weg gelassen.

Code: Alles auswählen

Camera.start_preview
Jetzt habe ich das Bild
Darauf hätte ich gern eine Art Fadenkreuz
Eine horizontale und vertikale Linie und zwei Kreise.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Achso. Jetzt ist es VIEL klarer.

Alles was du tun musst ist ein overlay hinzufuegen, dass transparent machen, und in der Ebene oberhalb der Vorschau anordnen, so dass es darueber dargestellt wird. Sollte jetzt ja klar sein, Code braucht hier ja keiner.....
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Doch ich bräuchte einen Code. Würde den den ich habe ja Posten komme aber da gerade nicht ran.

Bin auf Arbeit und kann nur über Handy schreiben.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Also so richtig bekomme ich es nicht hin.
Hier mal der gesamte Code des Programmes.
Hätte jetzt noch gern eine Art Fadenkreuz über dem Kamerabild.
Vielleicht kann sich das mal jemand anschauen und vielleicht eine Starthilfe geben.

Danke :(

Code: Alles auswählen

from tkinter import *
from tkinter import messagebox
import tkinter as tk
import picamera

APP_TITLE = "Kamera"
APP_XPOS = 10
APP_YPOS = 10
APP_WIDTH = 1280
APP_HEIGHT = 800
Hintergrundbild = "Hintergrund.gif"

camera = picamera.PiCamera(resolution=(1920,1080))

cam_bri = 30
cam_con = 60
cam_shu = 20000
cam_iso = 100


camera.brightness = cam_bri
camera.contrast = cam_con
camera.shutter_speed = cam_shu
camera.iso = cam_iso

camera.vflip=False
camera.hflip=False
camera.awb_mode='auto'
camera.exposure_mode='sports'
camera.video_stabilization=True
camera.preview_fullscreen=False
camera.preview_window=(200, 50, 1050, 800)



class Settings(tk.Toplevel):
    def __init__(self, parent, noborder=True):
        super().__init__(parent)

        self.title("Settings")
        self.geometry("{}x{}".format(180, 500))
        self.geometry("+{}+{}".format(10, 200))
        self.configure(bg='steelblue1')
        self.wm_overrideredirect(noborder)

        self.cambri_threshold = tk.IntVar(value=cam_bri)
        self.camcon_threshold = tk.IntVar(value=cam_con)
        self.camiso_threshold = tk.IntVar(value=cam_iso)
        self.camshu_threshold = tk.IntVar(value=cam_shu)

        main_frame = tk.Frame(self)
        main_frame .pack(padx=10, pady=10)

        settings_label = Label(self, bg="steelblue1", text="Einstellungen")
        settings_label.place(x = 20, y = 5, width=150, height=40)
        settings_label.config(font=("Arial", 15))
        
       ##Helligkeit##
        
        anweisungs_label = Label(self, bg="steelblue1", text="Helligkeit")
        anweisungs_label.place(x = 50, y = 50, width=80, height=40)
        anweisungs_label.config(font=("Arial", 12))

        bri_label = Label(self, bg="steelblue1", textvariable=self.cambri_threshold)
        bri_label.place(x = 50, y = 90, width=80, height=40)
        bri_label.config(font=("Arial", 12))
        
        bri1_button = Button(self, text="+", background='steelblue1', activebackground='steelblue3', command=self.cambri1)
        bri1_button.place(x = 120, y = 90, width=40, height=40)
        bri2_button = Button(self, text="-", background='steelblue1', activebackground='steelblue3', command=self.cambri2)
        bri2_button.place(x = 20, y = 90, width=40, height=40)

        ##Kontrast##

        anweisungs_label = Label(self, bg="steelblue1", text="Kontrast")
        anweisungs_label.place(x = 50, y = 130, width=80, height=40)
        anweisungs_label.config(font=("Arial", 12))

        con_label = Label(self, bg="steelblue1", textvariable=self.camcon_threshold)
        con_label.place(x = 50, y = 170, width=80, height=40)
        con_label.config(font=("Arial", 12))

        con1_button = Button(self, text="+", background='steelblue1', activebackground='steelblue3', command=self.con1)
        con1_button.place(x = 120, y = 170, width=40, height=40)
        con2_button = Button(self, text="-", background='steelblue1', activebackground='steelblue3', command=self.con2)
        con2_button.place(x = 20, y = 170, width=40, height=40)

        ##ISO##

        anweisungs_label = Label(self, bg="steelblue1", text="ISO-Wert")
        anweisungs_label.place(x = 50, y = 210, width=80, height=40)
        anweisungs_label.config(font=("Arial", 12))

        iso_label = Label(self, bg="steelblue1", textvariable=self.camiso_threshold)
        iso_label.place(x = 50, y = 250, width=80, height=40)
        iso_label.config(font=("Arial", 12))

        iso1_button = Button(self, text="+", background='steelblue1', activebackground='steelblue3', command=self.Iso1)
        iso1_button.place(x = 120, y = 250, width=40, height=40)
        iso2_button = Button(self, text="-", background='steelblue1', activebackground='steelblue3', command=self.Iso2)
        iso2_button.place(x = 20, y = 250, width=40, height=40)

        ##Belichtung##

        anweisungs_label = Label(self, bg="steelblue1", text="Belichtung")
        anweisungs_label.place(x = 50, y = 290, width=80, height=40)
        anweisungs_label.config(font=("Arial", 12))

        shu_label = Label(self, bg="steelblue1", textvariable=self.camshu_threshold)
        shu_label.place(x = 50, y = 330, width=80, height=40)
        shu_label.config(font=("Arial", 12))
        

        shu1_button = Button(self, text="+", background='steelblue1', activebackground='steelblue3', command=self.shu1)
        shu1_button.place(x = 120, y = 330, width=40, height=40)
        shu2_button = Button(self, text="-", background='steelblue1', activebackground='steelblue3', command=self.shu2)
        shu2_button.place(x = 20, y = 330, width=40, height=40)

        Quit_button = Button(self, text="schließen", background='steelblue1', activebackground='steelblue3', command=self.destroy)
        Quit_button.place(x = 25, y = 430, width=120, height=40)
        
#####################################################
             

    
    def cambri1(self):
        global cam_bri
        wert = 5
        cam_bri = min(100, cam_bri + wert)
        camera.brightness = cam_bri
        self.cambri_threshold.set(self.cambri_threshold.get() + wert)
           
    def cambri2(self):
        global cam_bri
        wert = 5
        cam_bri = min(100, cam_bri - wert)
        camera.brightness = cam_bri
        self.cambri_threshold.set(self.cambri_threshold.get() - wert)

    def con1(self):
        global cam_con
        wert = 5
        cam_con = min(100, cam_con + wert)
        camera.contrast = cam_con
        self.camcon_threshold.set(self.camcon_threshold.get() + wert)
    def con2(self):
        global cam_con
        wert=5
        cam_con = min(100, cam_con - wert)
        camera.contrast = cam_con
        self.camcon_threshold.set(self.camcon_threshold.get() - wert)

        
    def Iso1(self):
        global cam_iso
        wert = 50
        cam_iso = min(800, cam_iso + wert)
        camera.iso = cam_iso
        self.camiso_threshold.set(self.camiso_threshold.get() + wert)
    def Iso2(self):
        global cam_iso
        wert = 50
        cam_iso = min(800, cam_iso - wert)
        camera.iso = cam_iso
        self.camiso_threshold.set(self.camiso_threshold.get() - wert)


        
    def shu1(self):
        global cam_shu
        wert = 5000
        cam_shu = min(1000000, cam_shu + wert)
        camera.shutter_speed = cam_shu
        self.camshu_threshold.set(self.camshu_threshold.get() + wert)
    def shu2(self):
        global cam_shu
        wert = 5000
        cam_shu = min(1000000, cam_shu - wert)
        camera.shutter_speed = cam_shu
        self.camshu_threshold.set(self.camshu_threshold.get() - wert)


############## Hauptfenster############
        
class MainFrame(tk.Frame):
    
    def __init__(self, haupt_fenster):
        super().__init__(haupt_fenster)
        self.haupt_fenster = haupt_fenster
        self.haupt_fenster.protocol("WM_DELETE_WINDOW", self.close)

        self.build()
        
    def build(self):
        button_frame = tk.Frame(self)
        button_frame.pack(pady=5)
        button_frame.configure(bg='steelblue1')
        
        tk.Button(button_frame, text=" Starten", background='steelblue1', activebackground='steelblue3',  command=self.capture).pack(side='left', padx=4)
        tk.Button(button_frame, text="Stopen", background='steelblue1', activebackground='steelblue3', command=self.stop).pack(side='left', padx=4)
        tk.Button(button_frame, text="Einstellungen", background='steelblue1',activebackground='steelblue3', command=self.set_fenster).pack(side='left', padx=4)
        exit_button = tk.Button(button_frame, text="Beenden", background='steelblue1', activebackground='steelblue3', command=self.close).pack(side='left', padx=4)
        tk.Button(button_frame, text="Info", background='steelblue1', activebackground='steelblue3', command=self.action_get_info_dialog).pack(side='left', padx=4) 

    def capture(self):
        print("Capture")
        camera.start_preview()
        
    def set_fenster(self):
        print("set_fenster")
        self.settings = Settings(self.haupt_fenster)
        
        
    def action_get_info_dialog(self):
        print("action_get_info_dialog")
        camera.stop_preview()
        m_text = "\
************************\n\
Autor: \n\
Date: 31.05.18\n\
Version: 1.03\n\
************************"
        messagebox.showinfo(message=m_text, title = "Infos")
	# messagebox.askyesno(message=m_text, title = "Infos")

    def stop(self):
        print("Stop")
        camera.stop_preview()
        
    def close(self):
        print("Application-Shutdown")
        self.master.destroy()
        camera.stop_preview()
    
def main():
    haupt_fenster = tk.Tk()
    haupt_fenster.title(APP_TITLE)
    haupt_fenster.overrideredirect(True)
    haupt_fenster.geometry("{0}x{1}+0+0".format(haupt_fenster.winfo_screenwidth(), haupt_fenster.winfo_screenheight()))
    #haupt_fenster.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #haupt_fenster.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    
    haupt_fenster.option_add("*highlightThickness", 0)
    haupt_fenster.configure(bg='steelblue1')
    background_image = tk.PhotoImage(file=Hintergrundbild)
    tk.Label(haupt_fenster, image=background_image).place(x=0, y=0)
    
    main_frame = MainFrame(haupt_fenster)
    main_frame.pack(fill='both', expand=False, padx=0, pady=0,)
    main_frame.configure(bg='steelblue1')
    
    haupt_fenster.mainloop()
 
 
if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Streifenhase1: Wo ist denn das Problem mit der Starthilfe die __deets__ gegeben hat? Ich sehe da nirgends das Du das in Deinen Code eingebaut hättest. Wo ist denn das Problem dabei?

Du solltest übrigens bei Gelegenheit den *-Import aus `tkinter` loswerden. Du importierst das doch auch schon mit ``import tkinter as tk`` und nutzt dann mal den einen und mal den anderen Weg um die Objekte aus dem Modul zu verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Ja ok mit dem tkinker schau ich mir an.

Ich weiß nicht so recht wo ich das Overlay im Code einsetz bzw. Wie ich halt die Linie hin bekomme.
Für mich ist es momentan einfacher wenn ich einen Code finde der ähnlich ist wie ich ihn brauche. Kann mich dann besser reindenken.
😯
Bin noch sehr unerfahren was das Programieren angeht
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Streifenhase1: Der Code ist doch so ähnlich wie Du ihn brauchst. Schau was Du davon schon hast. Danach kannst Du dann den einfügen den Du noch nicht hast.

Wobei das kein guter Weg ist sich immer nur Versatzstücke von woanders zu kopieren ohne sie zu verstehen. So funktioniert programmieren nicht, und so lernt man es auch nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Ich habe jetzt diesen Code zum ausprobieren genommen.

Code: Alles auswählen

   import time
import picamera
import numpy as np

# Create an array representing a 1280x720 image of
# a cross through the center of the display. The shape of
# the array must be of the form (height, width, color)
a = np.zeros((720, 1280, 3), dtype=np.uint8)
a[360, :, :] = 0xff
a[:, 640, :] = 0xff

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.framerate = 24
    camera.start_preview()
    # Add the overlay directly into layer 3 with transparency;
    # we can omit the size parameter of add_overlay as the
    # size is the same as the camera's resolution
    o = camera.add_overlay(np.getbuffer(a), layer=3, alpha=64)
    try:
        # Wait indefinitely until the user terminates the script
        while True:
            time.sleep(1)
    finally:
        camera.remove_overlay(o)     
Erhalte aber die Fehlermeldung.

Line12

Attribute Error: Module Objekt Gas no Attribute 'getbuffer'

Jemand ne Idee hab ich was vergessen
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht Fehlermeldungen selbst abschreiben, sondern kopieren. Und zwar in Gaenze. Das macht allen Beteiligten das Leben leichter. Denn du packst da auch noch kraeftig Fehler rein (Gas gibt es nirgendswo in deinem Code. Das soll "has" sein). Und das das Zeile 12 sein soll, kann ich mir kaum vorstellen. Die einzige Zeile, in der getbuffer vorkommt, ist 19!

Welche Version hat numpy? Bitte mal die Ausgabe von

print(np.__version__)

hier posten. Und die Zeile muss am besten direkt nach den import.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Ja du hast natürlich recht mit der Zeile.
Würde den Code kopieren aber der raspberry ist in einer Anlage verbaut und komme da schlecht ran. Würde es am PC machen aber da ich da kein kameramodul habe klappt das da nicht so.

Die Version von numpy ist 1.8.2
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist URALT. Von 2014. Das musst du halt upgraden. Aktuell ist die 1.14, die habe ich, und die hat auch die Funktion.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Streifenhase1: Wo der verbaut ist hat doch keinen Einfluss darauf das man Fehlermeldungen einfach kopiert statt sie abzutippen‽

Wenn `numpy` so alt ist, stellt sich vielleicht die Frage ob Du das System auf dem Raspi nicht generell mal upgraden solltest. Also zumindest wenn die uralte `numpy`-Version aus den Linux-Paketquellen kommt. Auf meinem OSMC-Raspi ist Numpy 1.12.1 aus den Paketquellen installiert. Und das kennt `getbuffer()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Du kannst doch über das Netzwerk auf den Pi Zugreifen. Zb SSH oder VNC Viewer. Da ist doch egal wo der verbaut ist
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Ja leider kann ich es nicht über Netzwerk etc. machen da ich nicht in das Netzwerk gelassen werde bzw. der Raspberry auch nicht ins Netzwerk darf:(

So hab jetzt das Overlay hin bekommen.
Und zwar scheint bei dem Code von PiCamera Docs ein Fehler zu sein.
http://picamera.readthedocs.io/en/relea ... he-preview

Habe Folgende Zeile geändert

Code: Alles auswählen

 
o = camera.add_overlay(np.getbuffer(a), layer=3, alpha=64)


in

o = camera.add_overlay(a.tobytes(), layer=3, alpha=64)
jetzt hab ich somit ein Fadenkreuz. Jetzt stehe ich aber vor weiteren Problemen.


Versuch es mal kurz zu erklären


in Meinem Programm Wird das Kamerabild nur in einem Fenster angezigt und ich möchte das Fadenkreuz nur mittig auf dem Bild haben und nicht über die gesamte breite.

erst habe ich mir Überlegt einfach das Overlay kleiner zu machen aber das Funktioniert nich. Bekomme den Fehler das die größe des Bildes und des Oberlays nicht gleich sind.

Code: Alles auswählen

[Python]
a[360, :, :] = 0xff
a[:, 640, :] = 0xff
[/Python]
dann habe ich es über die werte in dieser Zeile mit den Postionen versucht, Konnte die Linie zwar nach rechts verschieben so das es rechts passen würde aber links halt noch bis zum Bildrand geht.


Bin ich da auf dem Holzweg?


vorerst noch eine letzte Frage

Kann ich auch kreise mit numpy zeichnen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das overlay muss genau so gross sein wie das Kamerabild. Da wird halt nicht automatisch fuer dich skaliert. Aber niemand hindert dich daran, ein genauso grosses Bild zu machen, auf dem du einfach ein kleineres Fadenkreuz malst. Woher kommt denn dein numpy array bisher?
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Streifenhase1: Erklärst Du jetzt tatsächlich Deine uralte Numpy-Version zu einem Fehler in der Dokumentation von PiCamera‽ :shock:
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

@blackjack

Nein das mache ich nicht!

numpy hab ich auf die aktuelle Version gebracht. 1.14.

Dennoch kam der Fehler nach wie vor.

Wenn ich es über ein Bild mach kann ich es dann noch verschieben
Antworten