Page 1 sur 1

Installation Vidéo (Picamera and PNG sequence Overlays)

Posté : ven. 26 avr. 2019 13:54
par St3m4t
Bonjour,

Je me permet de vous demander votre aide car j'essaie depuis un moment de créer un programme. Je ne sais pas si cela est complique car je n'ai aucune connaissance en programmation alors je vais vous faire un résumé juste apres avoir exposé mon projet. (Je tiens à preciser que ceci est mon premier poste de toute ma vie)

Je suis Scénographe et artiste et j'aimerai créer ma première installation vidéo grâce au Raspberry Pi.

Je possède :
-Un " ABOX Raspberry Pi 3 Modèle B Plus (3 B+) Starter Kit [ Version Dernière ] 32 Go Classe 10 SanDisk Micro SD Carte, 5V 3A Alimentation Interrupteur Marche/Arrêt Boîtier Noir"
-Raspberry Pi Noir Module 2.1 Appareil Photo 8 MP 1080p
-une webcam USB standard
-Un kit de composant Electronique issue de mon passage en école d'art ...

Bref voici l’installation que je voudrais réaliser :

Sur un écran 1920*1080 je veux combiner plusieurs image :

1_Webcam ou picamera en temps réel
2_vidéos avec couche alpha autrement dit une transparence qui varie selon la vidéo ( 2 vidéos )
3_Cache noir car les vidéos ne seront pas au format 16/9

voici en images la composition :

Image
Image

le programme doit se lancer directement en plein écran et s’exécuter au démarrage du Pi. J'ai pensé aussi installer un petit bouton pour allumer et éteindre le dispositif ou alors démarrer et teindre le pi à une heure précise.

J'ai cependant une inquiétude concernant l'utilisation intensive et la chaleur du processeur car la vidéo devra tourné 8/jours jours par semaine durant 3 mois

Voila vous en savez plus sur le projet.

En ce qui concerne mes tentatives:

1er tentative avec la webcam ( je ne possédai pas encore la Picamera)

J'ai fait un script python avec Pygame :

Code : Tout sélectionner

import sys
import pygame
import pygame.camera
from pygame.locals import *

DEVICE = '/dev/video0'
pygame.init()
pygame.camera.init()
screen = pygame.display.set_mode((576,464))

cam = pygame.camera.Camera("/dev/video0", (640,480))
cam.start()

miroir = pygame.image.load("//home/pi/Images/La belle est la bete cocteau/La Bella E La Bestia (Jean Cocteau 1946).01_00000.png")

while 1:
    image= cam.get_image()
    screen.blit(image,(-32,-8))
    screen.blit(miroir,(0,0))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
cela fonctionne mais je n'ai pas réussi a mettre une vidéo car d’après ce que j'ai lu Pygame n'est pas un AS de la vidéo. Cela m'a toutefois permis de comprendre un peu les base de la programation.

Ensuite je me suis tourné vers les sprites de pygame pour lire une séquence d'image PNG comme si il s'agissait d'un personnage de jeux vidéo. J'ai donc declanché la lecture de la vidéo meme si le peronnage ne bouge pas ( suppression des commande clavier) :

Code : Tout sélectionner

import glob
import sys
import pygame
import pygame.camera
from pygame.locals import *

h=464
w=576

Screen = pygame.display.set_mode((w,h))

clock= pygame.time.Clock()

class player:
    def __init__(self) :
        self.x = 0
        self.y = 0
        self.ani_speed_init=120
        self.ani_speed=self.ani_speed_init
        self.ani = glob.glob("/home/pi/Images/La belle est la bete cocteau/La Bella E La Bestia (Jean Cocteau 1946).01_0000*.png")
        self.ani.sort()
        self.ani_pos=0
        self.ani_max = len(self.ani)-1
        self.img = pygame.image.load(self.ani[0])
        self.update(0)
        
    def update(self, pos):
        if pos !=0:
            self.ani_speed-=1
            self.x+=pos
            if self.ani_speed == 0:
                self.img = pygame.image.load(self.ani[self.ani_pos])
                self.ani_speed = self.ani_speed_init
                if self.ani_pos == self.ani_max:
                    self.ani_pos = 0
                else:
                    self.ani_pos+=1
        Screen.blit(self.img,(self.x,self.y))

player1 = player()
pos = 0

while 1:
    Screen.fill((0,0,0))
    clock.tick(60)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == KEYDOWN and event.key == K_RIGHT:
                pos = 1
        elif event.type == KEYUP and event.key == K_RIGHT:
                pos = 0
        elif event.type == KEYDOWN and event.key == K_LEFT:
                pos = -1
        elif event.type == KEYUP and event.key == K_LEFT:
                pos = 0    
    player1.update(pos)
    pygame.display.update()
A ce stade j’étais très content de moi et je voulais simplement enlever le" player1" pour lire la vidéo et changer la webcam par la Picamera (recu entre temps) mais PYGAME ET PICAMERA ne font pas bon ménage donc retour à la case départ.
Pour info je préfère utiliser la PICAMERA car ma webcam ne sort pas en FullHD ( j'ai aussi essayer un scale de la camera mais l'image de camera n'ettait plus en temp reel il y avait de gros LAG)

Code : Tout sélectionner

import sys
import glob
import pygame
import pygame.camera
import picamera
from pygame.locals import *

screenX = 1340
screenY = 1080



pygame.init()
pygame.camera.init()
screen = pygame.display.set_mode((screenX,screenY))
clock= pygame.time.Clock()



camera = picamera.PiCamera()
camera.start_preview()
sleep(0.5)
camerastop_preview()


class player:
    def __init__(self) :
        self.x = 0
        self.y = 0
        self.ani_speed_init=1
        self.ani_speed=self.ani_speed_init
        self.ani = glob.glob("/home/pi/Images/La_et_la_bete_2/La_belle_et_la_bete_00*.png")
        
        self.ani.sort()
        self.ani_pos=0
        self.ani_max = len(self.ani)-1
        self.img = pygame.image.load(self.ani[0])
        self.update(0)
        
    def update(self, pos):
        if pos !=1:
            self.ani_speed-=1
            self.x+=pos
            if self.ani_speed == 0:
                self.img = pygame.image.load(self.ani[self.ani_pos])
                self.ani_speed = self.ani_speed_init
                if self.ani_pos == self.ani_max:
                    self.ani_pos = 0
                else:
                    self.ani_pos+=1
        screen.blit(self.img,(self.x,self.y))
       
player1 = player()
pos = 0

while 1:
    clock.tick(120)
    player1.update(pos)
    image= camera.get_image()
    picture = pygame.transform.scale(image, (1280, 960))
    pygame.display.update()
    screen.blit(picture,(0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
Le résultat de ce script est la Picamera en Grand que je n'arrive pas à quitter

Je me suis alors tourné vers la PICAMERA mais je ne sais pas et je bloque car je n'arrive pas à lire la sequence PNG :

Code : Tout sélectionner

import picamera
from PIL import Image
from time import sleep

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.framerate = 24
    camera.start_preview()

    # Load the arbitrarily sized image
    img = Image.open('/home/pi/Images/cache_cocteau_V2.png')
    # Create an image padded to the required size with
    # mode 'RGB'
    width = ((img.size[0] + 31) // 32) * 32
    height = ((img.size[1] + 15) // 16) * 16
    print("pad size",width,height)
    pad = Image.new('RGBA', (width,height))
    # Paste the original image into the padded one
    pad.paste(img, (0, 0))
    print("img size",img.size)
    # Add the overlay with the padded image as the source,
    # but the original image's dimensions
    #b = img.tobytes('rgba')    
    b = pad.tobytes()
    o = camera.add_overlay(b, size=img.size)
    print(camera)
    # By default, the overlay is in layer 0, beneath the
    # preview (which defaults to layer 2). Here we make
    # the new overlay semi-transparent, then move it above
    # the preview
    #o.alpha = 128
    o.layer = 3

    # Wait indefinitely until the user terminates the script
    while True:
        sleep(1)
Le dernier code est un copier collé ( juste mis une de mes image de sequence PNG) mais je ne reconnais pas l'architecture des codes que j'avais pu écrire auparavant et je suis perdu.


J'espere que vous allez pouvoir m'aider ou me conseiller. Une chose très compliqué quand j'ai debuté ( il y a 3 mois) c'est la quantité d'approche toutes aussi differentes les unes des autres ( je vous épargne mes deboire OPENCV que je n'ai meme pas reussi à installer et encore moins à utiliser)

Je vous remercie de m'avoir lu jusque la et merci d'avance pour votre aide qui va me sera très précieuse....

PS : J'ai déjà appris beaucoup et espère apprendre encore