Plugin d'effet vidéo OFX

De Wiki LOGre
Révision de 29 janvier 2016 à 21:55 par Yruama Lairba (discuter | contributions) (Réalisation)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher


Présentation

le but du projet est de créer des plugins vidéo pour le logiciel libre Natron. Ces plugins utilisent l'API Open FX et peuvent normalement aussi fonctionner avec d'autre logiciel compatible avec l'API, tel que Nuke ou Sony Vegas.

Liens et documentations

Produire un plugin Open FX à partir des examples (sous windows)

un plugin OFX est en fait une bibliothèque dynamique (*.dll pour windows) renommé en *.ofx et se trouvant dans une arborescence de répertoire. si on prend l'exemple d'un plugin qui n’appellerai invert on a la structure de fichier suivante :

  • un dossier racine invert.ofx.bundle
    • un sous dossier unique Contents
      • un sous dossier dont le nom dépend de la plateforme pour laquelle est compilé le plugin. Sous windows le nom est "Win" ou "Win32" si le plugin est 32 bits et "Win64" si le plugin est 64 bits
      • un sous dossier (falcutatif) Resources contenant des fichiers images (png, svg) permettant d'afficher des icônes dans le logiciel hôte.

Idées d'effets

Displacement Map ou Displacement Mapping (carte de déplacement)

Cet effet utilise 2 images en entrée, une image source et une image servant de carte de déplacement. le principe de base est de reproduire en sortie l'image source dont les pixels ont été déplacé en fonction de la carte de déplacement. J'avais commencé un prototype avec SDL, mais j'ai abandonné puisque j'ai découvert que c'est déjà fait dans les versions de développement de Natron grâce à l'effet "IDistort" du bundle openfx-misc.

PS : Je me demande pourquoi ils n'ont pas appelé leur effet "Displacement Map" puisque c'est le nom qui semble être le plus utilisé pour cet effet.

Edge Detection (détection de bord)

Le principe de cet effet est de produire en sortie les contour de l'image d'entrée. Sur le plan technique, on applique un filtre passe-haut sur l'image. Mathématiquement, on peut faire ça avec un produit de convolution. Je me suis arrêté au principe théorique puisque, dans les version de développement de Natron, j'ai découvert que l’effet "laplace" du bundle openfx-misc permettais déjà de faire un effets de contour.

PS : je trouve que "laplace" est un nom pas beaucoup explicite.

Déformations d'images ou Corrections optiques

Example : déformations/corrections grand angle, transformation/détransformation polaire, tourbillon, vague, drapeaux ... il y a d'énorme possibilité. On peut même imaginer des déformations finement personnalisable avec une grille de points qu'on déplace, un masque ou une 2ème image (cf Displacement Map). En générale, c'est toujours la même méthode avec les mêmes problématiques:

  • Modéliser et implémenter la fonction de "reverse mapping". L'idée c'est que pour connaitre la valeur d'un point de l'image de sortie on regarde où il se trouvait sur l'image d'entrée, avant d'appliquer la transformation. En gros la fonction de "reverse mapping" est la transformation inverse de l'effet qu'on veux réaliser. Étrange non ?
  • Estimer la valeur d'un pixel. Lorsque qu'on applique la transformation inverse sur le pixel de sortie, on tombe rarement exactement sur un pixel d'entré. Pour estimer sa valeur on utilise les pixels les plus proches :
    • plus proche voisin : on regarde le pixel le plus proche et on applique la même valeur au pixel de sortie. => très rapide mais très moche, produit des rectangle sur l'image de sorti.
    • interpolation bilinéaire : pour le détails mathématique, voir wikipédia, grosso merdo, cela revient à faire la moyenne des valeurs des 4 pixels les plus proche, chaque valeur étant pondéré en fonction de sa promise cuité proximités. =>une des méthodes les plus utilisée pour son compromis qualité/rapidité.
    • ...
  • Réduire "l'aliasing". les effets d'aliasing se produisent lorsque, sur une image avec beaucoup de détails, 2 pixel adjacent de l'image de sortie correspondent à des points très éloignés de l'image d'entrée. Sur une vidéo, cela peut produire des effets de scintillement pas forcement agréable. Ceux qui connaissent le traitement du signal auront compris (ou pas) qu'il s’agit d'un problème lié au théorème d'échantillonnage de Nyquist-Shannon. Les solutions les plus utilisée sont à base de mipmap.

Réalisation

J'ai finalement réalisé un plugin générant 3 types bruits fractal animable, en m'appuyant sur la bibliothèque libnoise. Le plugin contient 3 effets : Billow, Perlin et RidgedMulti. Du point de vue utilisateur l'animation se fait principalement en modifiant légèrement à chaque image le paramètre "evolution". En interne, j'utilise les générateurs billow, perlin et ridgedmulti de la bibliothèque libnoise. Ces générateurs définissent des fonctions bruit sur 3 dimensions : je me sert des 2 premières dimensions pour faire un bruit 2D, et la troisième dimension sert à faire l'animation.

Le projet est hébergé sur github à l'adresse https://github.com/YruamaLairba/openfx-yru

Voici à quoi ressemble les bruits générés :

Et voici un bruit de perlin animé :