Page 1 sur 1

[RESOLU] - Prendre une photo rapidement

Posté : ven. 22 avr. 2016 20:19
par vague nerd
Bonjour.

J'essaie de prendre des photos le plus rapidement possible avec les cam officielle/officielle Noir/clone Noir + led IR sur un pi A+.

Après quelques recherches, j'en suis à :

Code : Tout sélectionner

raspistill --nopreview --exposure sports --colfx 128:128 --timeout 1 -w 250 -h 250 -o nom_de_fichier
Cela prend de l'ordre de 0.8s de moyenne.
C'est --nopreview --exposure sports et --timeout 1 qui m'ont permis de passer de 7 secondes à 0.8s.

Avez-vous réussi à obtenir mieux que ça ?
Existe t il autre chose que raspistill, maintenant ?
Cdt.

Re: Prendre une photo rapidement

Posté : sam. 23 avr. 2016 08:20
par guillaume9344
Peut etre une extraction de photos à partir d'un flux video de raspivid?

Re: Prendre une photo rapidement

Posté : sam. 23 avr. 2016 19:12
par vague nerd
Bonne idée.

Je lance un

Code : Tout sélectionner

raspivid -o /run/shm/stream%02d.h264 -fps 30 -g 1 -b 25000000 -sg 1000 -wr 4 -t 0 &
et j'essai de récupérer les dernieres frames avec libav-tools..

Code : Tout sélectionner

avconv -i /run/shm/stream01.h264 s%04d.jpg
Mais je ne sais pas choisir une frame en particulier...
CDt.

Re: Prendre une photo rapidement

Posté : sam. 23 avr. 2016 19:52
par vague nerd

Code : Tout sélectionner

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o - | gst-launch-1.0 fdsrc ! video/x-h264,framerate=25/1,stream-format=byte-stream ! decodebin ! videorate ! video/x-raw,framerate=10/1 ! videoconvert ! jpegenc ! multifilesink location=img_%04d.jpg
2 à 3 fps. Mieux.

Je pige pas :

Code : Tout sélectionner

raspivid -n -t 0 -vf -b 500000 -fps 10 -w 250 -h 250 -o - | gst-launch-1.0 fdsrc ! video/x-h264,framerate=10/1,stream-format=byte-stream ! decodebin ! videorate ! video/x-raw,framerate=10/1 ! videoconvert ! jpegenc ! multifilesink location=img_%04d.jpg
et j’obtiens plein d'images, toutes les 3 secondes !

Code : Tout sélectionner

raspivid -n -t 0 -b 500000 -fps 25 -w 250 -h 250 -o - | gst-launch-1.0 fdsrc ! video/x-h264,framerate=25/1,stream-format=byte-stream ! decodebin ! videorate ! video/x-raw,framerate=25/1 ! videoconvert ! jpegenc ! multifilesink location=img_%04d.jpg
Semble convenir pour mon usage... reste à vérifier la latence.
Merci pour l'idée.

Re: Prendre une photo rapidement

Posté : sam. 23 avr. 2016 20:47
par guillaume9344
De rien , surtout que j avais aucune idée de la facon de la réaliser. :D

Re: Prendre une photo rapidement

Posté : dim. 24 avr. 2016 14:46
par vague nerd
Bon, je confirme que ça marche bien.
surtout que j avais aucune idée de la facon de la réaliser
Ben moi non plus !

Lancement de la génération de jpeg à 25 images par seconde :

Code : Tout sélectionner

raspivid -n -t 0 -b 500000 -fps 25 -w 250 -h 250 -o - | gst-launch-1.0 fdsrc ! video/x-h264,framerate=25/1,stream-format=byte-stream ! decodebin ! videorate ! video/x-raw,framerate=25/1 ! videoconvert ! jpegenc ! multifilesink max-files=100 location=/run/shm/automate/run/img_%02d.jpg &
Ensuite, en python, sélection de l'image la plus récente....

Code : Tout sélectionner

def get_oldest_file(files, _invert=False):
    """ Find and return the oldest file of input file names.
    Only one wins tie. Values based on time distance from present.
    Use of `_invert` inverts logic to make this a youngest routine,
    to be used more clearly via `get_youngest_file`.
    """
    gt = operator.lt if _invert else operator.gt
    # Check for empty list.
    if not files:
        return None
    # Raw epoch distance.
    now = time.time()
    # Select first as arbitrary sentinel file, storing name and age.
    oldest = files[0], now - os.path.getctime(files[0])
    # Iterate over all remaining files.
    for f in files[1:]:
		try:
			age = now - os.path.getctime(f)
		except:
			continue
		if gt(age, oldest[1]):
			# Set new oldest.
			oldest = f, age
    # Return just the name of oldest file.
    return oldest[0]
J'observe une certaine latence, que je n'ai pas mesurée. Pour la baisser : baisser la taille du buffer côté raspivid, et baisser le nombre de fichiers (ici 100) pour que l'algo python de recherche du plus récent soit plus rapide (de l'ordre de 0.15s pour 100 fichiers).

EDIT : pour trouver le fichier le plus recent, un script bash sera surement plus performant...

Cdt.

Re: [RESOLU] - Prendre une photo rapidement

Posté : dim. 24 avr. 2016 17:19
par vague nerd
J'ai tenté en shell :

Code : Tout sélectionner

result = subprocess.check_output('ls -t /run/shm/automate/run/*.jpg 2>/dev/null | head -n1', shell=True)
	#print '\nget_youngest_file_by_script()[' + result.strip('\n') + ']get_youngest_file_by_script()'
	return result.strip('\n')
Mais le pipe me pose probleme
...