Bild von der Pi Kamera beschriften

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
ansem
User
Beiträge: 3
Registriert: Donnerstag 11. Februar 2016, 12:48

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Ich lass das direkt vom ``picamera`` Modul machen:
http://picamera.readthedocs.org/en/rele ... the-output
ansem
User
Beiträge: 3
Registriert: Donnerstag 11. Februar 2016, 12:48

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.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

mach doch ne funktion draus und übergib das s in den argumenten mit.

funktioniert dein script auch mit anderen webcam devices?
empty Sig
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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.
ansem
User
Beiträge: 3
Registriert: Donnerstag 11. Februar 2016, 12:48

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. :)
Antworten