[PYTHON] Mettre en œuvre des cadres photo optimisés personnellement avec Raspberry Pi

Motivation

Implémentons un cadre photo avec Raspeye. Le cadre photo est un thème utilisé dans Razzpie ~~ nième décoction ~~, mais je n'étais pas satisfait du thème conventionnel.

Après tout, une sélection rigoureuse des photos peut être un problème. Par exemple, lors de l'affichage de photos envoyées par un ami ou de photos d'un appareil photo dans un cadre photo

・ Si vous sélectionnez et insérez avec soin, ce sera difficile ou le nombre de feuilles sera petit et vous serez bientôt fatigué de le voir ・ Au contraire, si vous insérez tout, des photos erronées seront prises et une photo embarrassante sera affichée.

Il y a un dilemme. Pour résoudre ce problème, nous allons créer un cadre photo qui optimise l'affichage des photos.

Quand l'utilisateur aime ・ Passer la photo ・ Réduisez la fréquence d'affichage de la photo ・ Ne plus afficher la photo

Vous pouvez effectuer l'opération. La fréquence d'affichage ainsi réglée est enregistrée et mise à jour. En d'autres termes, le concept est de mettre toutes les photos et de les ajuster au fur et à mesure que vous les utilisez.

L'ensemble du code source est affiché en bas de page. qiita.jpg

Préparation

· Tarte aux framboises Cette fois, j'ai utilisé le Razpai 3 modèle B que j'avais chez moi. Toute génération est acceptable.

・ Écran 3,5 pouces Utilisé pour afficher des photos. Si j'achète environ 2000 yens sur Amazon, le pilote est ancien et ne peut pas être utilisé ... Lorsqu'un pilote fabriqué par une autre société est installé, seul l'écran s'affiche, mais le panneau tactile est mort.

spécification

Si vous souhaitez simplement afficher des photos

fbi image.jpg

C'est assez. Cependant, compte tenu de la réalisation de spécifications détaillées et de l'évolutivité telles que la coopération avec l'extérieur, j'écrirai tout en python cette fois. Si vous manipulez des images, OpenCV etc. est majeur, mais cette fois nous utiliserons pygame qui est un module pour les jeux.

Quant à cette spécification ① Acquérir automatiquement des images de DropBox (non implémenté) ② Afficher les images au format diaporama ③ Utilisez les boutons pour sauter des images, réduire la fréquence d'affichage, ne jamais les afficher, etc. ④ Enregistrez et mettez à jour la fréquence ajustée ça ira. Je sélectionne principalement pygame pour ③.

Acquisition d'image automatique

fabrication

Affichage de l'image

Pour afficher l'image, vous devez commencer par créer une fenêtre.


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")

Initialisez avec pygame.init () et Spécifiez la taille de l'écran avec display.set_mode (). (Il sera en plein écran en insérant FULL SCREEN comme argument, mais il semble préférable de ne pas le faire pendant le débogage car il sera difficile de terminer s'il y a un bogue en plein écran.)

Il est gênant d'avoir un curseur de souris comme cadre photo, alors supprimez-le avec 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()

Il s'agit de la partie représentation de l'image. Vous pouvez charger une image avec ʻimage.load. Spécifiez la couleur d'arrière-plan RVB avec screen.fill. Cette fois, c'est noir. Collez l'image avec screen.blit et mettez à jour et affichez l'écran avec le dernier display.update ()`. L'image peut être affichée par l'opération ci-dessus. Maintenant, implémentons le diaporama.

Mise en œuvre du diaporama

Qu'est-ce qu'un diaporama? ・ Mesurer le temps ・ Charger et afficher une nouvelle image après un laps de temps

Voilà le processus. Par conséquent, enregistrez l'heure d'affichage de l'image.


start_time = pygame.time.get_ticks()

Et en tournant la boucle de while (1)

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

Cela peut être réalisé par. Vous pouvez obtenir l'heure avec pygame.time.get_ticks () et l'unité est la ms, donc dans cet exemple, elle changera toutes les 10 secondes. (En fait, le temps de chargement de la photo est ajouté.)

Fonction de saut d'image

Vous permet de changer sans attendre 10 secondes. Plus précisément, c'est une fonction pour afficher l'image suivante lorsque le bouton est enfoncé. Comme il n'y avait pas de bouton physique facile cette fois, je vais me connecter et utiliser un clavier.

De plus, la fonction pour y mettre fin ne peut pas être exécutée telle quelle. Par conséquent, lorsque vous appuyez sur ESC, le programme se termine.

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

Tout d'abord, l'événement qui s'est produit est extrait dans une boucle, et s'il s'agit d'une pression sur une touche, le processus est exécuté. K_ESCAPE est la touche ESC et K_z est la touche z. De cette façon, vous pouvez implémenter le comportement lorsqu'une touche est enfoncée avec K_a etc.

S'il s'agit de la touche ESC, elle se terminera immédiatement par l'instruction if, si la touche z est enfoncée, l'indicateur de saut sera défini et l'image suivante sera déplacée vers.

Changer la fréquence d'affichage des images

Maintenant que vous disposez d'un diaporama, vous pouvez ajouter un traitement pour les photos que vous souhaitez afficher moins fréquemment ou que vous ne souhaitez pas revoir. Dans [Afficher l'image](#Display image), le chemin a été spécifié et lu. La partie lue est pondérée et modifiée aléatoirement.

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

Nommez l'image 1.jpg, 2.jpg, etc. à l'avance. Ici, la deuxième ligne «random.choices» est la fonction à sélectionner par pondération aléatoire. photonum est une liste contenant 1 au nombre de feuilles «weight» contient le poids de chaque image sous forme de valeur entière. En passant ces deux à "random.choices", il choisira parmi "photonum" en fonction de son poids. Ensuite, le fichier image sélectionné est chargé.

Tout ce que vous avez à faire est d'utiliser ce "poids".

Cette fois, enregistrez "weight" dans un fichier texte séparé par des sauts de ligne. De plus, la valeur initiale du poids est une valeur entière de 10.

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

Cela lira les poids ligne par ligne de data.txt et les stockera dans weight.

Maintenant, en utilisant le KEYDOWN sorti plus tôt,

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

Si tel est le cas, le poids sera réglé sur 0 lorsque vous appuyez sur x et la photo ne sera plus jamais affichée. Une décrémentation de la même manière réduira la fréquence d'affichage de la photo.

Eh bien, cette liste sera bien sûr perdue une fois terminée. Alors sauvegardons-le en l'écrivant dans data.txt. Ajoutez au comportement de la touche ESC.

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()

En faisant cela, les paramètres seront hérités au prochain démarrage.

Code source complet

Exemple de code

#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)  #Extraire des images au hasard
    filename = str(filenum[0]) + ".jpg "
    return pygame.image.load(filename).convert_alpha(),filenum[0]  #La valeur de retour est l'image et son ID


def main():

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

    while(1):#Afficher une image
        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)  #Affichage de l'image
        pygame.display.update()   #Mise à jour de l'écran
        start_time = pygame.time.get_ticks()  #Mesure de l'heure de début
        flugloop = True

        
        while(1):  #Boucle pour accepter les opérations
            time_since_start = pygame.time.get_ticks() - start_time  #Mesure du temps
            if time_since_start>10000:  #Pause après 10 secondes,Vers l'affichage d'image suivant
                break
            if flugloop ==False:  #Pause si signalé,Vers l'affichage d'image suivant
                break

            for event in pygame.event.get():  #Réception d'opération
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
            
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:  #Lorsque esc est pressé
                        f = open("data.txt",'w')  #Enregistrer la fréquence d'affichage
                        for i in weight:
                            f.write(str(i))
                            f.write("\n")
                                    
                        f.close()
                        pygame.quit()  #La fin du programme
                        sys.exit()
                    if event.key == K_SPACE: #Lorsque vous appuyez sur la touche espace, réduisez le poids et passez à l'image suivante
                        flugloop = False
                        if weight[filenum-1] >3:
                            weight[filenum-1] -=1
                    
                    if event.key == K_x:   #Lorsque vous appuyez sur la touche x, le poids est mis à 0 et ne s'affiche plus jamais.
                        flugloop =False
                        weight[filenum-1] = 0
                    
                    if event.key == K_z:
                        flugloop =False
                        
main() 
   

Évolutivité future

Implémentation de l'ajout automatique de photos depuis DropBox. Installation de boutons physiques. Si vous utilisez une webcam pour augmenter le poids des photos auxquelles vous faites très attention et bien les afficher, il sera plus facile d'ajuster le poids de la fréquence d'affichage.

Recommended Posts