Seite 1 von 1

Bild von der Pi Kamera beschriften

Verfasst: Donnerstag 11. Februar 2016, 13:09
von ansem
Hallo liebe Mitglieder des Python Forums,
ich habe am Montag damit begonnen mich in Python einzulesen und bin daher ziemlich schlecht und fühle mich bei der mir gestellten Aufgabe schlichtweg überfordert, daher hoffe ich dass ihr mir helfen könnt.

Die Aufgabe an sich ist es über Python mit einem Raspberry Pi 2 und der dazugehörigen Kamera folgendes zu bewerkstelligen:

1. Erstellen eines Fotos
2. Eingabe von 8 Parametern in eine Maske welche anschließend am unteren Rand des Fotos erscheinen.
3. Speichern der Bilder in numerischer Reihenfolge (image1,image2,image3,...)

Das Erstellen des Bildes an sich stellt kein Problem dar aber alles was danach kommt...zur 2. Aufgabenstellung konnte ich über eine Internetsuche folgenden Code finden(netzmafia.de):

Code: Alles auswählen

import picamera
import time
import pygame

# Voreinstellungen
WIDTH=1280
HEIGHT=1024
FONTSIZE=50

# Kamera initialisieren
camera = picamera.PiCamera()
camera.vflip = False
camera.hflip = False
camera.brightness = 60

# Bildschirmfenster aufbauen, Hintergrund schwarz, Schrift weiss
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
black = pygame.Color(0, 0, 0)
textcol = pygame.Color(255, 255, 0)
screen.fill(black)

while True:
    # Bild machen, als GIF speichern, gleiche Größe wie Fenster
    camera.start_preview()
    sleep(1)
    camera.capture('image.gif', format='gif', resize=(WIDTH,HEIGHT))
    camera.stop_preview()

    # altes Bild löschen
    screen.fill(black)
    pygame.display.update()    

    # Bild einlesen und anzeigen
    img = pygame.image.load('image.gif')
    screen.blit(img, (0, 0))

    # Datum und Uhrzeit darüber legen
    font = pygame.font.Font('freesansbold.ttf', FONTSIZE)
    text = time.strftime("%d.%m.%Y um %H:%M:%S Uhr")
    font_surf = font.render(text, True, textcol)
    font_rect = font_surf.get_rect()
    font_rect.left = 100
    font_rect.top = 100
    screen.blit(font_surf, font_rect)
    pygame.display.update()

    # etwas warten
    sleep(5)

# aus die Maus
camera.close()
pygame.quit()


Leider gibt mir das Skript nur einen schwarzen Bildschirm aus und speichert ein unbeschriebenes .gif, sobald ich hier aber das Bild als .jpg ausgeben will hängt sich Python bei dem Versuch das Programm abzubrechen auf, woran liegt das ?

Mein Wunsch ist es nun auch noch 6 weitere Parameter (neben Datum und Uhrzeit) auf dem Bild festzuhalten, die ich vorher über eine entry-Eingabe wie im folgenden Beispiel erlange:

Code: Alles auswählen

from tkinter import *

def show_entry_fields():
   print("A: %s\nB: %s" % (e1.get(), e2.get()))

master = Tk()
Label(master, text="A").grid(row=0)
Label(master, text="B").grid(row=1)

e1 = Entry(master)
e2 = Entry(master)

e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4)
Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4)

mainloop( )


Wie kann ich nun realisieren dass dies alles über ein Programm geschieht ? Ich habe die Themen hier im Forum bereits durchgesehen und nicht das gefunden wonach ich gesucht habe, das gleiche Spiel bei Google. Vielleicht suche ich einfach nach den falschen Begriffen, wie gesagt bin noch recht neu was Python angeht.

Bin für jeglichen Tipp oder Hilfestellung zur Lösung meines Problems mehr als dankbar.

Re: Bild von der Pi Kamera beschriften

Verfasst: Donnerstag 11. Februar 2016, 14:42
von Dav1d
Anstatt das mit PyGame zu machen würde ich mir PIL/Pillow anschauen, es sollte möglich sein Text direkt auf ein Bild zu schreiben, im schlimmsten Fall muss man den Text erstellen und dann übers Bild blenden (gibt Methoden/Funktionen für alle diese Funktionen, Image/ImageDraw/ImageFont).

Generell ist auch png das bevorzugte Format für Bilder, nicht gif.

Edit: Sieht so aus als war ich schon auf dem richtigen Weg

Re: Bild von der Pi Kamera beschriften

Verfasst: Donnerstag 11. Februar 2016, 15:27
von lackschuh
Ich lass das direkt vom ``picamera`` Modul machen:
http://picamera.readthedocs.org/en/rele ... the-output

Re: Bild von der Pi Kamera beschriften

Verfasst: Freitag 12. Februar 2016, 08:07
von ansem
Vielen Dank erstmal für die Antworten, hat mich schon ein gutes Stück weiter gebracht :)

Mir gefällt der Code hier sehr gut und er macht auch was er soll:

Code: Alles auswählen

import picamera
import time
import itertools

s = "This message would be far too long to display normally..."

with picamera.PiCamera() as camera:
    camera.resolution = (640, 480)
    camera.framerate = 24
    camera.start_preview()
    camera.annotate_text = ' ' * 31
    for c in itertools.cycle(s):
        camera.annotate_text = camera.annotate_text[1:31] + c
        time.sleep(0.1)


Wie kann ich jetzt realisieren dass ich in Schritt 1 eine Eingabe über eine Entrymaske mache, und diese mir dann als das s hier mit diesem Programmcode angezeigt wird ?

Ich möchte quasi umgehen dass der Benutzer etwas innerhalb des Codes ändern muss sondern einfach in ein Fenster die Eingaben macht die dann auf dem Bild erscheinen.

Re: Bild von der Pi Kamera beschriften

Verfasst: Samstag 13. Februar 2016, 11:07
von harryberlin
mach doch ne funktion draus und übergib das s in den argumenten mit.

funktioniert dein script auch mit anderen webcam devices?

Re: Bild von der Pi Kamera beschriften

Verfasst: Samstag 13. Februar 2016, 15:00
von __deets__
@harryberlin PiCamera ist exklusiv fuer die PI-Camera, weil die speziell eingebunden ist - aufgrund der Hardware-Beschleunigung.

@ansem: es gibt viele Moeglichkeiten, das zu erreichen. Gui-Programmierung ist allerdings ein fortgeschrittenes Thema. Einfacher fuer viele Leute ist eine Webanwendung, da waere bei dir ein simples bottle-Skript mit HTML-Formular wie zB hier http://bottlepy.org/docs/dev/tutorial.h ... st-methods zu empfehlen.

Re: Bild von der Pi Kamera beschriften

Verfasst: Montag 15. Februar 2016, 08:45
von ansem
Danke für die Antworten, hab aber keine Ahnung davon wie ich das eine oder das andere auch nur im entferntesten realisieren soll. Werde es jetzt einfach so lassen. :)