[PYTHON] Implementierung von persönlich optimierten Fotorahmen mit Raspberry Pi

Motivation

Lassen Sie uns einen Fotorahmen mit Raspeye implementieren. Fotorahmen ist ein verwendetes Thema in Razzpie ~~ nth Abkochung ~~, aber ich war mit dem herkömmlichen unzufrieden.

Schließlich kann eine sorgfältige Auswahl der Fotos problematisch sein. Zum Beispiel beim Anzeigen von Fotos, die von einem Freund gesendet wurden, oder Fotos von einer Kamera in einem Fotorahmen

・ Wenn Sie sorgfältig auswählen und einlegen, wird es schwierig, oder die Anzahl der Blätter wird gering sein, und Sie werden es bald leid sein, es zu sehen. ・ Wenn Sie im Gegenteil alles hineinschieben, werden fehlerhafte Fotos aufgenommen und ein peinliches Foto angezeigt.

Es gibt ein Dilemma. Um dieses Problem zu lösen, erstellen wir einen Fotorahmen, der die Anzeige von Fotos optimiert.

Wenn der Benutzer mag ・ Überspringen Sie das Foto ・ Reduzieren Sie die Anzeigefrequenz des Fotos ・ Zeigen Sie das Foto nie wieder an

Sie können die Operation ausführen. Die so eingestellte Anzeigefrequenz wird gespeichert und aktualisiert. Mit anderen Worten, das Konzept besteht darin, alle Fotos einzulegen und anzupassen, während Sie sie verwenden.

Der gesamte Quellcode wird am Ende der Seite veröffentlicht. qiita.jpg

Vorbereitung

・ Himbeer-Pi Dieses Mal habe ich Razpai 3 Modell B verwendet, das ich zu Hause hatte. Jede Generation ist akzeptabel.

・ 3,5-Zoll-Display Wird zum Anzeigen von Fotos verwendet. Als ich bei Amazon ungefähr 2000 Yen kaufte, war der Treiber alt und konnte nicht benutzt werden ... Wenn ein Treiber eines anderen Unternehmens installiert ist, wird nur der Bildschirm angezeigt, aber das Touchpanel ist nicht mehr aktiv.

Spezifikation

Wenn Sie nur Fotos anzeigen möchten

fbi image.jpg

Es ist genug. In Anbetracht der Realisierung detaillierter Spezifikationen und der Erweiterbarkeit wie der Zusammenarbeit mit der Außenwelt werde ich diesmal alles in Python schreiben. Wenn Sie mit Bildern umgehen, sind OpenCV usw. wichtig, aber dieses Mal verwenden wir Pygame, ein Modul für Spiele.

Wie für diese Spezifikation ① Bilder automatisch von DropBox erfassen (nicht implementiert) ② Zeigen Sie Bilder im Diashow-Format an ③ Verwenden Sie die Tasten, um Bilder zu überspringen, die Anzeigefrequenz zu verringern und sie nie wieder anzuzeigen. ④ Speichern und aktualisieren Sie die eingestellte Frequenz Wird besorgt. Ich wähle hauptsächlich Pygame für ③.

Automatische Bildaufnahme

Herstellung

Bildschirm

Um das Bild anzuzeigen, müssen Sie zunächst ein Fenster erstellen.


import pygame 
from pygame.locals import *
import sys

pygame.init()
screen =pygame.display.set_mode((400,300))  
pygame.mouse.set_visible(False)
pygame.display.set_caption("Photo")

Initialisieren Sie mit pygame.init () und Geben Sie die Bildschirmgröße mit "display.set_mode ()" an. (Es wird Vollbild angezeigt, indem "FULL SCREEN" als Argument eingefügt wird. Es scheint jedoch besser, dies nicht während des Debuggens zu tun, da es schwierig ist, den Vorgang abzuschließen, wenn im Vollbildmodus ein Fehler auftritt.)

Es ist umständlich, einen Mauszeiger als Fotorahmen zu haben. Löschen Sie ihn daher mit "pygame.mouse.set_visible (False)".


img =pygame.image.load("file.jpg ")
img = pygame.transform.scale(img1,(400,300))
rectimg = img.get_rect()
screen.fill((0,0,0))
screen.blit(img,rect_img)
pygame.display.update()

Dies ist der Darstellungsteil des Bildes. Sie können ein Bild mit image.load laden. Geben Sie die RGB-Hintergrundfarbe mit "screen.fill" an. Diesmal ist es schwarz. Fügen Sie das Bild mit "screen.blit" ein und aktualisieren und zeigen Sie den Bildschirm mit dem letzten "display.update ()" an. Das Bild kann durch den obigen Vorgang angezeigt werden. Lassen Sie uns nun die Diashow implementieren.

Implementierung der Diashow

Was ist eine Diashow? · Messzeit ・ Laden Sie nach einiger Zeit ein neues Bild und zeigen Sie es an

Das ist der Prozess. Speichern Sie daher die Zeit, in der das Bild angezeigt wird.


start_time = pygame.time.get_ticks()

Und während Sie die Schleife von while (1) drehen

time_since_start = pygame.time.get_ticks() - start_time
if time_since_start>10000:
     break 

Es kann realisiert werden durch. Sie können die Zeit mit pygame.time.get_ticks () abrufen und die Einheit ist ms. In diesem Beispiel wird sie alle 10 Sekunden umgeschaltet. (Tatsächlich wird die Ladezeit des Fotos hinzugefügt.)

Bildsprungfunktion

Ermöglicht das Umschalten, ohne 10 Sekunden zu warten. Insbesondere ist es eine Funktion, das nächste Bild anzuzeigen, wenn die Taste gedrückt wird. Da es diesmal keine einfache physische Taste gab, werde ich eine Tastatur anschließen und verwenden.

Auch die Funktion zum Beenden kann nicht so ausgeführt werden, wie sie ist. Wenn ESC gedrückt wird, wird das Programm daher beendet.

for event in pygame.event.get():
     if event.type == KEYDOWN:
          if event.key == K_ESCAPE:
               pygame.quit()  
               sys.exit()
          if event.key == K_z:
               flugloop = False

Zuerst wird das aufgetretene Ereignis in einer Schleife abgerufen, und wenn es sich um einen Tastendruck handelt, wird der Prozess ausgeführt. K_ESCAPE ist der ESC-Schlüssel und K_z ist der z-Schlüssel. Auf diese Weise können Sie das Verhalten implementieren, wenn eine beliebige Taste mit K_a usw. gedrückt wird.

Wenn es sich um die ESC-Taste handelt, wird sie sofort in der if-Anweisung beendet. Wenn die z-Taste gedrückt wird, wird das Sprung-Flag gesetzt und das nächste Bild wird verschoben.

Ändern Sie die Anzeigefrequenz von Bildern

Nachdem Sie eine Diashow haben, können Sie die Verarbeitung für Fotos hinzufügen, die weniger häufig angezeigt werden sollen oder die Sie nicht mehr sehen möchten. In [Bild anzeigen](Bild anzeigen) wurde der Pfad angegeben und gelesen. Der gelesene Teil wird gewichtet und zufällig geändert.

photonum = list(range(1,len(w)+1))
filenum = random.choices(photonum,weight)
filename = str(filenum[0]) + ".jpg "
pygame.image.load(filename)

Benennen Sie das Bild im Voraus mit 1.jpg, 2.jpg usw. Hier ist die zweite Zeile "random.choices" die Funktion, die durch Gewichtung des Zufalls ausgewählt werden kann. photonum ist eine Liste, die 1 zur Anzahl der Blätter enthält weight enthält das Gewicht jedes Bildes als ganzzahligen Wert. Wenn diese beiden an "random.choices" übergeben werden, wird entsprechend ihrem Gewicht aus "photonum" ausgewählt. Dann wird die ausgewählte Bilddatei geladen.

Alles was Sie tun müssen, ist dieses "Gewicht" zu bedienen.

Speichern Sie dieses Mal "Gewicht" in einer Textdatei, die durch Zeilenumbrüche getrennt ist. Außerdem ist der Anfangswert des Gewichts ein ganzzahliger Wert von 10.

data = open('data.txt')
weight =[]
for line in data:
   weight.append(int(line))
data.close()

Dies liest die Gewichte Zeile für Zeile aus "data.txt" und speichert sie in "weight".

Verwenden Sie nun den zuvor veröffentlichten KEYDOWN.

if event.key == K_x:
     flugloop =False
     weight[filenum-1] = 0

In diesem Fall wird das Gewicht auf 0 gesetzt, wenn x gedrückt wird, und das Foto wird nie wieder angezeigt. Durch Verringern auf die gleiche Weise wird die Häufigkeit verringert, mit der das Foto angezeigt wird.

Nun, diese Liste geht natürlich verloren, wenn sie fertig ist. Speichern wir es also, indem wir es in data.txt schreiben. Fügen Sie dem Verhalten des ESC-Schlüssels hinzu.

if event.key == K_ESCAPE
     f = open("data.txt",'w')
     for i in weight:
          f.write(str(i))
          f.write("\n")         
     f.close()
     pygame.quit()  
     sys.exit()

Auf diese Weise werden die Einstellungen beim nächsten Start übernommen.

Ganzer Quellcode

Beispielcode

#photo.py

import pygame
from pygame.locals import *
import sys
import random

def get_image(w=[]):
    photonum = list(range(1,len(w)+1)) 
    filenum = random.choices(photonum,w)  #Bilder nach dem Zufallsprinzip extrahieren
    filename = str(filenum[0]) + ".jpg "
    return pygame.image.load(filename).convert_alpha(),filenum[0]  #Der Rückgabewert ist das Bild und seine ID


def main():

    
    data = open('data.txt')  #Gewichte laden
    weight =[]
    for line in data:
        weight.append(int(line))
   
    data.close()

    while(1):#Zeigen Sie ein Bild an
        pygame.init()
        screen =pygame.display.set_mode((400,300),FULLSCREEN)  
        pygame.mouse.set_visible(0)
        pygame.display.set_caption("test")
        x=get_image(weight)
        img1 = x[0]
        filenum = x[1]
        img2 = pygame.transform.scale(img1,(400,300))
        rect_img2 = img2.get_rect()
        screen.fill((0,0,0))
        screen.blit(img2,rect_img2)  #Bildschirm
        pygame.display.update()   #Bildschirmaktualisierung
        start_time = pygame.time.get_ticks()  #Startzeitmessung
        flugloop = True

        
        while(1):  #Schleife zum Akzeptieren von Operationen
            time_since_start = pygame.time.get_ticks() - start_time  #Zeitmessung
            if time_since_start>10000:  #Pause nach 10 Sekunden,Zur nächsten Bildanzeige
                break
            if flugloop ==False:  #Pause, wenn markiert,Zur nächsten Bildanzeige
                break

            for event in pygame.event.get():  #Empfang des Betriebs
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
            
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:  #Wenn esc gedrückt wird
                        f = open("data.txt",'w')  #Anzeigefrequenz speichern
                        for i in weight:
                            f.write(str(i))
                            f.write("\n")
                                    
                        f.close()
                        pygame.quit()  #Das Ende des Programms
                        sys.exit()
                    if event.key == K_SPACE: #Wenn Sie die Leertaste drücken, reduzieren Sie das Gewicht und fahren Sie mit dem nächsten Bild fort
                        flugloop = False
                        if weight[filenum-1] >3:
                            weight[filenum-1] -=1
                    
                    if event.key == K_x:   #Wenn die x-Taste gedrückt wird, wird das Gewicht auf 0 gesetzt und nie wieder angezeigt.
                        flugloop =False
                        weight[filenum-1] = 0
                    
                    if event.key == K_z:
                        flugloop =False
                        
main() 
   

Zukünftige Erweiterbarkeit

Implementierung der automatischen Fotoaddition von DropBox. Installation von physischen Tasten. Wenn Sie eine Webcam verwenden, um das Gewicht der Fotos, auf die Sie besonders achten, zu erhöhen und sie gut anzuzeigen, ist es einfacher, das Gewicht der Anzeigefrequenz anzupassen.

Recommended Posts