Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nom des fichiers images #98

Closed
rian44s opened this issue Feb 21, 2024 · 8 comments · Fixed by #107 or #108
Closed

nom des fichiers images #98

rian44s opened this issue Feb 21, 2024 · 8 comments · Fixed by #107 or #108
Assignees
Labels
feature request User requests a new feature to be implemented help wanted

Comments

@rian44s
Copy link

rian44s commented Feb 21, 2024

Bonjour Antoine,

Lorsque j'utilise le block crappy.blocks.Camera('CameraGstreamer'), le nom utilisé automatiquement pour l'enregistrement des images est quelque chose comme:
(%i_%f, nb_image,t(s))

serait-il possible d'avoir quelque chose comme:

(image_%4.4d, nb_image), e.g. image_0001.tiff
afin d'avoir un padding de zero devant les numéros images et enlever le temps. C'est problématique pour nos routines de corrélation d'image.

Par ailleurs ou puis-je trouver les blocks permettant de faire automatiquement une interpolation de la force, du temps ou autre, aux pas de temps images ?

Merci d'avance,
Rian

@WeisLeDocto WeisLeDocto self-assigned this Feb 21, 2024
@WeisLeDocto WeisLeDocto transferred this issue from LaboratoireMecaniqueLille/1000NCustomTestMachine Feb 21, 2024
@WeisLeDocto
Copy link
Member

WeisLeDocto commented Feb 21, 2024

Bonjour Rian,

serait-il possible d'avoir quelque chose comme:
(image_%4.4d, nb_image), e.g. image_0001.tiff

On m'a déjà remonté ce problème, il sera réglé dans la prochaine release de Crappy (2.0.5).
Le format envisagé est le suivant (en notation f-string): f'{nr:06d}_{t:.3f}.tiff'. L'information temporelle est importante pour les essais où l'acqusition d'images ne se fait pas à intervalles réguliers, et où deux images consécutives peuvent être distantes dans les temps.

Dans la version 2.0, j'ai supprimé la possibilité pour les utilisateurs de choisir le nom des images (possibilité présente en 1.5). Je ne pense pas la rétablir tel qu'elle existait (l'utilisateur fournit une str formattée).
Eventuellement, la possibilité pour l'utilisateur de renseigner une fonction (qu'il crée lui-même) prenant en entrée le temps et l'index et retournant la str dans le format souhaité est envisageable. Je pensais garder ça pour un futur Camera Block plus avancé (todo #61), le Camera Block actuel de base a déjà beaucoup d'options.

Tu peux utiliser ce code pour renommer tes images en attendant :

# coding: utf-8

from pathlib import Path
from shutil import move
import argparse
from re import fullmatch

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument('src', type=Path, nargs=1)
    parser.add_argument('dst', type=Path, nargs=1)
    args = parser.parse_args()

    source = args.src[0]
    destination = args.dst[0]

    for img in source.glob('*.tiff'):
        i, = fullmatch(r'(\d+)_\d+\.\d+\.tiff', img.name).groups()
        move(img, img.parent / f'image_{int(i):04d}.tiff')

Usage (le dossier source peut être le même que destination):

python rename.py chemin_du_dossier_source chemin_du_dossier_destination


Par ailleurs ou puis-je trouver les blocks permettant de faire automatiquement une interpolation de la force, du temps ou autre, aux pas de temps images ?

Je n'avais jamais envisagé ce besoin auparavant, c'est vrai que ce serait pas mal. Habituellement, le Block Multiplexer permet de synchroniser plusieurs signaux dans une même base de temps. Ca fonctionne si le traitement d'images est effectué par Crappy, puisqu'il y a des valeurs de sortie à synchroniser. Mais dans le cas du Camera Block de base qui ne fait qu'acquérir des images il n'y a pas de sortie.

C'est toujours possible de régler le Block Multiplexer pour interpoler les valeurs de force etc. à la même fréquence que l'acquisition d'images, mais il n'y aura pas de synchronisation avec l'acquisition à proprement parler. Seules les fréquences seront identiques, avec un déphasage possible. D'ailleurs quelle est la fréquence cible pour l'acquisition des images ? Ca joue beaucoup sur la possibilité même de faire quoi que ce soit de "synchronisé" en Python.

@rian44s
Copy link
Author

rian44s commented Feb 23, 2024 via email

@WeisLeDocto
Copy link
Member

WeisLeDocto commented Feb 23, 2024

Le Block Multiplexer tel qu'il existe actuellement donne la même importance à tous les labels à interpoler, et les interpole à une fréquence prédéfinie indépendemment de la fréquence d'acquisition réelle de chaque label.

Ce que toi tu voudrais c'est un équivalent mais qui prend un label comme référence, et interpole tous les autres sur la base de temps du label de référence. Ce n'est pas possible en l'état.

Ce n'est pas difficile à implémenter, et je trouve l'idée intéressante et utile. Je pense que ça mérite un autre Block, intégrer ça en option dans le Multiplexer risque de ne pas être clair. Une idée de nom pour ce nouveau Block ? crappy.blocks.Synchronizer ? @jeffwitz

Dans tous les cas il te manque deux choses:

  • Le nouveau Block dont on parle là
  • Le fait que crappy.blocks.Camera renvoie un signal de sortie à chaque image acquise, pour pouvoir indiquer aux autres Blocks à quels instants il y a eu acquisition. Ce deuxième point mérite un peu plus de réflexion, notamment voir s'il faut envoyer un signal à chaque acquition et/ou chaque sauvegarde, sous quelle forme, etc. Aussi, il y a un peu de travail pour concilier ça avec le signal que renvoient déjà les Blocks enfants de Camera (VideoExtenso, DISCorrel, etc.).

Je posterai des updates sur ce thread.

@WeisLeDocto
Copy link
Member

On m'a déjà remonté ce problème, il sera réglé dans la prochaine release de Crappy (2.0.5). Le format envisagé est le suivant (en notation f-string): f'{nr:06d}_{t:.3f}.tiff'.

Nouveau format de nom de fichier merged dans #104, toujours planifié pour la release 2.0.5 à venir.

Dans tous les cas il te manque deux choses:

Planifié aussi pour 2.0.5, développements à venir.

@WeisLeDocto
Copy link
Member

Dans tous les cas il te manque deux choses:

Le nouveau Block Synchronizer a été ajouté dans #108, et l'envoi de signaux de synchronisation à chaque sauvegarde d'image a été ajouté dans #107. Tout est donc en place pour effectuer des interpolations aux pas de temps images.

Tout ça figurera dans la release 2.0.5 de Crappy, à paraître aujourd'hui ou demain.

Exemple

Le script ci-dessous fonctionne pour moi en version de développement. Les images sont sauvegardées dans un dossier temporaire.

# coding: utf-8

import crappy
from tempfile import TemporaryDirectory

if __name__ == '__main__':

  temp_dir = TemporaryDirectory()
  temp_dir.__enter__()

  sig = crappy.blocks.Generator(({'type': 'Sine',
                                  'freq': 0.1,
                                  'amplitude': 2,
                                  'condition': 'delay=20'},),
                                cmd_label='signal',
                                freq=7)

  cam = crappy.blocks.Camera('FakeCamera',
                             config=True,
                             display_images=False,
                             save_images=True,
                             save_folder=temp_dir.name,
                             freq=10)

  sync = crappy.blocks.Synchronizer(reference_label='img_index',
                                    time_label='t(s)',
                                    labels_to_sync='signal',
                                    freq=5)

  graph = crappy.blocks.Grapher(('t(s)', 'signal'), interp=False)

  crappy.link(sig, sync)
  crappy.link(cam, sync)
  crappy.link(sync, graph)

  crappy.start()

  temp_dir.__exit__(None, None, None)

Je ferme cette issue puisque tous les points ont été résolus, tu peux la rouvrir si jamais tu recontres un problème sur un des aspects discutés.

@rian44s
Copy link
Author

rian44s commented Mar 8, 2024 via email

@WeisLeDocto
Copy link
Member

Je crois que tu ne peux pas joindre de fichiers via email, il faut soit que tu composes un message sur l'interface web et que tu y inclues ton code, soit que tu passes par un autre canal.
En tout cas là je n'ai pas accès à tes fichiers.

@WeisLeDocto
Copy link
Member

Extrait du fichier de log, et ça devrait aussi apparaître dans ton terminal :

Traceback (most recent call last):
  File "/home/rseghir/.local/lib/python3.10/site-packages/crappy/blocks/meta_block/block.py", line 802, in run
    self.prepare()
  File "/home/rseghir/.local/lib/python3.10/site-packages/crappy/blocks/ioblock.py", line 218, in prepare
    raise IOError('Error ! The IOBlock is neither an input nor an output !')
OSError: Error ! The IOBlock is neither an input nor an output !

Ton Block IOBlock n'a aucun Link entrant ou sortant. Je crois qu'il te manque juste crappy.link(load_cell, sync).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request User requests a new feature to be implemented help wanted
Projects
2 participants