Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

[Help] Compte a rebour sur image de camera (Raspberry Pi 3B+)
#1

Bonjour,
Dans le cadre du projet (un pibooth modifiable) ou j'ai déjà eu de l'aide, je me heurte a un nouveau problème.

Lors de la prise de vue, je veux qu'il s'affiche la camera en direct avec par dessus un compte à rebours avant le déclenchement de la prise de vue.

J'ai réussi à afficher en direct ce que la camera filme.
J'ai créer le compte a rebours.
mais voila quand je lance le programme, j'ai un délais de rafraichissement de la camera de 2s environ
qqu''un aurais une solution pour réduire le LAG ?


Python
#coding:utf-8
 
# Les librairies
import sys
import pygame
import pygame.camera
import time
 
 
 
#les constantes
largeur_ecran=800
hauteur_ecran=600
nom_fonte_acc ="fonts/aAtos.ttf" # Nom de la fonte utilisée
largeur_compte=800 # Largeur de l'image de la camera
hauteur_compte=600 # Hauteur de l'image de la camera
taille_compte=200 # Taille du chiffre du compre a rebour
texte_compte=5 # Temps du compte a rebour
couleur_texte_compte=[255,255,255] # Couleur du chiffre du compre a rebour
pos_texte_compte=[(largeur_compte/2)-(taille_compte/10),(hauteur_compte/2)-(taille_compte/4)]
pos_texte_compte_fin=[0,(hauteur_compte/2)-(taille_compte/4)]
 
# Les variables
texte_compte_aff=texte_compte
 
# Initialisation de pygame et de la camera
pygame.init()
pygame.camera.init()
 
 
# definitione de la taille de la surface et de l'affichage de la camera
windows_surface = pygame.display.set_mode((largeur_ecran,hauteur_ecran),0)
cam_list = pygame.camera.list_cameras()
cam = pygame.camera.Camera(cam_list[0],(largeur_compte,hauteur_compte))
cam.start()
 
# Fonte du compte a rebour, la meme que celle de la page d'accueil
acceuil_fonte = pygame.font.Font(nom_fonte_acc, taille_compte)
 
 
 
launched = True
while launched :
	for event in pygame.event.get() :
		if event.type == pygame.QUIT :
			launched = False
		image1 = cam.get_image()
		image1 = pygame.transform.scale(image1,(largeur_compte-20,hauteur_compte-20))
		windows_surface.blit(image1,(10,10))
		pygame.display.update()
 
# corp du programme ------------------------------------------------------------------------------------------------------------
 
# Texte a afficher
		if texte_compte_aff == 0:
			texte_cpt="Souriez"
		else:
			texte_cpt=str(texte_compte_aff)
 
# Mise en page du texte a afficher
		texte_cpt = acceuil_fonte.render(texte_cpt, True, couleur_texte_compte)
 
 
# Affichage du texte
		if texte_compte_aff == 0:
			windows_surface.blit(texte_cpt, pos_texte_compte_fin )
		else:
			windows_surface.blit(texte_cpt, pos_texte_compte )
 
 
 
# mise a jour de l affichage
		pygame.display.flip()
 
# Compte a rebour
		texte_compte_aff -=1
 
		time.sleep(1)


Si cela intéresse des personnes, j'ai fait un petit site sur l'avancement des mes projets en cours.
Si vous passez et que vous voulez laisser une contribution (intellectuelle)...

https://kiffkizz.wixsite.com/mesprojets/pibooth
Répondre
#2

Bonjour,

Il y a un petit truc qui me gêne : ta temporisation est toujours lancée, non ? Si je réduis très fortement ton code:
Python
while launched :
    for event in pygame.event.get() :
        texte_compte_aff -=1
        time.sleep(1)



Je pense que ta partie compte à rebours devrait être sur un event type très particulier, plutôt que "tous sauf quit" ?
Répondre
#3

Bonjour,

J'ai été faire un petit tour sur ton site, intéressant et instructif.
Bon soyons clair, le pyton c'est pas mon truc mais il y a quelque chose qui me chagrine un peu.
Tu expliques qu'il faut sélectionner remote gpio actif dans le configurateur. Je bosse pas mal sur le gpio (voir mes articles sur les librairies rxb6 dans domotique) mais le remote gpio n'est qu'une interface qui permet l'accès à distance avec la librairie pigpio, de plus activer le remote, ça bloque la librairie.

Pourquoi n'utilises tu pas la librairie en direct sans le remote ? de cette manière tu pourrais déclarer une de tes fonctions comme destination d'un event et traiter l’appuie sur un bouton en temps réel.

Si je ne suis pas clair, n'hésite pas à me demander Smile

pour résumer, tu déclares une fonction de traitement d'appuie sur le bouton
tu déclares cette fonction comme destination de la détection d’événement de la librairie pour le port gpio concerné.
Dès qu'un bouton est appuyé, ta fonction est appelée avec le numéro de bouton et son statu, appuyé/relâché.
ça me semble plus efficace et moins chronophage.

amitié
Olivier Coquet

Développements en:
C/C++/Gambas Basic/PHP - auto-entrepreneur toujours en recherche de clients (même petits Smile )
LIBRXB6 est une suite de librairies partagées gratuites sur Raspberry développées dans le cadre de projets commerciaux 
O.Coquet et Gambas Garden Factory
Répondre
#4

CrazyCat : Je ne sait pas encore ce qu'est un event mais je vais me renseigner.

ocoquet : Comme tu la vu le python je découvre mais aussi le Raspeberry (je ne m'en servais que pour Octoprint) et donc je me base a chaque fois sur ce que je trouve sur internet et donc pas forcement optimisé donc je prend tout conseil.
Même si je ne comprend pas tout pour le moment je vais me pencher dessus.

Merci pour ces reponses.
Répondre
#5

Alors qu'est-ce qu'un "event" en Français un événement ?

En fait, la librairie pigpio scan en permanence les ports gpio, si un port change d'état de 0v à 3.3v par exemple, elle déclenche un événement, si tu vas regarder à cette adresse: pigpio, tu verras que tu peux demander à la librairie d'appeler une fonction de ton programme à chaque fois qu'un événement se déclenche sur le port que tu as sélectionné. Ça te permet de ne pas examiner ce port en permanence dans ton programme mais de traiter le changement d'état (bouton pressé) au moment ou il survient.

Je te conseille de farfouiller dans la librairie (adresse plus haut) et de regarder, il y a des fonctions intéressantes pour éliminer le bruit (les parasites) et les rebonds (petits parasites au moment ou on presse sur le bouton).

en résumé:

1 port gpio 27 à 0v
2 on presse le bouton
3 port gpio 27 passe à 3.3v
4 la librairie le détecte et appelle ta fonction
5 ta fonction traite l'information et génère une action (lancement de la vidéo par exemple)
6 et puis la librairie repasse en attente.

J'ai choisi le port 27 mais ça peut être n'importe lequel voir même plusieurs.
Et pour info, la librairie peut détecter une impulsion de quelques micro-secondes (millionièmes) donc rapide et efficace.

Et n'hésite pas à poser des questions si tu ne comprends pas quelque chose.
Amitié
Olivier Coquet

Développements en:
C/C++/Gambas Basic/PHP - auto-entrepreneur toujours en recherche de clients (même petits Smile )
LIBRXB6 est une suite de librairies partagées gratuites sur Raspberry développées dans le cadre de projets commerciaux 
O.Coquet et Gambas Garden Factory
Répondre
#6

effectivement cette librairie à l'air bien pratique.
Je vais me munir de mon dico d'anglais, un bon litre de café et je vais regarder
Thk
Répondre
#7

(21-03-2021, 16:12:54)kiffkizz a écrit :  effectivement cette librairie à l'air bien pratique.
Je vais me munir de mon dico d'anglais, un bon litre de café et je vais regarder
Thk
Je commence à la connaitre par cœur donc, n'hésite pas a demander, par contre, python et moi ça fait deux donc........

Amitié
Olivier Coquet

Développements en:
C/C++/Gambas Basic/PHP - auto-entrepreneur toujours en recherche de clients (même petits Smile )
LIBRXB6 est une suite de librairies partagées gratuites sur Raspberry développées dans le cadre de projets commerciaux 
O.Coquet et Gambas Garden Factory
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)